[OSy] Problem se statickou strukturou
Martin Cetkovský
martin at alikuvkoutek.cz
Thu Dec 6 00:57:10 CET 2007
Zdravim,
tak jeste jedno pozorovani. Zacal cyklit spinlock_lock a nechtel skoncit. Na prvnim radku vypisu je adresa zamku, ktery cykluje (brano z parametru funkce). Adresa je zcela totozna s adresou jednoho z firstlock nebo secondlock v dobe jejich inicializace. Na dalsich dvou radcich je vypis adres obou zminenych statickych struktur. Kupodivu se ani jedna z adres neshoduje s temi pri inicializaci (dokonce na techto adresach zadny spinlock inicializovan nebyl). Dle ocekavani se aspon jedna adresa mela shodovat s parametrem cyklujiciho spinlocku, protoze volajici pouzil uplne stejnou konstrukci pri jeho volani jako pri vypisu danych adres (&globals.firstlock nebo &globals.secondlock).
Cycling lock 0x8001D628 [~ parametr funkce spinlocku]
Locked firstlock 0x8001F4E8 [~ &globals.firstlock]
Locked secondlock 0x8001F4E4 [~ &globals.secondlock]
Opravdu se nedari najit duvod, jak muze staticka promenna zmenit svoji adresu. Predem diky za vsechna navodna osvetleni.
Martin
> -----Original Message-----
> From: osy-bounces at dsrg.mff.cuni.cz [mailto:osy-
> bounces at dsrg.mff.cuni.cz] On Behalf Of Martin Cetkovský
> Sent: Wednesday, December 05, 2007 11:15 PM
> To: 'Operating Systems Course'
> Subject: Re: [OSy] Problem se statickou strukturou
>
> Ahoj,
>
> tak jsme jeste trochu badali a deje se nasledujici. Pri zavolani
> metody init_memory se adresa sledovane staticke promenne zmeni z
> 0x80020BB8 (pred vypisem Memory) na 0x8001FED8 (po kontrole v
> init_memory). Vzhledem k tomu, ze mapovanou pamet mame 127 kB (do
> 0x1FBFF), pak az od 0x20000. Pro jistotu opakuji, ze jeste nedoslo k
> inicializaci pameti ani scheduleru a nebyl volan zadny malloc ani
> alokovan ramec (to vim s jistotou), takze IMHO nemelo sanci dojit k
> preplanovani ani pokropeni pameti vlastnimi silami. Opravdu mne uz
> nenapada, co s tim. Ma nekdo nejaky tip? Poustime to v labu.
>
> Mame nasledujici kod:
> ...
> puts("\n\tMemory ");
> ___stop();
> if (someglobals.firstlock.value == 0xFFFFFFFF)
> panic("c");
> init_memory();
> ....
>
> void init_memory(void)
> {
> unsigned int start;
> unsigned int end;
> unsigned int size;
> unsigned int * p;
>
> if (someglobals.firstlock.value == 0xFFFFFFFF)
> ___stop();
> ...
> }
>
> Zde je vypis v assembleru.
> Memory [msim] set trace on
> [msim] g
> 8000FEF8 lui v0, 0x8002 # 0x8002=32770, v0: 0x0-
> >0x80020000, v1: 0x0->0x400004, a0: 0x0->0x80021450, sp: 0x0-
> >0x8000b9b8, fp: 0x0->0x8000b9b8, ra: 0x0->0x8000fef4, cp0_index:
> 0x00000000->0x0000002f, cp0_entryhi: 0x00000000->0x000bc000
> 8000FEFC addiu v0, v0, 0x2f0 # 0x2f0=752, v0: 0x80020000-
> >0x800202f0
> 8000FF00 lw v1, 0x8a8(v0) # 0x8a8=2216, v1: 0x400004-
> >0x0
> 8000FF04 addiu v0, 0, 0xffff # 0xffffffff=65535, v0:
> 0x800202f0->0xffffffff
> 8000FF08 bne v1, v0, 0x4 # 0x4=4
> 8000FF0C nop
> 8000FF1C jal +0xf544 # 0xf544=62788, ra:
> 0x8000fef4->0x8000ff24
> 8000FF20 nop
> 8000F544 addiu sp, sp, 0xffd8 # 0xffffffd8=65496, sp:
> 0x8000b9b8->0x8000b990
> 8000F548 sw ra, 0x24(sp) # 0x24=36
> 8000F54C sw fp, 0x20(sp) # 0x20=32
> 8000F550 addu fp, sp, 0 # fp: 0x8000b9b8->0x8000b990
> 8000F554 lui v0, 0x8002 # 0x8002=32770, v0:
> 0xffffffff->0x80020000
> 8000F558 addiu v0, v0, 0xf610 # 0xfffff610=62992, v0:
> 0x80020000->0x8001f610
> 8000F55C lw v1, 0x8a8(v0) # 0x8a8=2216, v1: 0x0-
> >0xffffffff
> 8000F560 addiu v0, 0, 0xffff # 0xffffffff=65535, v0:
> 0x8001f610->0xffffffff
> 8000F564 bne v1, v0, 0x1a # 0x1a=26
> 8000F568 nop
> 8000F56C ---
> [msim]
>
> > -----Original Message-----
> > From: osy-bounces at dsrg.mff.cuni.cz [mailto:osy-
> > bounces at dsrg.mff.cuni.cz] On Behalf Of Martin Cetkovský
> > Sent: Wednesday, December 05, 2007 2:11 PM
> > To: 'Operating Systems Course'
> > Subject: [OSy] Problem se statickou strukturou
> >
> > Ahoj,
> >
> > mame problemy se statickou strukturou, konkretne pri inicializaci
> > spinlocku. Prikladam relevantni informace.
> >
> > static struct{
> > ...
> > struct spinlock firstlock;
> > struct spinlock secondlock;
> > } someglobals;
> >
> > struct spinlock{
> > volatile int value;
> > };
> >
> > void spinlock_init(struct spinlock * lock)
> > {
> > printk_locked("%x, %x\n", lock->value, SPINLOCK_UNLOCKED);
> > lock->value = SPINLOCK_UNLOCKED;
> > printk_locked("%x\n", lock->value);
> > }
> >
> > Inicializaci spinlocku volame nasledovne.
> > spinlock_init(&someglobals.firstlock);
> > spinlock_init(&someglobals.secondlock);
> > printk_locked("after %x, value %x", &someglobals.secondlock,
> > someglobals.secondlock.value);
> >
> > Vypsane hodnoty jsou nasledujici (pricemz u nekolika predchozich
> > jsou hodnoty spravne - 0x0 misto 0xFF*):
> > 0xFFFFFFFF, 0x0
> > 0xFFFFFFFF
> > 0xFFFFFFFF, 0x0
> > 0xFFFFFFFF
> > after 0x8001FFD8, value 0xFFFFFFFFA
> >
> > Bezime na single-CPU a nastava jiz pri inicializaci pameti, cili
> > scheduler ani malloc se dosud nemaji sanci projevit.
> >
> > Mate nekdo tip, co s tim je? Nejak to nemuzeme najit.
> >
> > Diky,
> >
> > Martin Cetkovský
> >
> >
> >
> > _______________________________________________
> > OSy mailing list
> > OSy at dsrg.mff.cuni.cz
> > https://dsrg.mff.cuni.cz/mailman/listinfo/osy
>
>
> _______________________________________________
> OSy mailing list
> OSy at dsrg.mff.cuni.cz
> https://dsrg.mff.cuni.cz/mailman/listinfo/osy
More information about the NSWI004
mailing list