Pertama, sistem 32 bit memiliki 0xffffffff
( 4'294'967'295
) alamat linear untuk mengakses lokasi fisik di atas RAM.
Kernel membagi alamat-alamat ini menjadi ruang pengguna dan kernel.
Ruang pengguna (memori tinggi) dapat diakses oleh pengguna dan, jika perlu, juga oleh kernel.
Kisaran alamat dalam notasi hex dan dec:
0x00000000 - 0xbfffffff
0 - 3'221'225'471
Ruang kernel (memori rendah) hanya dapat diakses oleh kernel.
Kisaran alamat dalam notasi hex dan dec:
0xc0000000 - 0xffffffff
3'221'225'472 - 4'294'967'295
Seperti ini:
0x00000000 0xc0000000 0xffffffff
| | |
+------------------------+----------+
| User | Kernel |
| space | space |
+------------------------+----------+
Dengan demikian, tata letak memori yang Anda lihat dmesg
sesuai dengan pemetaan alamat linear di ruang kernel.
Pertama, urutan .text, .data, dan .init yang menyediakan inisialisasi tabel halaman kernel sendiri (menerjemahkan linear ke alamat fisik).
.text : 0xc0400000 - 0xc071ae6a (3179 kB)
Rentang tempat kode kernel berada.
.data : 0xc071ae6a - 0xc08feb78 (1935 kB)
Rentang tempat segmen data kernel berada.
.init : 0xc0906000 - 0xc0973000 ( 436 kB)
Rentang tempat tabel halaman awal kernel berada.
(dan 128 kB lainnya untuk beberapa struktur data dinamis.)
Ruang alamat minimal ini cukup besar untuk menginstal kernel dalam RAM dan menginisialisasi struktur data intinya.
Ukuran yang digunakan ditampilkan di dalam tanda kurung, ambil contoh kode kernel:
0xc071ae6a - 0xc0400000 = 31AE6A
Dalam notasi desimal, itu 3'255'914
(3179 kB).
Kedua, penggunaan ruang kernel setelah inisialisasi
lowmem : 0xc0000000 - 0xf77fe000 ( 887 MB)
Kisaran lowmem dapat digunakan oleh kernel untuk secara langsung mengakses alamat fisik.
Ini bukan 1 GB penuh, karena kernel selalu memerlukan setidaknya 128 MB alamat linier untuk mengimplementasikan alokasi memori yang tidak bersebelahan dan alamat linear yang diperbaiki.
vmalloc : 0xf7ffe000 - 0xff7fe000 ( 120 MB)
Alokasi memori virtual dapat mengalokasikan bingkai halaman berdasarkan skema yang tidak berdekatan. Keuntungan utama skema ini adalah untuk menghindari fragmentasi eksternal, ini digunakan untuk area swap, modul kernel atau alokasi buffer untuk beberapa perangkat I / O.
pkmap : 0xff800000 - 0xffa00000 (2048 kB)
Pemetaan kernel permanen memungkinkan kernel untuk membuat pemetaan frame halaman memori tinggi ke dalam ruang alamat kernel. Ketika halaman HIGHMEM dipetakan menggunakan kmap (), alamat virtual ditugaskan dari sini.
fixmap : 0xffc57000 - 0xfffff000 (3744 kB)
Ini adalah alamat linear yang diperbaiki yang dapat merujuk ke alamat fisik apa pun di RAM, bukan hanya 1 GB terakhir seperti alamat lowmem. Alamat linear yang dipetakan secara fix sedikit lebih efisien daripada rekan lowmem dan pkmap mereka. Ada deskriptor tabel halaman khusus yang ditugaskan untuk pemetaan tetap, dan pemetaan halaman HIGHMEM menggunakan kmap_atomic dialokasikan dari sini.
Jika Anda ingin menyelam lebih dalam ke dalam lubang kelinci:
Memahami Kernel Linux