[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