Mengapa Debian Linux memungkinkan hingga 128TiB ruang alamat virtual per proses tetapi hanya memori fisik 64TiB?

23

Saya baru saja baca di sini :

  • hingga 128TiB ruang alamat virtual per proses (bukan 2GiB)
  • Dukungan memori fisik 64TiB, bukan 4GiB (atau 64GiB dengan ekstensi PAE)

Mengapa demikian? Maksud saya, dukungan memori fisik dibatasi oleh kernel atau oleh perangkat keras saat ini?

Mengapa Anda membutuhkan ruang memori virtual dua kali lipat daripada memori fisik yang sebenarnya bisa Anda tangani?

gsi-frank
sumber
Anda juga dapat menambahkan swap.
Thorbjørn Ravn Andersen
2
itu banyak RAM ...
dalearn
4
@dalearn - Anda tahu, ketika saya pertama kali belajar bahwa Anda bisa mendapatkan ekspansi memori Bank-switched untuk 8-bit mikro yang membiarkan mereka memiliki hingga 4096KB, saya mengatakan persis hal yang sama ...
Jules

Jawaban:

35

Batas-batas itu tidak datang dari Debian atau dari Linux, mereka datang dari perangkat keras. Arsitektur yang berbeda (prosesor dan bus memori) memiliki keterbatasan yang berbeda.

Pada prosesor PC x86-64 saat ini, MMU memungkinkan 48 bit ruang alamat virtual . Itu berarti bahwa ruang alamat dibatasi hingga 256TB. Dengan satu bit untuk membedakan alamat kernel dari alamat userland, yang meninggalkan 128TB untuk ruang alamat proses.

Pada prosesor x86-64 saat ini, alamat fisik dapat menggunakan hingga 48 bit , yang berarti Anda dapat memiliki hingga 256TB. Batas semakin meningkat sejak arsitektur amd64 diperkenalkan (dari 40 bit jika saya ingat dengan benar). Setiap bit ruang alamat membutuhkan logika pengkabelan dan penguraian ulang (yang membuat prosesor lebih mahal, lebih lambat dan lebih panas), sehingga produsen perangkat keras memiliki insentif untuk mempertahankan ukurannya.

Linux hanya memperbolehkan alamat fisik naik ke 2 ^ 46 (jadi Anda hanya bisa memiliki hingga 64TB) karena itu memungkinkan memori fisik untuk sepenuhnya dipetakan dalam ruang kernel. Ingat bahwa ada 48 bit ruang alamat; satu bit untuk kernel / pengguna meninggalkan 47 bit untuk ruang alamat kernel. Separuh dari itu paling banyak menangani memori fisik secara langsung, dan setengahnya lagi memungkinkan kernel untuk memetakan apa pun yang dibutuhkan. (Linux dapat mengatasi memori fisik yang tidak dapat dipetakan secara penuh pada saat yang sama, tetapi itu memperkenalkan kompleksitas tambahan, jadi itu hanya dilakukan pada platform yang membutuhkannya, seperti x86-32 dengan PAE dan armv7 dengan LPAE.)

Ini berguna untuk memori virtual menjadi lebih besar dari memori fisik karena beberapa alasan:

  • Ini memungkinkan kernel memetakan seluruh memori fisik, dan memiliki ruang tersisa untuk mappins virtual.
  • Selain pemetaan memori fisik, ada pemetaan swap, file, dan driver perangkat.
  • Ini berguna untuk memiliki memori yang belum dipetakan di tempat: halaman penjaga untuk menangkap buffer overflows , zona besar yang belum dipetakan karena ASLR , dll.
Gilles 'SANGAT berhenti menjadi jahat'
sumber
9
Batasan 46-bit pada memori fisik terkait dengan peta memori Linux : itu termasuk pemetaan penuh memori fisik dalam ruang kernel, yang berarti memori fisik hanya dapat sesuai dengan seperempat dari ruang alamat yang tersedia.
Stephen Kitt
Adakah yang bisa menguraikan komentar @StephenKitt? Saya sangat tertarik untuk memahami itu tetapi bahkan setelah membaca referensi yang ia kutip saya tidak mengerti;)
gsi-frank
@ gsi-frank Lebih mudah bagi kernel untuk memetakan seluruh memori fisik secara permanen. Jadi dalam ruang alamat 2 ^ 48, 2 ^ 47 pergi ke alamat userland, 2 ^ 46 pergi ke alamat kernel dan 2 ^ 46 adalah untuk pengalamatan memori fisik.
Gilles 'SANGAT berhenti menjadi jahat'
@ gsi-frank Jika Anda dapat memperoleh salinan buku klasik " Mengembangkan Sistem Operasi 32-bit Anda sendiri ", itu masuk ke kedalaman substansial tentang alasan penulis membuat keputusan serupa untuk OS sendiri (dalam kasus itu, membagi ruang alamat virtual 4GiB dari 80386 menjadi segmen kernel 2GiB yang berisi pemetaan RAM fisik 1GiB dan segmen pengguna 2GiB). Siapa pun yang tertarik dengan OS internal mungkin harus membacanya - ia menyediakan desain lengkap yang cukup sederhana untuk dipahami tetapi cukup maju untuk menjadi kernel OS yang berguna.
Jules
Sejak versi 4.13 dari kernel, x86-64 (dan beberapa arsitektur lainnya) dapat dibangun dengan pagetable lima tingkat , yang meningkatkan ruang alamat pada x86-64 menjadi 52 bit untuk RAM fisik, dan 57 bit untuk virtual (4 PiB / 128 PiB). Perhatikan bahwa peta memori dalam ruang kernel memperkenalkan masalah keamanan sehingga kemungkinan akan berubah dalam waktu dekat.
Stephen Kitt
9

