[OSy] Problemy s prekladacem

Vlastimil Babka babka at dsrg.mff.cuni.cz
Sat Dec 6 00:47:55 CET 2008


Tom� Martinec wrote:
> Dobry den,
>
> Pri testovani map1 jsme narazili na problem, o kterem se domnivame, ze
> jde o chybu prekladace. Spociva v tom, ze kod testu
> pomoci funkce vma_alloc pozada o prideleni bloku virtualni pameti a
> nas kernel mu ji poskytne na adrese 0xC0000000. Kod testu (jedna se o
> rutinu action_vma_alloc()) si zaznam o alokovane oblasti uklada do
> svych internich struktur, predtim vsak virtualni adresu vydeli
> velikosti stranky:
>
> 		/*
> 		 * The pointer is OK, convert it to page number, add
> 		 * the area to the area list and check for overlaps.
> 		 */
> 		printk ("Before %x\n", alloc_ptr);
>
> 		msim_trace_on ();
> 		int alloc_page = (unsigned int) alloc_ptr / PAGE_SIZE;
> 		msim_trace_off ();
>
> 		printk ("After %x\n", alloc_page);
> 		msim_stop ();
>
> Pokud ma tedy adresa pridelena funkci vma_alloc hodnotu 0xC0000000,
> mel by si kod testu ulozit hodnotu 0xC0000, misto toho je vsak ulozena
> 0xC00000. To se projevi pri zpetnem vypoctu adresy virtualni oblasti,
> ktera vyjde 0x00000000. Kod testu se nasledne pokusi na tuto adresu
> zapsat data, coz vede k vyjimce TLB miss a k zabiti aktualniho vlakna.
>
> Pri sledovani toku instrukci jsme zjistili, ze na radku
>
> int alloc_page = (unsigned int) alloc_ptr / PAGE_SIZE;
>
> nedochazi k bitovemu posunu doprava o dvanact bitu, ale nejprve k
> bitovemu posunu o deset bitu doprava a nasledne dva bity doleva.
>
> Odpovidajici vystup ze simulatoru:
> 		Before C0000000
> 		 0  800094AC    d_trace
> 		 0  800094B0    lw    s0, 0x18(sp)      # 0x18=24, s0: 0x0->0xc0000000
> 		 0  800094B4    srl   s0, s0, 0x0a      # 0xa=10, s0: 0xc0000000->0x300000
> 		 0  800094B8    sll   s0, s0, 0x02      # s0: 0x300000->0xc00000
> 		After C00000
>
> Prekladali jsme na platforme win32 s prekladacem verze 4.3.2. Dnes
> jsme to zkouseli i na unixovem stroji s prekladacem 4.1.1 se stejnym
> vysledkem.
>
> Takze, radi bychom se zeptali, jestli se nekdo z ostatnich take setkal
> s podobnym problemem a jestli nekoho nenapada nejake jine vysvetleni
> nez ze chyba prekladace.
>
>   
Dobry vecer,

chyba prekladace mi prijde jako malo pravdepodobny duvod. Ale v pripade 
ze ano, menili jste nejak CCFLAGS s kalista nebo jsou stejne?
Jako pravdepodobnejsi pricinu bych videl makro PAGE_SIZE. Jak presne je 
ve Vasem kernelu definovane? Testy ho sice definuji samy, ale pouze 
pokud neni jiz definovane pred nim. Neni to treba nejaky vyraz, ktery 
jste zapomneli ozavorkovat, a priorita operatoru '/' ho zcela zmenila, 
nebo neco podobneho?

Vlastimil Babka




More information about the NSWI004 mailing list