Di kernel Linux 64-bit, berapa banyak memori yang dipetakan secara berdekatan oleh kernel?

Aug 21 2020

Saya telah melalui Pengembangan Kernel Linux Robert Love, dan sumber lainnya. Dan di mana-mana disebutkan bahwa pada sistem 32 bit x86, kernel memiliki 1 GB teratas dari ruang alamat virtual, dari itu hingga 896 MB dipetakan secara berdekatan ke memori fisik (disebut ZONE_NORMAL) sisanya dipetakan ke dalam ruang 128 MB yang tersisa sesuai kebutuhan, dan mungkin tidak berdekatan (ZONE_HIGHMEM).

Pada 64 bit, masalah tidak memiliki ruang alamat virtual yang cukup dieliminasi. Dan peta memori dijelaskan sebagai,

0xffffffffffffffff  +-----------+
                    |           |
                    |           | Kernelspace
                    |           |
0xffff800000000000  +-----------+
                    |           |
                    |           |
                    |   hole    |
                    |           |
                    |           |
0x00007fffffffffff  +-----------+
                    |           |
                    |           |  Userspace
                    |           |
0x0000000000000000  +———————————+

Namun, tidak jelas, dalam peta ini berapa banyak ruang kernel yang dibutuhkan untuk bersebelahan secara fisik (sebagaimana didefinisikan dalam ZONE_NORMAL). dan berapa banyak yang dipetakan sesuai kebutuhan.

Apakah ZONE_HIGHMEM di kernel 64 bit selalu 0? Karena semua memori cukup dalam jangkauan ruang alamat virtual?

Tetapi memori tetap kernel yang bersebelahan (yang tidak dapat halaman) juga harus berukuran kecil, karena potongan memori fisik itu tidak akan pernah tersedia untuk proses pengguna lain. Jadi kernel perlu menggunakan memori yang tidak perlu bersebelahan (seperti ZONE_HIGHMEM), sebagaimana diperlukan. Ini bentrok dengan ZONE_HIGHMEM yang kosong pada kernel 64-bit.

Jadi saya bingung tentang berapa banyak kernel yang diperbaiki secara fisik berdekatan dan berapa banyak yang tidak bersebelahan dalam kasus kernel 64 bit.

Jawaban

2 StephenKitt Aug 21 2020 at 11:44

Tidak ada HIGHMEMpada 64-bit x86 - CONFIG_HIGHMEMtergantungX86_32 .

Ada dua pemetaan memori fisik pada 64-bit x86 :

ffff888000000000 | -119.5  TB | ffffc87fffffffff |   64 TB | direct mapping of all physical memory (page_offset_base)

dan area mulai

ffffffff80000000 |   -2    GB | ffffffff9fffffff |  512 MB | kernel text mapping, mapped to physical address 0

(alamat negatif adalah offset dari ujung ruang alamat).

Yang terakhir sesuai dengan apa yang Anda pikirkan, sejauh yang saya tahu, dan cenderung kecil; lihat baris "Memory" yang ditunjukkan selama boot:

Memory: 20144992K/20660008K available (14339K kernel code, 2406K rwdata, 8340K rodata, 2488K init, 5116K bss, 515016K reserved, 0K cma-reserved)

(hanya di bawah 30MiB) dan memori apa pun yang dikunci oleh modul yang dimuat nanti.