Boottavan CD:n rakentaminen
Tälle sivulle on koottu apuja, huomioita ja muuta sen sellaista sälää ynnä ohjeistusta ikuomien boottaavien CD-ROMien tekoon. Informaatio on kerätty mistä kulloinkin, ja lähdeviitteitä pyritään sohimaan sitä mukaa kun siltä tuntuu, ja muisti antaa periksi.
Aihepiiri on allekirjoittaneellekin suhteellisen uusi, joten asiavirheitä sopii sähköpostitse korjailla, mikäli jotain äärimmäisen virheellistä pomppii silmille.
CD-ROM-standardit
CD-ROMien yksi yleisimmistä tiedostojärjestelmistä on ECMAn ylläpitämä ISO-9660 -standardi.
-
ECMA-119 (Volume and File Structure of CD-ROM for Information Exchange) ISO-9660, Adobe Acrobat PDF, 320Kt
Koko boottaavan touhun taustalla taas on Phoenixin ja IBM:n kehittämä ISO-9660:n lisuke, koodinimeltään "El Torito".
-
El Torito (Bootable CD-ROM Format Specification), Adobe Acrobat PDF, 72Kt
Tätä standardia toteuttavat sitten eri laitevalmistajat uudemmissa BIOSseissaan kuka mitenkin. Käytännössä on havaittu, että yleisesti kaikki nykyiset laitevalmistajat toteuttavat El Toritoa - yhdellä poikkeuksella:
Yleisesti ns. merkkikoneet (Compaq, IBM, Dell ja niin edelleen) EIVÄT tue CD-ROMeja jotka on rakennettu multiboot-levyiksi (sisältävät Boot Catalogin jossa on useampia Default/Initial Entryjä).
Edellämainittujen valmistajien koneet suostuvat näkemään (ja boottaavatkin) multiboot-cd:n ensimmäiseltä bootsektorilta - mutta eivät esitä käyttäjälle valikkoa halutusta bootsektorista. Asus, Abit, Soltek, Quantum ja muut vastaavat emolevyt näyttävät multibootvalikon, josta käyttäjä voi valita halutun boot entryn.
Tässä selostuksessa lainaamme edellämainittua paperia sieltä täältä, joten välttämätöntä paperin lukeminen ei ole.
No miten se noin periaatteessa toimii?
Kaiken lähtökohtana on, että järjestelmän BIOS tunnistaa CD:n boottaavaksi (tämä tapahtuu kiinteästi tietyllä CD:n sektorilla olevan tunnistemerkkijonon avulla), päättää erillisen levyltä löytyvän sektion avulla missä kohden levyä on boottikoodi joka levyltä keskusmuistiin ladataan - ja siinä se.
Ettei itse asia olisi liian yksinkertainen, voi järjestelmä bootata CD:ltä useallakin eri mekanismilla. CD voi emuloida bootin aikana levykettä (1.2Mt, 1.4Mt tai 2.88Mt) tai kovalevyä (max. 650Mt). CD:ltä voidaan bootata myös ilman emulaatiota. Jälkimmäinen on mm. NT-asennuslevyjen tapa.
Boot Volume Record Descriptor
Tutummin "Boot Record". Tästä se lähtee. Boot Record (sikäli kun levyllä sellainen on) sijaitsee ISO-9660-standardia toteuttavilla CD-levyillä aina sektorilla 11h (h niinkuin heksa). CD:n sektorikoon ollessa 800h, löytyy CD:n Boot Record AINA osoitteesta 8800h.
Jos näppärästi kaivamme raakaimagen satunnaisesti valitusta CD-levystä pöydältä ja kurkistamme sen sisään heksaeditorilla, näyttää kyseisessä offsetissa tältä:

