[so2] Mapare low-mem in spatiul kernel (bonus: the cake is a lie)

Razvan Deaconescu razvan.deaconescu at cs.pub.ro
Sun May 3 12:57:55 EEST 2015


Salutare.

Întrucât am văzut că nu am explicat cum trebuie partea de low-mem și
maparea acesteia, am făcut un modul de kernel de test[1]. Modulul
parcurge spațiul virtual al nucleului în care este mapată zona low-mem
(adică zona din spațiul virtual cuprinsă între PAGE_OFFSET și
high_memory).

Acolo puteți vedea că zona este mapată, deci tabelele de pagini sunt
completate. Motivul mapării directe a low-mem este pentru cazul în care
nucleul solicită explicit translatări virtual-fizic sau viceversa. Orice
acces implicit al nucleului la spațiul său de adresă va trece prin TLB,
MMU, tabele de pagini; acele accese nu sunt influențate de maparea
directă a low-mem. Maparea directă este utilă pentru translatarea
explicită solicitată în anumite ocazii de kernel; pentru acea
translatare se fac operații aritmetice, nemaifiind nevoie de parcurgerea
tabelei de pagini.

Partea interesantă (de unde și "the cake is a lie") este că, din test,
rezultă că partea de low-mem nu ocupă 896MB ci, de fapt, 128MB. Avem:
* PAGE_OFFSET: 0xc0000000
* high_memory: 0xc7fe0000

Output-ul unei rulări este aici[2].

Diferența: 0x07fe0000, adică puțin sub 128MB. Asta se întâmplă pe
nucleul din mașina virtuală, kernel 3.13. Nu știam că s-a schimbat
această valoare, dar aparent așa este.

Dacă fac ceva greșit sau dacă am zis ceva greșit, săriți.

Tavi, tu ce știi de asta?

[1] https://github.com/razvand/snippets/tree/master/kernel/kernel-page-table-walk
[2] http://pastebin.com/sDDp9BrH

Răzvan


More information about the so2 mailing list