[OSy] Divne konstanty kalista

Petr Tuma petr.tuma at dsrg.mff.cuni.cz
Thu Nov 29 21:35:42 CET 2007


> ale v puvodnim kalistu je tohle
> entrylo =((badvaddr >> 6) & cp0_entrylo_pfn_mask) ...
> coz moc nechapu proc to tam je, ten shift o sest

Prvni detail, ten shift je doprava, ne doleva jak pisete.

Uznavam, ze misto te konstanty 6 by bylo lepsi pouzit symbol, ktery by 
lepe vysvetloval jeji vyznam, ale i presto se da celkem snadno dojit k 
tomu, co se deje:

  - Shift doprava o 6 orizne virtualni adresu, na ktere doslo k chybe, o 
spodnich 6 bitu.

  - Tim, ze se jeste dal maskuje entrylo_pfn_mask, ktera nuluje dalsich 
spodnich 6 bitu, se dostaneme k oriznuti puvodni virtualni adresy o 
celkem 12 bitu (tady se mimochodem nuluji take ty nejvyssi dva bity).

  - No a oriznuti o spodnich 12 bitu je vam dobre znamy vypocet adresy 
stranky o velikosti 4 kilobajty.

Tedy cely ten vypocet zajisti, ze do pole PFN prijde fyzicka adresa 
ramce, ktera bude stejna, jako adresa virtualni stranky, na ktere doslo 
k vypadku (identicke mapovani).

I kdyz by rozhodne bylo citelnejsi psat neco ve stylu:

entrylo = ((badvaddr >> ADDRESS_TO_PAGE_SHIFT) << ENTRYLO_PFN_SHIFT) & 
ENTRYLO_PFN_MASK ...

Nebo mozna jeste lepe:

// Calculate virtual page number
virtual_page_number = badvaddr >> ADDRESS_TO_PAGE_SHIFT;
// Set physical frame number to virtual page number,
// which creates a simple identity mapping
entrylo = (virtual_page_number << ENTRYLO_PFN_SHIFT) & ENTRYLO_PFN_MASK ...

Petr Tuma





More information about the NSWI004 mailing list