No mitä tämä kaikki tarkoittaa? El Torito-paperi kertoo meille seuraavaa (vaikkakin Boot Recordin määritys sinänsä kuuluukin ISO-standardiin):
-
Ensimmäinen tavu on nimeltään Boot Record Indicator. Boottavassa CD:ssä sen pitää olla nolla (0). Tässä levyssä näyttää olevan 1 - joten tämä CD ei ole boottaava. Harvemmin se Total Annihilation on kyllä bootannutkaan, joten oikein meni. (ISO-9660 sanoo että ensimmäinen tavu on nimeltään Volume Descriptor Type - ja nolla tarkoittaisi että kaikki jatkossa on osa Boot Recordia. Ykkönen tarkoittaa Primary Volume Descriptoria - siis suhteellisen tavanomainen partitiotaulukko.)
-
seuraavat viisi tavua ovat ns. ISO-9660 Identifier. Näissä tavuissa pitää lukea tunnistemerkkijono "CD001". Kuten näyttää olevankin.
-
seitsemäs tavu levyllä on Boot Recordin versionumero. Sen pitää olla 1. Kuten onkin.
-
seuraavat tavut aina tavuun 39 saakka sisältävät Boot System Identifierin - mutta siellä onkin ensin nolla, ja sitten pelkkää välilyöntiä, kun boottaavassa levyssä pitäisi lukea teksti "EL TORITO SPECIFICATION". (Tämä johtuu siitä, että kyseessä ei olekaan Boot Record, vaan edellämainittu Primary Volume Descriptor. Offsetissa 7f oleva tavu on merkitty ISO-9660:ssa käyttämättömäksi, seuraavat 32 tavua taas ovat System Identifier ja niin edelleen. Jos aihe kiinnostaa, löytyy Primary Volume Descriptorin tarkempi kuvaus dokumentin alussa mainitusta IS0-9660 -paperista.)
Otetaanpa oikeasti boottaava CD ja katsotaanpa sen Boot Recordia:
-
Ensimmäinen tavu on nolla. kuten pitikin. ISO-9660 Identifier:kin näyttää olevan paikallaan. Versionumerokin on 1.
-
Seuraavat tavut aina offsetista 7h offsettiin 26h (Boot System Identifier) sisältävät tunnistemerkkijonon "EL TORITO SPECIFICATION", ja loput tavut on täytetty nollilla.
-
Offsetista 27h aina offsettiin 46h on käyttämätön alue, jonka sisällä pitää olla nollia.
-
Offsetissa 47h alkaa tapahtua (neljäs rivi, seitsemäs luku). Tässä osoitteessa on nelitavuinen absoluuttinen osoite (DWORD, Double Word). Osoite kertoo CD-levyn sektorinumeron jossa levyn Boot Catalog asuu.
Esimerkissä näkyy että levyn Boot Catalog on sektorilla 13h. Luku ilmaistaan niin että osoitteen tavut ovat "väärinpäin". Oliko tämä tarpeeksi sekavasti ilmaistu? :) Juoni on seuraava:
Offsetissa lukee "13 00 00 00"
joka tarkoittaa että Boot Catalog on sektorissa numero "00 00 00 13". Kun muistamme että CD:n yksi sektori on 800h tavua, alkaa Boot Catalog tämän levyn ollessa kyseessä näin ollen osoitteesta 800h kertaa 13h = 9800h.
No mikä ihmeen Boot Catalog?
Boot Catalog yksinkertaisesti ilmaistuna on luettelo levyllä jossain asuvista boottikelpoisista imageista.
-
Jos levyllä on vain yksi boottikelpoinen image, on Boot Catalogissa yksi imagea vastaava entry. Jos boottikelpoisia imageja on monta, on Boot Catalogissa useampi entry.
-
Kukin entry, edustipa se mitä tyyppiä tahansa, on kooltaan 32 tavua. (20h).
-
Kukin entry kertoo boottaavan imagen sektoriosoitteen itse levyllä, ja sen minkätyyppinen image (levyke-emulaatio, kovalevyemulaatio, ei emulaatiota) on kyseessä.
Boot Catalogissa on periaatteessa vähintään kaksi entryä:
-
Validation Entry. Tämä kertoo BIOSsille että levy todellakin on boottikelpoinen.
-
Default/Initial Entry. Näitä voi olla yksi tai useampia - ne sisältävät kunkin boottikelpoisen imagen tiedot ja osoitteet.
Boot Catalog voi näiden kahden lisäksi sisältää Section Header:in ja useita Section Entryjä - mutta todellisuudessa näiden käyttötarkoitus on tarjota esim. BIOSsille automaattinen mahdollisuus valita vaikkapa bootti-image kieliasetusten perusteella - todellisuudessa kukaan ei käytä näitä, joten ne voi unohtaa.
Katsotaanpa edellälaskettua osoitetta (9800h) levyltä.

