ACPI, memory management a inicializace OS (chobotnicovity problem)

Dan Lukes dan at obluda.cz
Fri Jan 4 10:29:46 CET 2008


	Zacalo to tim, ze se mi nedari FreeBSD 6.3-PRE (ani jiny) na mem 
pocitaci spolehlive uspavat a budit. Pak jsem si vsimnul hlasky uppne na 
zacatku bootu:

acpi_alloc_wakeup_handler: can't alloc wake memory


Takze jsem zacal hledat - v tom miste se ACPI snazi sehnat stranku 
paneti, do ktere presune "vstavaci" kod. Tato stranka musi byt na 
adresach 0-0x9FFFF tak, aby byla k dispozici uz v okamziku spousteni 
jeste v realnem modu.

Ale ve chvili, kdy se ACPI kod dostane "k lizu" uz jsou uplne vsechny 
mozne stranky rozsahu 0-9FFFFh (fyzicke pameti) obsazeny.

Jednotlive komponenty jadra i loadovatelne moduly registruji sve 
inicializacni rutiny s urcitou prioritou. Memory management, ktery 
vytvori seznam volnych stranek startuje s prioritou 
SI_SUB_VM/SI_ORDER_FIRST, rutina ACPI, ktera se pameti domaha a uz ji 
nedostane s prioritou SI_SUB_KMEM/SI_ORDER_ANY

Ty priority jsou pomerne tesne za sebou, takze by clovek cekal, ze se 
budou spoustet kratce po sobe - mezi nimi je uz jen alokace kernelove 
pameti s prioritu SI_SUB_KMEM/SI_ORDER_FIRST

Zahajil jsem tedy tim, ze jsem si acpi posunul na uroven 
SI_SUB_VM/SI_ORDER_SECOND abych predbehl tu kernelovou alokaci a tedy 
mezi globalni inicializaci pameti a pozadavkem na jeji pouziti ze strany 
ACPI nebylo nic. Nepomohlo - pamet vycerpana. Dalsim ladenim se ukazalo, 
ze stale plati, ze pamet sezere kernelova alokace = kmeminit().

Nojo - jenze, pote co jsem v ACPI posunul prioritu by se kmeminit mel 
dostat k lizu az po ACPI - ale on to nevi a klidne se dal spousti pred.

Po delsi dobe ladeni se ukazalo, ze s prioritama spousteni je to trochu 
slozitejsi. Na zacatku jsou "v baliku" spoustenych rutin, ktery se 
setridi dle priorit a pak se z nej vybira, jen interne zakompilovane 
komponenty.

	Terve kdyz se dojde k linker_preload() na urovni 
SI_SUB_KLD/SI_ORDER_MIDDLE (to uz je pomerne dost pozde) se do baliku 
pridaji inicializacni rutiny preloadovanych kernelovych modulu (a seznam 
se znovu setridi). Tim se nejprve ted dostanou "k lizu" (zdanlive) 
prioritnejsi inicializacni rutiny modulu (staticke uz jsou davno 
hotove). Na prioritnejsich urovnich jsou tedy v tomto okamziku jen 
modulove inicializacni rutiny (staticke uz jsou davno hotove). Teprve ve 
chvili kdy znovu dojdeme na uroven SI_SUB_KLD/SI_ORDER_MIDDLE se zacnou 
staticke a preloadovane rutiny stridat, tentorat opravdu ciste podle 
hodnoty priority.

To znamena, ze si s prioritou acpi_alloc_wakeup_handler() muzu hejbat 
jak chci - stejne se mi brzo nespusti (alespon dokud bude ACPI 
loadovatelny modul - a to bude, protoze zakompilovat ho nelze).

Takze konecne nejaka otazka - je tu nekdo, kdo ma nastudovano jak v 
jadre FreeBSD funguje memory management na urovni rozhrani fyzicke a 
virtualni pameti ? Zakladni teoreticke otazky - tedy jak funguje 
strankovani a podobne - s tim problem nemam. Smeruju k tomu, aby se 
kernel soustredil na fyzickou pamet na vyssich adresach, kterych je 
dost, a pokud mozno, dokud to jde, ponechaval volne fyzicke stranky s 
nizkymi adresami, protoze ty jsou cenny neobnovitelny zdroj.

A druhak - ma nekdo nastudovan dobre dynamicky jadrovy linker, konkretne 
jeho vztah k linker-setum (to by vyhledove umoznilo zaradit modulovou 
inicializaci spravne podle priorit mezi incializaci statickych komponent).


					Dan



More information about the Users-l mailing list