[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