Validation Entry
El Torito-speksin mukaan alussa pitäisi siis olla 32 tavun mittainen Validation Entry. Ja jotain siellä kahdella ensimmäisellä rivillä näyttää olevankin. Speksi sanoo että:
-
Ensimmäinen tavu on Header ID, must be 1. Niinpä näyttää olevan.
-
toinen tavu on Platform ID. Nolla tarkoittaa 80x86 (Intel), yksi olisi PowerPC ja kaksi Mac. Nolla on, joten kone on Intel-pohjainen.
-
seuraavat kaksi tavua on varattu, niiden pitää olla nolla. Kuten ovatkin.
-
offsetista 4 offsettiin 1B ulottuu ns. ID String. Valmistajakohtainen merkkijono. Kyseisessä CD:ssä lukee "Arnes Boot Record" ja loput paikat on täytetty nollilla.
-
offsetissa 1C ja 1D on tarkistussumma. Ideana on että kun koko entryn sanat lasketaan yhteen, pitää lopputuloksen olla nolla.
-
offsetissa 1E ja 1F on vakioidut tavut 55h ja AAh. Nämä lukevat kiinteästi El Torito-speksissä. Luvut lasketaan mukaan tarkistussummaa laskettaessa.
Default/Initial Entry
Validation entryn jälkeen pitäisi seurata vähintään yksi, jollei useampiakin 32 tavun mittaisia Default/Initial Entryjä. Edellisessä kuvassa näyttää siltä, että siellä on yksi (offsetissa 9820h on selkeästi jotain, mutta siitä 32 tavua eteenpäin, offsetissa 9840h on vain nollaa.)
Mitäpä Default/Initial Entry sitten pitää sisällään?
-
Ensimmäinen tavu (offset nolla, 0) julistaa että tämän entryn osoittama boot image jossain on joko Bootable (88h) tai Not Bootable (0h). Kaikesta päätellen se on boottikelpoinen.
-
Toinen tavu kertoo entryn osoittaman bootti-imagen emulaatiotyypin. Arvo 2 kertoo sen olevan levykettä (1.44Mt) emuloiva image. Muut mahdolliset arvot ovat 0 (No Emulation), 1 (1.2Mt levyke), 3 (2.88Mt levyke) tai 4 (Hard Disk type 80)
-
Seuraavat kaksi tavua kertovat mihin ram-muistin osoitteeseen kyseinen boot image tulisi ladata. Mikäli arvo on 00, lataa BIOS imagen oletusosoitteeseen 07C0h. Levyntekijä on tässä varmistellut, tavuissa lukee C0 07, ja kun muistamme että tavut pitää lukea väärinpäin, on arvo näin ollen... 07C0h. Joka olisi siis oletusarvo muutenkin.
-
Seuraava tavu offsetissa 4h on nimeltään System Type. Tämän pitää olla sama kuin varsinaisen boot imagen sisältämän partitiotaulun System Type-tavun. Tästä lisää myöhemmin, kun pääsemme itse boot imageen käsiksi.
-
Tavu offsetissa 5h on käyttämätön.
-
Offsetissa 6h ja 7h kerrotaan kuinka monta sektoria BIOSsin tulisi lukea levyltä boot imagen luvussa - ts. kuinka suuri boot image on. Tyypillisesti emuloiduissa imageissa koko on 1 - mutta esim. NT:n bootissa (joka EI ole emuloitu) luetaan levyltä 4 sektoria.
-
Offset 8h ja 9h sisältävät Load RBA:n. Eli sen sektorinumeron, jossa se boot image OIKEASTI on tällä CD-levyllä. Tässä tapauksessa levyke-emuloitu imagemme näyttää löytyvän sektorinumerosta 001Ah, joka jälleen käännettynä absoluuttiseksi offsetiksi itse levyllä on D000h (800h kertaa 1A).
Nyt tiedämme missä oikea boot image levyllä asustaa. Käydäänpä katsomassa miltä siellä näyttää.

Kappas. Kovasti kuhinaa, ja hetken kovasti konekoodin näköisen hässäkän jälkeen tutunomaisia MS-DOS-fraaseja. Joten kuten arvata saattaa, oli tämä boottaava CD siis tehty MS-DOS-tyyppisestä boottikorpusta.
No mutta kuinka tälläisen sitten tekee itse?
Helposti. :)
Hyvin yksinkertaistettu esimerkki siitä miten edellämainittu boottaava CD tehdään käsin:
-
Luodaan sopiva boot image. Otetaan esim. MS-DOS-boottikorppu, ja luetaan se kokonaisuudessaan sopivalla apuohjelmalla yhteen tiedostoon. Käytämme tässä tiedostosta esimerkin vuoksi nimeä MSDOS.BIN.
-
Syntynyt tiedosto laitetaan osaksi CD-ROMia (tehdään CD-polttosoftalla ISO Image jossa edellämainittu MSDOS.BIN on osana. Levyllä saa olla tietenkin mitä tahansa muutakin krääsää).
-
Kun ISO Image on luotu mielellään kovalevylle (eikä poltettu tässä vaiheessa vielä rommille), etsitään MSDOS.BIN:in oikea alkuosoite imagen seasta. Jaetaan offset 800:lla, saadaan boot imagen alkusektori.
-
Editoidaan imagelle sopiva Boot Catalog - kirjoitetaan sinne siis Validation Entry ja Default/Initial Entry vaikkapa heksaeditorilla jolleivät valmiit apuohjelmat kelpaa. Edellä löydetty boot imagen alkusektorin numero laitetaan Default/initial Entryyn.
-
Lisätään Boot Recordiin (Boot Volume Record Descriptor) El-torito- tunniste ja Boot Catalogin sektorinumero.
Siinä se - sen pitäisi bootata. Kaikkeen edellämainittuun toimintaan on tosin olemassa näppäriä, ilmaisia apuohjelmia, joten heksaeditointi ei ole välttämätöntä.