-
Pemetaan kernel ada terutama untuk tujuan kernel, bukan proses pengguna. Dari perspektif CPU, alamat memori fisik apa pun yang tidak dipetakan sebagai alamat linier mungkin juga tidak ada. Tetapi CPU memang harus dapat memanggil ke dalam kernel:untuk melayani interupsi, untuk menangani pengecualian... Ia juga harus dapat memanggil ke dalam kernel ketika proses pengguna mengeluarkan panggilan sistem (ada berbagai cara untuk melakukannya terjadi jadi saya tidak akan masuk ke rincian). Pada sebagian besar jika tidak semua arsitektur, hal ini terjadi tanpa kesempatan untuk berpindah tabel halaman — lihat misalnya
SYSENTER
. Jadi minimal, titik masuk ke dalam kernel harus dipetakan ke dalam ruang alamat saat ini setiap saat. -
alokasi kernel bersifat dinamis, tetapi ruang alamatnya tidak. Pada x86 32-bit, berbagai pemisahan tersedia, seperti pemisahan 3/1 GiB yang ditunjukkan pada diagram Anda; pada 64-bit x86, bagian atas ruang alamat dicadangkan untuk kernel (lihat peta memori di dokumentasi kernel). Perpecahan itu tidak bisa bergerak. (Perhatikan bahwa pustaka dimuat ke dalam ruang pengguna. Modul kernel dimuat ke dalam ruang kernel, tetapi sekali lagi itu hanya mengubah alokasi, bukan pembagian ruang alamat.)
-
Dalam mode pengguna, ada satu pemetaan untuk kernel, yang dibagikan di semua proses. Saat pemetaan halaman sisi kernel berubah, perubahan itu tercermin di mana-mana.
Saat KPTI diaktifkan, kernel memiliki pemetaan pribadinya sendiri, yang tidak diekspos saat menjalankan kode ruang pengguna; jadi dengan KPTI ada dua pemetaan, dan perubahan ke kernel-pribadi tidak akan terlihat oleh ruang pengguna (yang merupakan inti dari KPTI).
Peta memori kernel selalu memetakan semua kernel (dalam mode kernel saat menjalankan KPTI), tetapi tidak harus satu-ke-satu — pada x86 64-bit misalnya peta ini menyertakan peta penuh memori fisik, jadi semua alamat fisik kernel adalah dipetakan setidaknya dua kali.