[OSy] problem pri testu malloc1

Martin Decky decky at nenya.ms.mff.cuni.cz
Wed Dec 6 08:58:02 CET 2006


Hezky den,

> 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).

Jenomze to je prave velmi divne, protoze kdyz prelozime Sirius kernel s 
nejakym testem (tak, jak jsme jej dostali) a disassemblujeme jej, dostaneme:

800016c0 <kstack_alloc>:
800016c0:       035ad026        xor     k0,k0,k0
800016c4:       3c1a8000        lui     k0,0x8000
800016c8:       375a4800        ori     k0,k0,0x4800
800016cc:       8f5b0000        lw      k1,0(k0)
800016d0:       1f600004        bgtz    k1,800016e4 <kstack_already...>
800016d4:       00000000        nop
800016d8:       03bde826        xor     sp,sp,sp
800016dc:       3c1d8000        lui     sp,0x8000
800016e0:       37bd05e8        ori     sp,sp,0x5e8

Adresa symbolu _kernel_end je podle mapfile 0x80005674.

> 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.

V cem se tedy lisi mapfile, pripadne disassembler tech dvou variant? 
Podle naseho pozorovani v nicem podstatnem, ale mozna neco prehlizime.

> 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).

OK, to uz by melo byt spravne. Vic svetla do te situace vyse to ovsem 
nevnasi.


M.D.



More information about the NSWI004 mailing list