Apa yang disiratkan oleh Tata Letak Memori kernel Virtual di dmesg?

19

Saat melalui "Output of dmesg" saya bisa melihat daftar nilai yang saya tidak bisa mengerti dengan benar.

Memory: 2047804k/2086248k available (3179k kernel code, 37232k reserved, 1935k data, 436k init, 1176944k highmem)
virtual kernel memory layout:
    fixmap  : 0xffc57000 - 0xfffff000   (3744 kB)
    pkmap   : 0xff800000 - 0xffa00000   (2048 kB)
    vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)
    lowmem  : 0xc0000000 - 0xf77fe000   ( 887 MB)
      .init : 0xc0906000 - 0xc0973000   ( 436 kB)
      .data : 0xc071ae6a - 0xc08feb78   (1935 kB)
      .text : 0xc0400000 - 0xc071ae6a   (3179 kB)

Dari nilai-nilai saya mengerti bahwa saya memiliki RAM 2GB (memori fisik). Tapi sisanya sepertinya menjadi Angka Ajaib bagi saya.

Saya ingin tahu tentang masing-masing (fixmap, pkmap, .. dll) secara singkat (jika lebih banyak keraguan, saya akan memposting masing-masing sebagai Pertanyaan terpisah)?

Bisakah seseorang menjelaskan hal itu kepada saya?

Sen
sumber

Jawaban:

22

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 dmesgsesuai 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

mengibaskan
sumber
Terima kasih atas jawaban yang bagus ini. Saya ingin tahu mengapa mem rendah tidak 1GB penuh dan lebih banyak tentang bagian selanjutnya dari kalimat "karena kernel selalu memerlukan setidaknya 128 MB alamat linear untuk mengimplementasikan alokasi memori yang tidak berdampingan dan alamat linear yang diperbaiki-dipetakan."
Sen
Kernel harus mengakses kode memori tinggi dari waktu ke waktu (jika informasi BIOS dan ACPI berada pada MB pertama RAM), ia tidak dapat melakukan itu secara langsung (seperti area lowmem), oleh karena itu ia perlu memetakan memori rendah ke alamat linear memori tinggi, 128MB dicadangkan hanya untuk tujuan ini. Area vmalloc sebagian besar sementara dipetakan ke beberapa area memori tinggi dan dapat dipetakan kembali dengan cepat.
Mengibaskan
Jadi halaman yang disiapkan oleh kernel untuk panggilan sistem virtual juga merupakan bagian dari fixmap ??? Saya mengalami pertanyaan ini karena saya ingin tahu apa sebenarnya yang terletak pada halaman dengan alamat fffb5000, fffa1000 dll ... Saya mendapatkan overhead dalam replay rekor Mesin virtual saya karena banyak CPU virtual mengakses halaman ini BANYAK .... bagaimana caranya Saya tahu persis apa yang ada di alamat ini ... JAWABAN BESAR omong-omong :)
Deepthought