[OSy] problem pri testu malloc1
Jiří Tlach
jiri.tlach at centrum.cz
Tue Dec 5 21:20:11 CET 2006
Dobry vecer,
takze abych vse uvedl na pravou miru, pokusim se nyni vysvetlit, cim byly
motivovany zmeny v kstack.S, ktere jsem provedl.
Pred dvema dny posilal do teto konference Jirka Tousek nasledujici log tykajici
se pruchodu funkci kstack_alloc v kstack.S:
80002364 xor k0, k0, k0 # k0: 0x8001a1b0->0x0
80002368 lui k0, 0x8001 # 0x8001=32769, k0: 0x0->0x80010000
8000236C ori k0, k0, 0xa1b0 # 0xffffa1b0h=41392,
# k0: 0x80010000->0x8001a1b0
80002370 lw k1, (k0) # 0x0=0
Jedna se o kod, ktery ma za ukol nacist hodnotu promenne kernel_level
do registru k1. Adresa kernel_level, kterou lze z tohoto logu vycist je
0x8001a1b0. Hned za timto logem Jirka uvadel, ze adresa symbolu
kernel_end je 0x8000c624. Pak jedine logicke vysvetleni, proc symbol
kernel_level lezi nad symbolem kernel_end, je podle me to, ze linker
proste pridelil promenne kernel_level "spatnou" adresu nebo jsem mel
chybu nekde v tech instrunkcich, ktere kernel_level nacitaji (to jsou
ty instrukce z logu vyse).
Proto jsem se rozhodl inspirovat assemblerovym vystupem gcc
prekladace a napsat definici kernel_level promenne tak, jak by
ji napsalo gcc. Analogicky postup jsem aplikoval i na nacitani a
ukladani hodnoty promenne kernel_level. Timto zpusobem
tedy vznikly zmeny v kstack.S.
>Jenom tahle zmena. bez upravy dalsich instrukci, predevsim
>
>sw $k1, 0($k0)
>
>zpusobi, ze se hodnota nezapise na adresu kernel_level, ale na adresu
0x8000000, coz teda mozna vyresi Vas problem s memory managementem, ale ke
skutecne pricine problemu tak nejsme ani o krok bliz. Takze nevime :)
>
Pokud se tyka zpetneho zapisovani hodnoty do kernel_level, tak Jirka
neuvedl v tom predchazejicim mailu jeste jednu zmenu tykajici se kstack.S.
A to sice ze
sw $k1, 0($k0)
je nahrazeno za
sw $k1, %lo(kernel_level)($k0)
Takze se bude opravdu zapisovat na adresu promenne kernel_level (kdyz
v k0 registru mame ulozeno hornich 16 bitu jeji adresy).
S pozdravem
Jiri Tlach
More information about the NSWI004
mailing list