[OSy] Staticke struktury se alokuji na divnem miste v pameti

Jan Bureš gask at centrum.cz
Sun Jan 6 13:09:57 CET 2008


Příjemnou neděli přeji.

Kolega vás zmátl několika překlepy.

Předně - alokujeme si prvních 32 stránek virtuálních prostroru pro binárku procesu. Ta zabírá cca 5 stránek (v současnosti necelých 20kB).

Pokud syscallu dám magickou hodnotu, projde v pořádku. Neztrácí se tedy po cestě ani nepřepisuje.

Pokud v kódu naalokuju dynamickou strukturu a pošlu pointer na ni, projde v pořádku, data jsou také konzistentní a se strukturou můžu "na druhé straně" pracovat. Bohužel, ne vždy je možné použít dynamické struktury (u nás nyní už jen volání mallocu říkající si o více paměti).

Pokud v kódu mám statickou strukturu:
thread_struct t_str;
a zavolám:
syscall(CODE, &t_str);
dostanu v kernelu adresu 0xcfb4.

Teď ty "divné věci":
Ta adresa je stejná pro různé syscally z různých míst kódu posílajících různé statické struktury.
Pokud si vyrobím pointer p_str a dám do něj odkaz na t_str (p_str = &t_str), je tam stále 0xcfb4. Pokud pošlu &p_str, přijde mi také 0xcfb4. 
Na adrese 0xcfb4 jsou samé nuly.  Pokud do t_str uložím nějaká data, skutečně se do ní uloží.
Chyba je tedy očividně s operátorem "&", který nám z čehokoliv, co mu dáme, udělá 0xcfb4.

S pozdravem
Jan Bureš

______________________________________________________________
> Od: andree182 at gmail.com
> Komu: "Operating Systems Course" <osy at dsrg.mff.cuni.cz>
> Datum: 06.01.2008 12:58
> Předmět: Re: [OSy] Staticke struktury se alokuji na divnem miste v pameti
>
>ta struktura sa (afaik) uklada na stack vlakna, nie je mozne ze by ste ten
>SP mali tam (~0xcfb4)? Ak je ta adresa mimo adries, ktore su vo virt.
pamati
>procesu namapovane, preco vam to nezomrie pri pristupe na tu adresu na
>(napr.) tlb exception? (kedze sa tam ta nieco muselo zapisat/citat, ked
sa
>tam vlakno hralo so stackom)
>
>On Jan 6, 2008 12:41 PM, Tomáš Brambora <tomas.brambora at gmail.com> wrote:
>
>> 0xCFB4 je adresa ve virtualni pameti.
>> Mam v kodu user procesu dejme tomu
>> putc_syscall_struct str;
>> a volam SYSCALL(kod_syscallu, (void*)&str)).
>>
>> Proces mame namapovany na nejvyse 132 stranek pocinaje 0x0. Takze CFB4
>> je daleko za nim, coz by u staticke struktury byt nemelo, jestli se
>> nepletu..
>> Na strane kernelu dostaneme v registru stejny pointer, ktery jsme do
>> nej v user procesu strcili (zkouseli jsme to s MAGIC hodnotou). Takze
>> ta struktura je fakt alokovana na te divne adrese 0xCFB4 (a dalsi
>> struktury jsou v okoli tehle adresy)...
>>
>>
>>
>
>_______________________________________________
>OSy mailing list
>OSy at dsrg.mff.cuni.cz
>https://dsrg.mff.cuni.cz/mailman/listinfo/osy
>





More information about the NSWI004 mailing list