boot kernelu
Dan Lukes
dan at obluda.cz
Mon Aug 27 08:05:40 CEST 2007
Radim Kolar napsal/wrote, On 08/19/07 18:27:
> potrebuji umet nabootovat freebsd kernel
Mysleno "vytvorit si vlasni loader" ?
> When the boot program starts the FreeBSD kernel running, it sets up
> only two components of the machine state:
> 1. All interrupts are blocked.
> 2. The hardware address-translation facility is disabled so that all
> memory references are to physical memory locations.
>
> The boot program also passes to the kernel the identity of the boot
> device and a set of boot flags. The FreeBSD kernel presumes nothing
> else about the state of the machine on which it is running.
Pokud si cely loader pises sam tak predpokladam, ze to budes delat co
nejednodussi a budes pro zacatek vytvaret pouze stage 1 a 2 loader.
Nakonec, ten uz na nahrani kernelu staci, i kdyz bez moznosti
"pridavnych modulu". Ale to u takhle specialniho nasazeni asi tolik
nevadi - proste vse potrebne zakompilujes (a moznost nahravat moduly po
startu tim dotcena neni).
Vlastni volani najdes v btx.S, funkce intx30 - to je loaderovy syscall,
ktery "umi" jen dve funkce - exec a exit.
> pravdepodobne tedy predavam spatne boot device nebo boot flags. Ty jsem ovsem nikde zdokumentovane nenasel.
> Potreboval bych proto nekde zjistit hodnoty techto dvou parametru s
> kterymi to bootuje napriklad z hard disku.
Ten syscal je volani funkci __exec(), a to volani najdes v boot2.c na
konci funkce load(). Z toho je jasne jake parametry se predavaji kernelu
pri startu na zasobniku. Ten prvni parametr je vstupni adresa a
nasleduje sest parametru. Pokud si je chces zobrazit, tak spravne misto
na vypsani je tady - nakonec - tady uz/jeste funguje printf() ...
Pozor, tesne pred volanim kod vypne strankovani - nejsem si jisty, zda
ten printf() funguje i za tehle situace, takze moezna ho bude treba
umistit kousek vys, pred to vypnuti.
Ta adresa, kterou tenhle __exec() vola odpovida startu .text segmentu.
Zdrojovy kod toho startu najdes v i386/i386/locore.s - hledej '.text'
nebo "This is where the bootblock start us"
Doporucuju kouknout na komentar funkce recover_bootinfo tamtez - neda
se sice rict, z eby tam parametry byly zdokumentovane, al eneco malo se
tam o tom pise.
Nez system dojde do Romanem zminene funkce mi_startup() tak to preci
jen udela docela dost operaci
Pokud bys chtel tisknout v teto casti kodu, pak ne drive nez po volani
init386, ktere pripravi potrebny environment. Je ale asi zbytecne se v
tom patlat takhle, melo by stacit napsat si modul, ktery ti vypise
globalni kernelove promenne, to kterych je tahle informace ulozena. Kdyz
uz si je nevypises debuggerem ...
> Taky je mozne ze spatne nahravam ELF jadro... ale abych zjistil kde je
> chyba potreboval bych znat spravne hodnoty techto 2 parametru s
> kterymi to netuhne.
Treba to bude tuhnout, i kdyz to zavolas se spravnymi parametry ;-)
Dan
--
Dan Lukes SISAL MFF UK
AKA: dan at obluda.cz, dan at freebsd.cz, dan at (kolej.)mff.cuni.cz
More information about the Users-l
mailing list