Apa itu memori tinggi dan memori rendah di Linux?


92

Saya tertarik pada perbedaan antara Highmem dan Lowmem:

  1. Mengapa ada perbedaan seperti itu?
  2. Apa yang kita dapat dengan melakukannya?
  3. Fitur apa yang dimiliki masing-masing?

@hiro, maksud Anda "HIGHMEM" adalah "alamat virtual kernel" seperti yang dijelaskan oleh ldd3. Saya setuju denganmu. itu membingungkan, ldd3 didefinisikan "LOWMEM" "HIGHMEM", juga didefinisikan "alamat virtual kernel" "alamat logika kernel". mereka adalah hal yang sama, tetapi memiliki nama yang berbeda. itu adalah "keindahan" dari perangkat lunak, itu sangat deskripsi-bahasa-tergantung.
steve

Jawaban:


69

Pada arsitektur 32-bit, kisaran ruang alamat untuk mengatasi RAM adalah:

0x00000000 - 0xffffffff

atau 4'294'967'295(4 GB).

Kernel linux membagi yang naik 3/1 (bisa juga 2/2, atau 1/3 1 ) menjadi ruang pengguna (memori tinggi) dan ruang kernel (memori rendah).

Rentang ruang pengguna:

0x00000000 - 0xbfffffff

Setiap proses pengguna yang baru lahir mendapatkan alamat (rentang) di dalam area ini. Proses pengguna umumnya tidak dipercaya dan karena itu dilarang mengakses ruang kernel. Lebih lanjut, mereka dianggap tidak mendesak, sebagai aturan umum, kernel mencoba menunda alokasi memori untuk proses-proses tersebut.

Kisaran ruang kernel:

0xc0000000 - 0xffffffff

Proses kernel mendapatkan alamatnya (rentang) di sini. Kernel dapat langsung mengakses 1 GB alamat ini (well, bukan 1 GB penuh, ada 128 MB yang disediakan untuk akses memori tinggi).

Proses yang muncul dalam ruang kernel dipercaya, mendesak dan dianggap bebas kesalahan, permintaan memori diproses secara instan.

Setiap proses kernel juga dapat mengakses rentang ruang pengguna jika diinginkan. Dan untuk mencapai hal ini, kernel memetakan alamat dari ruang pengguna (memori tinggi) ke ruang kernelnya (memori rendah), 128 MB yang disebutkan di atas khusus disediakan untuk ini.


1 Apakah pembagiannya adalah 3/1, 2/2, atau 1/3 dikontrol oleh CONFIG_VMSPLIT_...opsi; Anda mungkin dapat memeriksa di bawah /boot/config*untuk melihat opsi mana yang dipilih untuk kernel Anda.


Ini sudah tua dan saya tidak yakin Anda ada di sini. Tapi saya ingin bertanya satu hal: 128MB yang dicadangkan di ruang kernel (untuk akses memori tinggi), apakah itu semua referensi area memori ruang pengguna? Jadi, proses kernel dapat mengakses ruang pengguna dengan merujuk ke area ini, kan?
Amumu

1
Mengapa selalu dalam 1 / 4's? Yaitu mengapa tidak bisa membaginya 5/1 atau sesuatu?
mgalgs

Apa sebenarnya yang dimaksud "dapat langsung mengakses" di sini? Maksud saya, bukankah kernel itu sendiri diakses melalui mekanisme memori virtual?
telenn

1
Saya percaya bahwa apa yang Anda katakan tentang memori tinggi / rendah salah: Saya percaya bahwa dalam sistem 32bit murni, kernel dapat mengakses 3GB penuh ruang pengguna secara langsung (kernel dapat mengakses ruang kernel dan ruang pengguna). Namun ketika Anda memiliki kernel PAE hal-hal menjadi lebih kompleks, sekarang Anda memiliki lebih dari 3GB RAM, setiap proses dapat 3GB, dan Anda tidak dapat mengakses seluruh ruang pengguna secara langsung. Di sinilah mem tinggi dan 128MB memori dalam ruang kernel, masuk. Dengan 64bit kernel menjadi lebih sederhana lagi, tidak ada orang tinggi, karena semua ruang pengguna dapat diakses dari kernel.
ctrl-alt-delor

2
@mgalgs ¼, 2/4 dan ¾ hanyalah satu set pilihan default yang terbuka. Sejak 2007, seseorang juga dapat memilih 5/16 dan 15/32. Jika Anda tahu untuk mengedit baris #define yang mana, Anda dapat memilih sendiri bagian yang hampir sewenang-wenang.
jørgensen

28

Referensi pertama untuk beralih ke Linux Device Drivers (tersedia baik online dan dalam bentuk buku), khususnya bab 15 yang memiliki bagian pada topik.

Dalam dunia yang ideal, setiap komponen sistem akan dapat memetakan semua memori yang perlu diakses. Dan ini adalah kasus untuk proses di Linux dan sebagian besar sistem operasi: proses 32-bit hanya dapat mengakses memori virtual kurang dari 2 ^ 32 byte (sebenarnya sekitar 3GB pada arsitektur Linux 32-bit yang khas). Semakin sulit untuk kernel, yang harus dapat memetakan memori penuh dari proses yang sistemnya sebut sedang dieksekusi, ditambah seluruh memori fisik, ditambah perangkat keras yang dipetakan dengan memori lain.

