You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
3.0 KiB
Markdown
61 lines
3.0 KiB
Markdown
7 years ago
|
Oktatóanyag 0E - Kezdeti memória lemez
|
||
|
======================================
|
||
7 years ago
|
|
||
|
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
|
||
7 years ago
|
szörnyű kreátor programot heggesztünk. Helyette a POSIX szabvány `tar` archíválót és a `cpio` parancsot
|
||
|
fogjuk használni. Előbbi egyértelműbb, utúbbit a Linux is használja.
|
||
|
|
||
|
A tar 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.
|
||
|
|
||
|
A cpio nagyon hasonló, csak változó hosszúságú fejléccel operál, és nincs a fájl tartalma kiegészítve.
|
||
|
|
||
7 years ago
|
Ha szeretnél tömörített initrd-t, akkor javaslom például a [tinf](https://bitbucket.org/jibsen/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
|
||
7 years ago
|
[config.txt](https://www.raspberrypi.org/documentation/configuration/config-txt/boot.md) parancsait illeti,
|
||
7 years ago
|
két lehetőséged is van:
|
||
|
|
||
7 years ago
|
`ramfsfile=(fájlnév)` - ez betölti a (fájlnév) nevű fájlt mindjárt a kerneled után. Az initrd-d kezdőcíme
|
||
7 years ago
|
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
|
||
7 years ago
|
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_ramdisk_start* cimke szolgáltatja.
|
||
7 years ago
|
|
||
|
Makefile
|
||
|
--------
|
||
7 years ago
|
Hozzáadtam egy rd.o-t létrehozó szabályt, ami object fájllá konvertálja az archívot. Ezen kívül lett két
|
||
|
új szabály:
|
||
|
|
||
|
`make tar` ami *tar* formátumban hozza létre az archívumot
|
||
|
|
||
|
`make cpio` ami pedig *cpio hpodc* formátumot használ.
|
||
|
|
||
|
Ezért amikor fordítani szeretnél, vagy a `make tar all`, vagy a `make cpio all` parancsot kell használnod.
|
||
7 years ago
|
|
||
|
Initrd.h, initrd.c
|
||
|
------------------
|
||
|
|
||
7 years ago
|
`initrd_list(buf)` kilistázza a bufferben lévő archív tartalmát. A formátumát automatikusan detektálja.
|
||
7 years ago
|
|
||
|
Main
|
||
|
----
|
||
|
|
||
|
Inicializáljuk a konzolt, majd átadjuk az initrd kezdőcímét a listázónak.
|