[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