[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