2019-03-14 21:48:34 -04:00
BOOTBOOT Referencia implementációk
==================================
Előre lefordított binárisok mellékelve, egyből használhatók.
1. *x86_64-efi* a preferált indítási mód x86_64-en.
Szabvány GNU eszköztár plusz néhány fájl a gnuefi-ből (mellékelve).
2020-09-17 16:36:06 -04:00
[bootboot.efi ](https://gitlab.com/bztsrc/bootboot/raw/master/dist/bootboot.efi ) (100k), [bootboot.rom ](https://gitlab.com/bztsrc/bootboot/raw/master/dist/bootboot.rom ) (100k)
2019-03-14 21:48:34 -04:00
2. *x86_64-bios* BIOS, Multiboot (GRUB), El Torito (CDROM), bővítő ROM és Linux boot kompatíbilis, RÉGI betöltő.
Ha újra akarod fordítani, szükséged lesz a fasm-ra (nincs mellékelve).
2020-06-24 10:33:08 -04:00
[boot.bin ](https://gitlab.com/bztsrc/bootboot/raw/master/dist/boot.bin ) (512 bájt, egyszerre MBR, VBR és CDROM indító szektor), [bootboot.bin ](https://gitlab.com/bztsrc/bootboot/raw/master/dist/bootboot.bin ) (11k, a boot.bin tölti be, valamint BBS bővítő ROM és Multiboot kompatíbilis is)
2019-03-14 21:48:34 -04:00
2020-02-26 06:54:20 -05:00
3. *aarch64-rpi* ARMv8 betöltő Raspberry Pi 3-hoz, 4-hez
2020-06-24 10:33:08 -04:00
[bootboot.img ](https://gitlab.com/bztsrc/bootboot/raw/master/dist/bootboot.img ) (34k)
2019-03-14 21:48:34 -04:00
2021-01-17 16:31:22 -05:00
4. *mykernel* egy példa BOOTBOOT [kompatíbilis kernel ](https://gitlab.com/bztsrc/bootboot/tree/binaries/mykernel ) (forrás elérhető [C ](https://gitlab.com/bztsrc/bootboot/tree/master/mykernel/c )-ben, [C++ ](https://gitlab.com/bztsrc/bootboot/tree/master/mykernel/cpp )-ban, [Pascal ](https://gitlab.com/bztsrc/bootboot/tree/master/mykernel/pas )-ban, [Adá ](https://gitlab.com/bztsrc/bootboot/tree/master/mykernel/ada )-ban, [Rust ](https://gitlab.com/bztsrc/bootboot/tree/master/mykernel/rust )-ban és [Go ](https://gitlab.com/bztsrc/bootboot/tree/master/mykernel/go )-ban), ami vonalakat húz meg színes dobozokat rajzol
2019-03-14 21:48:34 -04:00
2020-12-17 07:05:32 -05:00
5. *mkbootimg* minden az egyben, multiplatform [bootolható lemezkép készítő ](https://gitlab.com/bztsrc/bootboot/tree/binaries ) (Windows, MacOSX, Linux).
2020-06-18 05:17:49 -04:00
2020-09-24 10:48:57 -04:00
BOOTBOOT lefordítható [coreboot ](https://gitlab.com/bztsrc/bootboot/tree/master/x86_64-cb ) payloadként is, lásd *x86_64-cb*
és *aarch64-cb* , de mivel ezek szorosan kapcsolódnak a libpayload-hoz, nincs belőlük előre fordított bináris.
2020-06-15 21:35:19 -04:00
Vedd figyelembe, hogy nem minden referencia implementáció támogatja a teljes 2-es protokollt, az x86_64-bios csak statikus
memórialeképezéseket kezel, ami az 1-es protokoll szintnek felel meg.
2019-03-14 21:48:34 -04:00
2020-09-29 09:06:37 -04:00
Gyors kipróbáláshoz találsz bootolható képfájlokat az [images ](https://gitlab.com/bztsrc/bootboot/tree/binaries/images ) mappában.
2020-01-11 14:45:18 -05:00
2019-03-14 21:48:34 -04:00
BOOTBOOT Protokoll
==================
2020-06-15 11:11:59 -04:00
Lényege
-------
2019-03-14 21:48:34 -04:00
2020-06-15 11:11:59 -04:00
A protokoll definiálja, hogyan kell betölteni ELF64 vagy PE32+ futtathatókat egy induló memórialemezről tisztán
64 bites módban, mindenféle konfiguráció vagy akár a memórialemezkép formátumának ismerete nélkül.
2019-03-14 21:48:34 -04:00
A [BIOS ](https://gitlab.com/bztsrc/bootboot/tree/master/x86_64-bios )-t támogató gépeken ugyanaz a betöltő működik
Multiboottal, láncbetöltéssel MBR, VBR (GPT hibrid indítás) és CDROM indító szektorból, vagy BIOS bővítő ROM-ból
(szóval nemcsak a ramlemez lehet a ROM-ban, de maga a betöltő is).
Az [UEFI gépek ](https://gitlab.com/bztsrc/bootboot/tree/master/x86_64-efi )en egy szabványos OS Loader alkalmazás.
2020-02-26 06:54:20 -05:00
A [Raspberry Pi 3+ ](https://gitlab.com/bztsrc/bootboot/tree/master/aarch64-rpi ) gépen a bootboot.img-t a start.elf
2019-03-14 22:07:08 -04:00
tölti be kernel8.img néven az SD kártya első partíciójáról.
2019-03-14 21:48:34 -04:00
A különbség más betöltő protokollokhoz képest a rugalmasság és a hordozhatóság; a tisztán 64 bit támogatás; és hogy
2020-06-15 11:11:59 -04:00
a BOOTBOOT a kernel-t a memórialemezképből tölti be. Ez ideális hobbi OS-ek és mikrokernelek számára. Ez biztosítja, hogy
a kerneled felbontható több fájlra, mégis megadja azt az előnyt, hogy egyszerre tölti be mindet, mintha egy monolitikus
2019-03-14 21:48:34 -04:00
kernel lenne. Ráadásul mindehhez a saját fájl rendszeredet is használhatod.
Megjegyzés: a BOOTBOOT nem egy boot menedzser, hanem egy boot protokoll. Ha interaktív indítómenüt szeretnél, akkor
azt a BOOTBOOT kompatíbilis betöltő *elé* kell integrálnod. Például a GRUB lánctöltheti a boot.bin-t (vagy Multiboot
2020-06-15 11:11:59 -04:00
"kernel"-ként a bootboot.bin-t és modulként a memórialemezt) vagy a bootboot.efi hozzáadható az UEFI Boot menedzser menüjéhez.
2019-03-14 21:48:34 -04:00
2020-06-15 21:35:19 -04:00
Támogasd a fejlesztést adománnyal
---------------------------------
Ha tetszik, vagy hasznosnak találod, szívesen fogadok akármekkora adományt:< br >
< a href = "bitcoin:3G9vcV91S19fHMoBcmSksUpaxGPR5MUGCk" > < img src = "https://gitlab.com/bztsrc/bootboot/raw/master/donate.png" > < br > BTC 3G9vcV91S19fHMoBcmSksUpaxGPR5MUGCk< / a >
2019-03-14 21:48:34 -04:00
Licensz
-------
A BOOTBOOT Protokoll és a referencia implementációk mind szabad szoftverek és az MIT licensz feltételei szerint kerülnek
terjesztésre.
```
Copyright (C) 2017 bzt (bztsrc@gitlab)
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy,
modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
```
Szerzők
-------
efirom: Michael Brown
zlib: Mark Adler
tinflate: Joergen Ibsen
raspbootcom: (GPL) Goswin von Brederlow
2021-01-16 17:04:23 -05:00
mykernel/rust: Vinay Chandra
2020-06-15 21:39:44 -04:00
2019-03-14 21:48:34 -04:00
BOOTBOOT, FS/Z: bzt
Kifejezések
-----------
* _boot partíció_: az első indítható lemez első indítható partíciója, lehetőleg egy kissebb.
Nagy valószínűséggel egy EFI Rendszer Partció FAT fájl rendszerrel, de lehet akármi más is,
ha az adott partíció indítható (az attribútumoknál a 2. bit be van állítva).
* _környezeti fájl_: legfeljebb egy lap méretű, utf-8 [fájl ](https://gitlab.com/bztsrc/bootboot/blob/master/README.md#environment-file ) a boot partíción
`BOOTBOOT\CONFIG` néven (vagy ha a ramlemez az egész partíciót elfoglalja, akkor `/sys/config` ). Egyszerű
"kulcs=érték" párokat tartalmaz (újsor karakterrel elválasztva). A protokoll mindössze két
kulcsot definiál: "screen" a képernyő méretét adja meg, a "kernel" pedig a futtatható fájl nevét a ramlemezen.
* _initrd_: induló [ramlemez kép ](https://gitlab.com/bztsrc/bootboot/blob/master/README.md#installation )
(lehet ROM-ban vagy flash-en, vagy egy GPT boot partíción BOOTBOOT\INITRD néven, vagy kitöltheti az egész partíciót, de akár
2020-09-19 19:43:33 -04:00
hálózatról, soros vonalról vagy GRUB modulként is betöltehető). A formátuma és a holléte nincs meghatározva (a jó rész :-) ) és gzip tömörítést
2019-03-14 21:48:34 -04:00
is használhat.
* _betöltő_: (loader) egy natív futtatható a boot partíción vagy ROM-ban. Többarchitektúrás lemezeken több
betöltő implementáció is lehet egyszerre.
* _fájl rendszer meghajtó_: egy elkölönített funkció, ami az initrd-ben keresi meg a kernelt.
Ha nincs ilyen, akkor a legelső futtathatót tölti be az initrd-ről.
* _kernel fájl_: egy ELF64 / PE32+ [futtatható az initrd-ben ](https://gitlab.com/bztsrc/bootboot/tree/master/mykernel ),
opcionálisan a következő szimbólumokkal: `mmio` , `fb` , `environment` , `bootboot` (lásd gép állapot és linker szkript alább).
2020-06-24 10:33:08 -04:00
* _BOOTBOOT struktúra_: a [bootboot.h ](https://gitlab.com/bztsrc/bootboot/blob/master/dist/bootboot.h )-ban definiált struktúra.
2019-03-14 21:48:34 -04:00
Betöltés menete
---------------
1. a förmver megkeresi a betöltőt, betölti és elindítja.
2020-06-15 21:35:19 -04:00
2. a betöltő inicializálja a hardvert (64 bites többmagos mód, képernyőfelbontás, memória térkép stb.)
2019-03-14 21:48:34 -04:00
3. aztán betölti a környezeti fájlt és az initrd-t (valószínűleg a boot partícióról vagy ROM-ból).
4. sorra meghívja a fájl rendszer meghajtókat, hogy betöltse a kernelt az initrd-ről.
5. ha egyik meghajtó sem járt szerencsével, akkor megkeresi az első futtathatót az initrd-ben.
2019-03-14 22:07:08 -04:00
6. értelmezi a futtatható fejlécét és a szimbólumokat, hogy megtalálja a címeket (csak 2-es szintű betöltők).
2020-06-24 10:33:08 -04:00
7. ennek megfelelően leképezi a framebuffert, környezetet és a [bootboot struktúrá ](https://gitlab.com/bztsrc/bootboot/blob/master/dist/bootboot.h )t.
2019-03-14 21:48:34 -04:00
8. beállítja a vermet, regisztereket és a kernel belépési pontjára ugrik. Lásd [példa kernel ](https://gitlab.com/bztsrc/bootboot/tree/master/mykernel ).
Gép állapot
-----------
Amikor a kernel átveszi a vezérlést, a memória a következőket tartalmazza:
```
-128M "mmio" terület (0xFFFFFFFFF8000000)
-64M "fb" framebuffer (0xFFFFFFFFFC000000)
-2M "bootboot" struktúra (0xFFFFFFFFFFE00000)
-2M+1page "environment" sztring (0xFFFFFFFFFFE01000)
-2M+2page.. kód szegmens v (0xFFFFFFFFFFE02000)
..0 verem ^ (0x0000000000000000)
0-16G egy-az-egy leképzett RAM (0x0000000400000000)
```
Minden információ a linker által meghatározott címen kerül átadásra. Nincs szükség API-ra, ezért a BOOTBOOT Protokoll
teljesen architektúra és ABI független. Az 1-es szintet támogató betöltők a fent látható fix címeket használják, míg
a 2-es szintű betöltők a futtatható által definiált szimbólumokat használva állapítják meg a címeket.
2019-03-14 22:07:08 -04:00
A RAM (egészen 16G-ig) egy-az-egyben le van képezve a pozitív címtartományban. A soros vonali konzol 115200 baudra,
2019-03-14 21:48:34 -04:00
8 adatbittel, paritás nélkül és 1 stopbitre van felkonfigurálva. Megszakítások le vannak tiltva, a kód pedig felügyeleti
2020-06-15 21:35:19 -04:00
szinten (0-ás gyűrűn / EL1-n) fut.
2019-03-14 21:48:34 -04:00
2020-06-15 21:35:19 -04:00
A képernyű megfelelő felbontásra van állítva 32 bites pixelekkel, az `fb` szimbólum által jelölt, negatív címre leképezve.
2019-03-14 21:48:34 -04:00
Az 1-es szintű betöltők korlátozzák a képernyő méretét valahol 4096 x 4096 pixelnél (függ a szkensortól és a képaránytól is).
Ez több, mint elég az [Ultra HD 4K ](https://en.wikipedia.org/wiki/4K_resolution ) (3840 x 2160) felbontáshoz. A 2-es szintű
2020-06-15 21:35:19 -04:00
betöltők akárhova képesek leképezni az fb szimbólumot -1G és -2M között, ezért rájuk nem vonatkozik ez a megszorítás.
2019-03-14 21:48:34 -04:00
2020-06-24 10:33:08 -04:00
A fő információs [bootboot struktúra ](https://gitlab.com/bztsrc/bootboot/blob/master/dist/bootboot.h ) a `bootboot` szimbólumra
2019-03-14 21:48:34 -04:00
van leképezve. Ez áll egy fix 128 bájtos fejlécből, amit egy változó hosszúságú, de fix méretű rekordok követnek. Az initrd
(benne a további kernel modulokkal és szerverekkel) teljes egészében a memóriában van, és ezen struktúra *initrd_ptr* és
*initrd_size* mezői mutatnak rá. A framebuffer fizikai címe az *fb_ptr* mezőben található. Az *indulási rendszer idő* és
a platform független *memóriatérkép* szintén itt található.
2020-06-15 21:35:19 -04:00
A konfigurációs sztring (vagy parancssor, "command line" ha úgy tetszik) az `environment` szimbólumra van leképezve.
2019-03-14 21:48:34 -04:00
A kernel kód szegmense az ELF fejléc `p_vaddr` vagy a PE fejléc `code_base` mezői alapján kerülnek leképezésre (csak 2-es
szint). Az 1-es szintű betöltők mindig -2M-re töltik a kernelt, ezzel limitálva a teljes méretét 2M-re, beleértve a
2020-06-15 21:35:19 -04:00
konfigurációt, adatot, inicializálatlan adatterületet és a vermet. A 2. szint limitje 16M az adat, kód és bss szegmensre.
Ennek több, mint elégnek kell lennie bármilyen mikrokernel számára. Az inicializálatlan adatterület a text szegmens után jön,
felfelé növekszik, és a betöltő kinullázza.
2019-03-14 21:48:34 -04:00
A társprocesszor (lebegőpontos számtás) be van kapcsolva, és ha a Szimmetrikus Többmagos Feldolgozás (SMP) támogatott, akkor
minden CPU mag ugyanazt a kernel kódot hajtja végre egyszerre.
A verem a memória tetején található, 0-tól kezdve és lefelé növekszik. Minden magnak saját 1k-s verme van SMP rendszereken
(a 0-ás mag verme kezdődik 0-án, az 1-es magé -1024-nél stb.)
Környezeti fájl
----------------
A konfiguráció egy sorvége karakterekkel elhatárolt, nullával lezárt, "kulcs=érték" UTF-8 sztringként kerül átadásra a kernelnek.
```
// BOOTBOOT Opciók
// --- betöltő specifikus ---
// igényelt képernyő felbontás. ha nincs megadva, akkor detektált
screen=800x600
// elf vagy pe bináris az initrd-ben
kernel=sys/core
// --- kernel specifikus, ami csak tetszik ---
amitcsakakartok=érték
megintmas=be
valamiertek=100
valamicim=0xA0000
```
Ez nem lehet nagyobb a lapméretnél (4096 bájt). Az ideiglenes változók a végére kerülnek (az UEFI parancssorból).
C stílusű egy- és többsoros kommentek használhatók. A BOOTBOOT Protokoll csak a `screen` és a `kernel` kulcsokat
használja, az összes többi és az értékük formátuma a kerneleden (vagy az eszközmeghajtóidon) múlik. Légy kreatív :-)
Ha indítási probléma van, a konfiguráció módosításához át kell rakni a lemezt egy másik gépbe (vagy egy egyszerű oprendszert
indítani, mint a DOS) és megszerkeszteni a BOOTBOOT\CONFIG fájlt a boot partíción. UEFI alatt használható az EFI Shell által
nyújtott `edit` parancs, vagy a "kulcs=érték" párok a parancssorban is megadhatók (a parancsori kulcsok felülbírálják a fájlban
megadottakat).
Fájl rendszer meghajtók
-----------------------
A boot partíció fájl rendszer formátuma kívül esik a specifikáción: a BOOTBOOT Protokoll csak annyit vár el,
hogy a kompatíbilis betöltő valahonnan be tudja tölteni az initrd-t és a környezeti fájlt, de nem szabja meg, hogy
honnan és hogy hogyan. Lehet nvram-ban, ROM-ban, jöhet hálózatról például, nem számít.
Más részről az initrd ramlemezre vonatkozóan a BOOTBOOT definiál pontosan egy függvényt a kernel fájl megkeresésére,
de az ABI-t nem írja elő (ami architektúra specifikus úgyis). Ez a funkció kap egy mutatót a ramlemezre, és egyet a kernel
fájl nevére, és visszaadja a fájl első adatbájtjára a mutatót valamint a fájl méretét. Ha hiba volt (a fájl rendszert nem
ismerte fel, vagy a megadott nevű fájlt nem találta) akkor {NULL, 0}-t ad vissza. Ilyen egyszerű.
```c
typedef struct {
uint8_t *ptr;
uint64_t size;
} file_t;
file_t myfs_initrd(uint8_t *initrd, char *filename);
```
A protokoll elvárja, hogy a BOOTBOOT kompatíbilis betöltők végigmenjenek egy meghajtó listán, amíg valamelyik
érvényes választ nem ad. Ha mindegyik {NULL,0}-al tért vissza, akkor a betöltő bájtról bájtra megkeresi a legelső
2019-03-14 22:19:45 -04:00
ELF64 / PE32+ binárist az initrd-ben. Ez roppant hasznos, ha egyedi fájl rednszerünk van és még nem írtunk hozzá saját
meghajtót, vagy amikor az "initrd" egy statikusan linkelt futtatható, mint például a Minix. Csak bemásolod az initrd-t
a boot partícióra és már mehet is!
2019-03-14 21:48:34 -04:00
2019-03-14 22:19:45 -04:00
A BOOTBOOT Protokoll előírja, hogy a fájl rendszer meghajtók ([itt](https://gitlab.com/bztsrc/bootboot/blob/master/x86_64-efi/fs.h),
2020-09-16 22:41:14 -04:00
[itt ](https://gitlab.com/bztsrc/bootboot/blob/master/x86_64-bios/fs.inc ), [itt ](https://gitlab.com/bztsrc/bootboot/blob/master/aarch64-rpi/fs.h )
és [itt ](https://gitlab.com/bztsrc/bootboot/blob/master/x86_64-cb/fs.h )) elkülönítve legyenek a betöltő forrásának többi részétől.
Ez azért van, mert elsősorban azoknak a hobbi OS fejlesztőknek készült, akik saját fájl rendszert használnak.
2019-03-14 21:48:34 -04:00
A referencia implementációk támogatják a [cpio ](https://en.wikipedia.org/wiki/Cpio )-t (hpodc, newc és crc variáns),
az [ustar ](https://en.wikipedia.org/wiki/Tar_(computing ))-t, az osdev.org féle [SFS ](http://wiki.osdev.org/SFS )-t,
[James Molloy initrd formátumá ](http://www.jamesmolloy.co.uk/tutorial_html/8.-The%20VFS%20and%20the%20initrd.html )t
valamint az OS/Z natív [FS/Z ](https://gitlab.com/bztsrc/osz/blob/master/include/osZ/fsZ.h )-jét (utóbbit titkosítással is).
Az initrd-k gzippel tömörítettek is lehetnek, hogy kissebb lemezterületet foglaljanak (nem javasolt RPI3-on).
Példa kernel
------------
2021-01-16 17:13:17 -05:00
Egy [példa kernel ](https://gitlab.com/bztsrc/bootboot/blob/master/mykernel/c/kernel.c ) is lett mellékelve a BOOTBOOT Protokollhoz,
2019-03-14 21:48:34 -04:00
hogy bemutassa, miként lehet elérni a betöltő által nyújtott információkat:
```c
#include <bootboot.h>
/* importált virtuális címek, lásd linker szkript */
2020-08-28 13:18:34 -04:00
extern BOOTBOOT bootboot; // lásd bootboot.h
extern unsigned char environment[4096]; // konfiguráció, UTF-8 szöveg kulcs=érték párokkal
extern uint8_t fb; // lineáris framebuffer leképezés
2019-03-14 21:48:34 -04:00
void _start()
{
/*** FIGYELEM: ez a kód párhuzamosan fut minden processzormagon ** */
int x, y, s=bootboot.fb_scanline, w=bootboot.fb_width, h=bootboot.fb_height;
// célkereszt, hogy lássuk, a felbontás jó-e
for(y=0;y< h ; y ++) { *((uint32_t* )(& fb + s * y + ( w * 2 )))= 0x00FFFFFF ; }
for(x=0;x< w ; x ++) { *((uint32_t* )(& fb + s *( h / 2 )+ x * 4 ))= 0x00FFFFFF ; }
// piros, zöld és kék dobozok, ebben a sorrendben
for(y=0;y< 20 ; y ++) { for ( x = 0;x<20;x++) { *((uint32_t* )(& fb + s *( y + 20 ) + ( x + 20 )* 4 ))= 0x00FF0000 ; } }
for(y=0;y< 20 ; y ++) { for ( x = 0;x<20;x++) { *((uint32_t* )(& fb + s *( y + 20 ) + ( x + 50 )* 4 ))= 0x0000FF00 ; } }
for(y=0;y< 20 ; y ++) { for ( x = 0;x<20;x++) { *((uint32_t* )(& fb + s *( y + 20 ) + ( x + 80 )* 4 ))= 0x000000FF ; } }
// köszönünk
puts("Hello from a simple BOOTBOOT kernel");
// leállunk egyelőre
while(1);
}
```
2021-01-16 17:13:17 -05:00
A fordításhoz lásd a mellékelt példa kernel [Makefile ](https://gitlab.com/bztsrc/bootboot/blob/master/mykernel/c/Makefile )-ját és
[link.ld ](https://gitlab.com/bztsrc/bootboot/blob/master/mykernel/c/link.ld )-jét.
2019-03-14 21:48:34 -04:00
Mivel SMP rendszeren minden processzormag ezt a kódot futtatja, ezért valósznűleg valami ilyesmivel fogod kezdeni a kerneled:
```c
if (currentcoreid == bootboot.bspid) {
/* a bootstrap processzoron futtatandó dolgok */
} else {
/* alkalmazás processzor(ok)on futtatandó dolgok */
}
```
Az x86_64-on a 'currentcoreid' a Local Apic Id (cpuid[eax=1].ebx >> 24), míg AArch64-on ez az (mpidr_el1 & 3).
2020-11-02 13:21:07 -05:00
Mivel több hibabejelentés is érkezett az SMP kapcsán bugos gépek miatt, ezért az x86 betöltők megértik a `nosmp=1` környezeti
opciót is. Ha meg van adva, akkor csak egy mag indul el. Ez az opció el lesz távolítva, amint a problémákra lesz kerülőmegoldás,
és az SMP inicializálás megfelelően működik minden gépen.
2019-03-14 21:48:34 -04:00
Telepítés
---------
2020-09-29 09:20:15 -04:00
Az [images ](https://gitlab.com/bztsrc/bootboot/tree/binaries/images ) mappában találsz teszt képfájlokat.
2020-01-11 11:54:11 -05:00
2019-03-14 21:48:34 -04:00
1. Hozz létre egy initrd-t benne a kerneleddel. Példák:
```shell
mkdir -r tmp/sys
cp mykernel.x86_64.elf tmp/sys/core
# még több fájl másolása a tmp mappába
# lemezkép vagy csomagolt fájl létrehozása, pl használd ezek közül az egyik parancsot:
cd tmp
find . | cpio -H newc -o | gzip > ../INITRD
find . | cpio -H crc -o | gzip > ../INITRD
find . | cpio -H hpodc -o | gzip > ../INITRD
tar -czf ../INITRD *
mkfs ../INITRD .
```
2. Hozd létre az FS0:\BOOTBOOT könyvtárat a boot partíción, és másold be az előbb létrehozott initrd-t.
Ha akarsz, csinálhatsz egy CONFIG nevű szöveges fájlt is ide, és írd bele a konfigurációdat.
Ha nem a "sys/core" néven található a kerneled, akkor add meg a "kernel=" változóban itt.
Alternatívaként a tömörítetlen INITRD-t bemásolhatod az egész partícióra, csak a saját fájl rendszeredet használva, a FAT
fájl rednszert teljes egészében kihagyva. Csinálhatsz belőle egy bővító ROM-ot is (BIOS-on nincs sok hely, ~64-96k, de EFI-n
elmehetsz egészen 16M-ig).
3. másold be a BOOTBOOT betöltőt a boot partícióra.
3.1. *UEFI lemez* : másold a __bootboot.efi__ -t az **_FS0:\EFI\BOOT\BOOTX64.EFI_** -be.
3.2. *BIOS lemez* : másold a __bootboot.bin__ -t az **_FS0:\BOOTBOOT\LOADER_** -be.
2020-02-26 06:54:20 -05:00
3.3. *Raspberry Pi 3+* : másold a __bootboot.img__ -t az **_FS0:\KERNEL8.IMG_** -be.
2019-03-14 21:48:34 -04:00
**FONTOS**: olvasd el a kérdéses implementáció README.md-jét is.
Hibakeresés
-----------
```
BOOTBOOT-PANIC: LBA support not found
```
Nagyon régi hardver. A BIOSod nem támogatja az LBA-t. Ezt az üzenetet az első betöltő szektor (boot.bin) írja ki.
```
BOOTBOOT-PANIC: FS0:\BOOTBOOT\LOADER not found
```
A fő betöltő (bootboot.bin) nem található a lemezen, vagy az induló szektorcíme nincs jól rögzítve az indítószektor 32 bites
2020-01-11 11:54:11 -05:00
[0x1B0] címén (lásd [mkboot ](https://gitlab.com/bztsrc/bootboot/blob/master/x86_64-bios/mkboot.c )). Mivel a betöltő szektor
2019-03-14 21:48:34 -04:00
támogatja a RAID tükröket, több meghajtóról is meg fogja próbálni betölteni a betöltőt. Ezt az üzenetet az első betöltő szektor
(boot.bin) írja ki.
```
BOOTBOOT-PANIC: Hardware not supported
```
Nagyon régi hardver. Az x86_64-en azt jelenti, a CPU család régebbi, mint 6.0, illetve nincs a PAE, az MSR vagy az LME támogatva.
AArch64-en azt jelenti, hogy az MMU nem kezeli a 4k-s lapméretet vagy legalább 36 bites címteret.
```
BOOTBOOT-PANIC: Unable to initialize SDHC card
```
2020-06-16 11:09:13 -04:00
A betöltő nem tudta inicializálni az EMMC-t SD kártya olvasáshoz, valószínűleg hardver hiba vagy régi kártya.
2019-03-14 21:48:34 -04:00
2020-01-11 11:54:11 -05:00
```
BOOTBOOT-PANIC: No GPT found
```
Nem található a lemezen GUID Partíciós Tábla.
2019-03-14 21:48:34 -04:00
```
BOOTBOOT-PANIC: No boot partition
```
Vagy a lemezen nincs GPT, vagy nincs benne EFI Rendszer partíció se egyéb indítható partíció. Vagy az azon lévő FAT
fájl rendszer sérült, illetve nincs benne BOOTBOOT könyvtár.
```
BOOTBOOT-PANIC: Not 2048 sector aligned
```
Ezt a hibát csak a bootboot.bin írja ki (és nem a bootboot.efi vagy a bootboot.img), és csakis akkor,
ha CDROM-ról El Torito "no emulation" módban indult, és a boot partíció fájl rendszerének főkönyvtára
nincs 2048 bájtra igazítva, vagy a kluszterméret nem 2048 bájt többszöröse. FAT16 esetén ez a FAT tábla
méretén és emiatt a fájl rendszer méretén múlik. Ha ezt látod, akkor adj hozzá 2 rejtett szektort a BPB-ben.
FAT32 fájl rendszer esetén nem fordulhat elő.
```
BOOTBOOT-PANIC: Initrd not found
```
A betöltő nem találta az initrd-t a boot partíción.
```
BOOTBOOT-PANIC: Kernel not found in initrd
```
A megadott kernel nem található az initrd-n, vagy az initrd formátuma nem ismert és a keresés nem talált
egyáltalán érvényes futtathatót benne.
```
BOOTBOOT-PANIC: Kernel is not a valid executable
```
2019-03-14 22:19:45 -04:00
A megadott kernel fájlt megtalálta ugyan az initrd-n valamelyik fájl rendszer meghajtó, de az nem ELF64 se PE32+ formátumú,
2019-03-14 21:48:34 -04:00
vagy nem az adott architáktúrára van fordítva, vagy nincs benne betölthető szegmens definíció a negatív címtartományban
2019-03-14 22:19:45 -04:00
megadva (lásd linker szkript). Ezt a hibát a 2-es szintű betöltők is kiírhatják, ha az `mmio` , `fb` , `bootboot` vagy
2020-06-15 21:35:19 -04:00
`environment` szimbólumok címei nincsenek a negatív címtartományban (-1G és 0 között), vagy nincsenek lapcímhatárra igazítva.
2020-06-18 05:17:49 -04:00
Az x86_64-en az fb szimbólumnak, míg AArch64-on az mmio szimbólumnak 2M igazítottnak is kell lennie. A [mkbootimg check ](https://gitlab.com/bztsrc/bootboot/tree/master/mkbootimg )
2020-06-16 11:09:13 -04:00
megmondja, mi az ok.
2020-06-15 21:35:19 -04:00
```
BOOTBOOT-PANIC: Kernel is too big
```
2020-06-16 11:09:13 -04:00
A kernel nagyobb, 16 megabájt. 1. szintű beltöltőknél a limit valamivel kevesebb, mint 2M.
2019-03-14 21:48:34 -04:00
```
BOOTBOOT-PANIC: GOP failed, no framebuffer
BOOTBOOT-PANIC: VESA VBE error, no framebuffer
BOOTBOOT-PANIC: VideoCore error, no framebuffer
```
Az üzenet első fele platformonként változik. Azt jelenti, hogy a betöltő nem tudta beállítani a lineáris framebufffert
32 bites tömörített pixelekkel a kért felbontásban. Lehetséges megoldás a felbontás módosítása `screen=800x600` -ra vagy
`screen=1024x768` -ra a környezeti fájlban.
```
BOOTBOOT-PANIC: Unsupported cipher
```
Ezt akkor írja ki, ha az initrd olyan titkosítást használ, amit a betöltő nem ismer. Megoldás: újra kell generálni az
2020-06-15 21:35:19 -04:00
initrd-t SHA-XOR-CBC-vel, amit minden betöltő implementációnak támogatnia kell (megjegyzés: a titkosítás csak FS/Z
lemezkép esetén támogatott).
2019-03-14 21:48:34 -04:00
Ez minden, remélem hasznososnak találod!
2020-01-16 12:51:40 -05:00
Hozzájárulások
--------------
2020-06-15 21:35:19 -04:00
Szeretnék külön köszönetet mondani [Valentin Anger ](https://gitlab.com/SyrupThinker )nek, amiért alaposan letesztelte a
kódot számtalan igazi vason is. Továbbá [Vinay Chandrá ](https://gitlab.com/vinaychandra )nak, amiért addig nem hagyott
békén, míg a 2. szintű protokoll be nem került a refenrencia implementációkba, és amiért tesztelte és kiegészítette
2020-11-09 08:10:55 -05:00
Rust minta kernellel a projektet, valamint hogy MacOS bináris biztosít a mkbootimg-hez. További köszönet
[Stephen Sherratt ](https://gitlab.com/stevebob )nak a kitartó hibajavításáért.
2020-10-05 13:54:27 -04:00
Köszönet [Neutru ](https://gitlab.com/neutru )-nak a rettentő alapos tesztelésért.