2.6 KiB
Tutorial 0E - Kezdeti memória lemez
Sok OS használ kezdeti memória lemezt (initrd) hogy fájlokat töltsön be induláskor. Szükségét éreztem egy ilyen oktatóanyagnak, mivel a legtöbb hobby OS fejlesztőnek fingja sincs, hogy kell ezt rendesen csinálni.
Először is, nem fogjuk újra feltalálni a spanyol viaszt és kiagyalni egy új formátumot, amihez aztán egy
szörnyű kreátor programot heggesztünk. Helyette a POSIX szabvány tar
archíválót fogjuk használni. A formátuma
pofonegyszerű, először jön egy 512 bájtos fejléc a fájl adataival, majd ezt követi a fájl tartalma nullákkal
kiegészítve, hogy a hossza 512-vel osztható legyen. Ez ismétlődik minden egyes fájlra az archívban.
Ha szeretnél tömörített initrd-t, akkor javaslom például a tinf könyvtárat
a kicsomagoláshoz. A kitömörített adatot az itt ismertetett módszerrel olvashatod.
Másodszor, a betöltéshez több lehetőségünk is van:
Betöltjük a fájlt saját magunk
Ehhez használhatod a fat_readfile()
funkciót az előző oktatóanyagból. Ebben az esetben az initrd címét visszaadja
a függvény.
Megkéred a GPU-t hogy töltse be neked
Aztán használhatod a config.txt
-t hogy utasítsd a start.elf-et az initrd betöltésére. Ez azért jó, mert ehhez
nem kell SD kártya olvasó és FAT értelmező, így a kerneled jóval kissebb lesz. Ami a
config.txt parancsait illeti,
két lehetőséged is van:
initramfs (fájlnév) followkernel
- ez betölti a (fájlnév) nevű fájlt mindjárt a kerneled után. Az initrd-d kezdőcíme
ekkor a &_end cimke lesz, amit a linker szkriptben definiáltunk.
initramfs (fájlnév) (cím)
- a megadott címre tölti be a (fájlnév) nevű fájlt. A kezdőcíme ekkor (cím) lesz.
Statikus linkelés
Nem túl praktikus, mivel mindig újra kell fordítani a kernelt, ha változtatni akarsz az initrd tartalmán. Azonban ez a legegyszerűbb módszer, és hogy átlátható legyen az oktatóanyag, ezért ezt választottam. Az initrd-d kezdőcímét ez esetben a _binary_initrd_tar_start cimke szolgáltatja.
Makefile
Hozzáadtam egy tar.o létrehozó szabályt a Makefile-hoz. Ez dinamikusan legenerálja a tar-t, majd object fájllá konvertálja.
Initrd.h, initrd.c
initrd_list(buf)
kilistázza a bufferben lévő tar archív tartalmát.
Main
Inicializáljuk a konzolt, majd átadjuk az initrd kezdőcímét a listázónak.