[OSy] Problemy s prekladacem

Tom� Martinec fyzmat at gmail.com
Fri Dec 5 23:44:42 CET 2008


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.

S pozdravem
Tomas Martinec




More information about the NSWI004 mailing list