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