Saya tidak tahu mengapa, tetapi saya dapat memikirkan tujuh alasan mengapa akan bermanfaat untuk mendukung ruang alamat dua kali lebih banyak daripada memori fisik.

  1. Yang pertama adalah agar Anda dapat menjalankan aplikasi yang membutuhkan memori ekstra - bahkan jika itu berarti bertukar ke disk.
  2. Tata letak memori yang lebih bersih untuk penggunaan memori partisi. Misalnya, OS mungkin mengambil alamat bernomor lebih tinggi dan meninggalkan alamat bernomor lebih rendah untuk aplikasi untuk membuat pemisahan lebih bersih.
  3. Pengacakan tata letak ruang alamat sedikit lebih efektif.
  4. Menandai halaman sebagai executable dapat berarti memori yang tersisa.
  5. Memori I / O yang dipetakan.
  6. Alokasi memori lebih mudah: seseorang dapat mengalokasikan potongan yang lebih besar sekaligus.
  7. Mengurangi fragmentasi memori
lungj
sumber
1
Terima kasih! 1) sangat jelas dan mendasar sehingga saya merasa malu untuk pertanyaan itu;)
gsi-frank
2
(3) juga sangat penting. Anda benar - benar menginginkan ruang alamat virtual yang urutan besarnya lebih besar dari jumlah memori yang akan Anda alokasikan sehingga tebakan acak hampir pasti menghasilkan jebakan.
R ..
6

Itu adalah batasan perangkat keras. Perangkat keras x86_64 / amd64 saat ini memungkinkan alamat virtual 48-bit dan berbagai ukuran (tergantung pada implementasinya — mis. Workstation saya di sini hanya mendukung 36 bit) alamat fisik. Kernel Linux membagi ruang alamat virtual menjadi dua (menggunakan setengah untuk kernel, setengah untuk userspace — seperti halnya pada x86).

Jadi, Anda mendapatkan:

2⁴⁸ byte ÷ 2 = 2⁴⁷ byte = 128 TiB

Ukuran alamat fisik seringkali lebih kecil karena sebenarnya fisik. Ini membutuhkan pin / pembalut, transistor, koneksi, dll., Pada / di CPU dan melacak garis di papan tulis. Mungkin juga sama di chipset. Tidak masuk akal untuk mendukung jumlah ram yang tidak dapat dibayangkan selama masa pakai inti prosesor atau soket — semua hal itu membutuhkan biaya. (Bahkan dengan 32 slot DIMM dan 64MMB DIMM di masing-masing, Anda masih hanya pada 2TiB. Bahkan jika kapasitas DIMM berlipat ganda setiap tahun, kami berjarak 5 tahun dari 64TiB.

Seperti yang ditunjukkan oleh Peter Cordes , orang-orang sekarang melampirkan penyimpanan non-volatil seperti 3D XPoint ke bus memori, yang membuat kehabisan ruang alamat dapat dilakukan. Prosesor yang lebih baru telah memperluas ruang alamat fisik menjadi 48 bit; mungkin saja wiki Debian belum diperbarui.

derobert
sumber
Penyimpanan non-volatile yang terhubung langsung ke bus memori (misalnya 3D XPoint) menjadi suatu hal, dan ini dapat sangat meningkatkan permintaan untuk ruang alamat fisik dalam beberapa tahun ke depan (karena lebih padat daripada DRAM, dan sangat berguna untuk memiliki banyak muatan kapal) dalam banyak kasus lebih baik memiliki RAM yang banyak). Lihat zdnet.com/article/the-non-volatile-memory-revolution untuk artikel yang tidak terlalu teknis (atau google untuk hal-hal yang lebih baik). Intel Skylake mendukungnya dengan clflushdan clflushoptinstruksinya.
Peter Cordes
1
Anda sudah dapat membeli sistem dengan RAM hingga 12TiB dalam 96 slot ( misalnya, sistem empat soket HPC Tyan ), jadi 64TiB mungkin kurang dari lima tahun lagi. Dan beberapa orang membelinya dan menyesuaikannya dengan RAM
Stephen Kitt
@StephenKitt hmm, tidak apa-apa karena kapasitas DIMM lebih dekat 3 tahun menjadi dua kali lipat 😁
derobert
Ternyata Anda benar-benar dapat membeli sistem dengan RAM 64 TiB sekarang.
Stephen Kitt