Jadi ketika kernel 32-bit perlu memetakan lebih dari 4GB memori, itu harus dikompilasi dengan dukungan memori yang tinggi. Memori tinggi adalah memori yang tidak dipetakan secara permanen di ruang alamat kernel. (Memori rendah adalah kebalikannya: selalu dipetakan, sehingga Anda dapat mengaksesnya di kernel hanya dengan mendereferensi pointer.)

Ketika Anda mengakses memori tinggi dari kode kernel, Anda perlu menelepon kmapterlebih dahulu, untuk mendapatkan pointer dari struktur data halaman ( struct page). Memanggil kmapberfungsi baik halaman dalam memori tinggi atau rendah. Ada juga kmap_atomicyang menambahkan kendala tetapi lebih efisien pada mesin multiprosesor karena menggunakan penguncian yang lebih halus. Pointer yang didapat kmapadalah resource: ia menggunakan ruang alamat. Setelah selesai, Anda harus menelepon kunmap(atau kunmap_atomic) untuk membebaskan sumber daya itu; maka pointer tidak lagi valid, dan konten halaman tidak dapat diakses sampai Anda menelepon kmaplagi.


2
Terima kasih Gilles untuk jawabannya .. Tapi, saya masih belum bisa mendapatkan seluruh konsep. Bisakah Anda menjadi sedikit lebih sederhana tanpa mengurangi informasi di dalamnya?
Sen

17

Ini relevan dengan kernel Linux; Saya tidak yakin bagaimana setiap kernel Unix menangani ini.

Memori Tinggi adalah segmen memori yang dapat ditangani oleh program ruang-pengguna. Itu tidak bisa menyentuh Memori Rendah.

Memori Rendah adalah segmen memori yang dapat ditangani oleh kernel Linux secara langsung. Jika kernel harus mengakses Memori Tinggi, ia harus memetakannya ke ruang alamatnya sendiri terlebih dahulu.

Ada tambalan yang diperkenalkan baru-baru ini yang memungkinkan Anda mengontrol di mana segmennya. Pengorbanannya adalah Anda dapat mengambil memori yang dapat dialamatkan dari ruang pengguna sehingga kernel dapat memiliki lebih banyak memori yang tidak harus dipetakan sebelum digunakan.

Sumber daya tambahan:


4

HIGHMEM adalah rentang ruang memori kernel, tetapi BUKAN memori yang Anda akses, tetapi ini adalah tempat di mana Anda meletakkan apa yang ingin Anda akses.

Peta memori virtual Linux 32bit yang khas adalah seperti:

  • 0x00000000-0xbfffffff: proses pengguna (3GB)

  • 0xc0000000-0xffffffff: ruang kernel (1GB)

(Vektor khusus CPU dan apa pun diabaikan di sini).

Linux membagi ruang kernel 1GB menjadi 2 bagian, LOWMEM dan HIGHMEM. Perpecahan bervariasi dari instalasi ke instalasi.

Jika suatu instalasi memilih, katakanlah, 512MB-512MB untuk mem RENDAH dan TINGGI, 512MB LOWMEM (0xc0000000-0xdfffffff) dipetakan secara statis pada saat boot kernel; biasanya begitu banyak byte pertama dari memori fisik digunakan untuk ini sehingga alamat virtual dan fisik dalam kisaran ini memiliki offset konstan, katakanlah, 0xc0000000.

Di sisi lain, 512MB yang terakhir (HIGHMEM) tidak memiliki pemetaan statis (walaupun Anda dapat meninggalkan halaman yang dipetakan secara semi-permanen di sana, tetapi Anda harus melakukannya secara eksplisit dalam kode driver Anda). Sebagai gantinya, halaman dipetakan sementara dan tidak dipetakan di sini sehingga alamat virtual dan fisik dalam rentang ini tidak memiliki pemetaan yang konsisten. Penggunaan umum dari HIGHMEM termasuk buffer data satu kali.


3

Sejauh yang saya ingat, "Memori Tinggi" digunakan untuk ruang aplikasi dan "Memori Rendah" untuk kernel.

Keuntungannya adalah aplikasi (ruang pengguna) tidak dapat mengakses memori ruang kernel.


0

Banyak orang mengatakan bahwa memori rendah untuk sistem operasi. Ini biasanya benar tetapi tidak harus demikian. Memori tinggi dan memori rendah hanya dua bagian dari ruang memori, tetapi dalam sistem Linux, memori rendah hanya untuk kernel dan memori tinggi untuk proses pengguna.

Menurut "Buku Dinosaurus (konsep sistem operasi)", kita dapat menempatkan sistem operasi dalam memori rendah atau memori tinggi. Faktor utama yang mempengaruhi keputusan ini adalah lokasi vektor interupsi. Karena vektor interupsi sering dalam memori rendah, programmer biasanya juga menempatkan sistem operasi dalam memori rendah.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.