ทำไม Debian Linux อนุญาตพื้นที่ที่อยู่เสมือนสูงสุด 128TiB ต่อกระบวนการ แต่เพียงหน่วยความจำฟิสิคัล 64TiB


23

ฉันเพิ่งอ่านที่นี่ :

  • พื้นที่แอดเดรสเสมือนสูงสุด 128TiB ต่อกระบวนการ (แทน 2GiB)
  • รองรับหน่วยความจำฟิสิคัล 64TiB แทน 4GiB (หรือ 64GiB ที่มีนามสกุล PAE)

ทำไมถึงเป็นอย่างนั้น? ฉันหมายถึงการสนับสนุนหน่วยความจำกายภาพถูก จำกัด โดยเคอร์เนลหรือโดยฮาร์ดแวร์ปัจจุบัน

ทำไมคุณต้องการพื้นที่หน่วยความจำเสมือนสองเท่ากว่าหน่วยความจำกายภาพที่คุณสามารถระบุได้จริง


คุณยังสามารถเพิ่มการสลับ
Thorbjørn Ravn Andersen

2
ที่มากของแรม ...
dalearn

4
@dalearn - คุณรู้เมื่อครั้งแรกที่ผมได้เรียนรู้ว่าคุณจะได้รับการขยายตัวหน่วยความจำธนาคาร-switched สำหรับไมโคร 8 บิตที่ให้พวกเขามีถึง 4096KB ผมพูดว่าสิ่งเดียวกัน ...
จูลส์

คำตอบ:


35

ข้อ จำกัด เหล่านั้นไม่ได้มาจาก Debian หรือ Linux แต่มาจากฮาร์ดแวร์ สถาปัตยกรรมที่แตกต่างกัน (โปรเซสเซอร์และบัสหน่วยความจำ) มีข้อ จำกัด ต่างกัน

โปรเซสเซอร์ PC x86-64 ปัจจุบัน MMU ช่วย48 บิตของพื้นที่ที่อยู่เสมือน นั่นหมายความว่าพื้นที่ที่อยู่ถูก จำกัด ไว้ที่ 256TB ด้วยหนึ่งบิตเพื่อแยกความแตกต่างของเคอร์เนลที่อยู่จากที่อยู่ของผู้ใช้นั้นจะเหลือ 128TB สำหรับพื้นที่ที่อยู่ของกระบวนการ

บนโปรเซสเซอร์ x86-64 ปัจจุบันฟิสิคัลแอดเดรสสามารถใช้สูงสุด 48 บิตซึ่งหมายความว่าคุณสามารถมีสูงสุด 256TB ขีด จำกัด เพิ่มขึ้นอย่างต่อเนื่องตั้งแต่เปิดตัวสถาปัตยกรรม amd64 (จาก 40 บิตหากฉันจำได้ถูกต้อง) พื้นที่ที่อยู่แต่ละบิตมีค่าใช้จ่ายในการเดินสายและถอดรหัสตรรกะ (ซึ่งทำให้โปรเซสเซอร์มีราคาแพงช้าลงและร้อนขึ้น) ดังนั้นผู้ผลิตฮาร์ดแวร์จึงมีแรงจูงใจที่จะลดขนาดลง

Linux อนุญาตให้ที่อยู่ทางกายภาพสูงถึง 2 ^ 46 เท่านั้น (ดังนั้นคุณสามารถมีได้มากถึง 64TB) เพราะจะทำให้หน่วยความจำทางกายภาพถูกแมปในพื้นที่เคอร์เนลทั้งหมด โปรดจำไว้ว่าพื้นที่ที่อยู่มี 48 บิต หนึ่งบิตสำหรับเคอร์เนล / ผู้ใช้มี 47 บิตสำหรับพื้นที่แอดเดรสเคอร์เนล ครึ่งหนึ่งของที่อยู่หน่วยความจำกายภาพส่วนใหญ่โดยตรงและอีกครึ่งหนึ่งช่วยให้เคอร์เนลแผนที่สิ่งที่มันต้องการ (Linux สามารถรับมือกับหน่วยความจำกายภาพที่ไม่สามารถแมปได้เต็มรูปแบบในเวลาเดียวกัน แต่มีความซับซ้อนเพิ่มขึ้นดังนั้นจึงทำเฉพาะในแพลตฟอร์มที่ต้องการเช่นx86-32 กับ PAEและ armv7 กับ LPAE)

มันมีประโยชน์สำหรับหน่วยความจำเสมือนที่จะใหญ่กว่าหน่วยความจำกายภาพด้วยเหตุผลหลายประการ:

  • มันช่วยให้เคอร์เนลแมปหน่วยความจำกายภาพทั้งหมดและมีพื้นที่เหลือสำหรับการแม็พเสมือน
  • นอกเหนือจากการแมปหน่วยความจำกายภาพแล้วยังมีการแมปสลับไฟล์และไดรเวอร์อุปกรณ์
  • มีประโยชน์ที่จะมีหน่วยความจำที่ไม่ได้แมปอยู่ในสถานที่: ปกป้องเพจเพื่อดักจับบัฟเฟอร์โอเวอร์โฟลต์โซนที่ไม่ได้แมปขนาดใหญ่เนื่องจากASLRเป็นต้น

9
ข้อ จำกัด ของหน่วยความจำฟิสิคัล 46 บิตนั้นเกี่ยวข้องกับแม็พหน่วยความจำ Linux : ซึ่งรวมถึงการแม็พหน่วยความจำฟิสิคัลแบบเต็มในพื้นที่เคอร์เนลซึ่งหมายความว่าหน่วยความจำฟิสิคัลสามารถสอดคล้องกับพื้นที่แอดเดรสหนึ่งในสี่
Stephen Kitt

ใครช่วยอธิบายเกี่ยวกับความคิดเห็น @StephenKitt ได้ไหม ฉันสนใจมากที่จะเข้าใจว่า แต่หลังจากอ่านข้อมูลอ้างอิงแล้วเขาก็อ้างว่าฉันไม่เข้าใจ;)
gsi-frank

@ gsi-frank สะดวกสำหรับเคอร์เนลที่จะทำการแมปหน่วยความจำกายภาพทั้งหมดอย่างถาวร ดังนั้นในพื้นที่ที่อยู่ 2 ^ 48, 2 ^ 47 จะไปยังที่อยู่ของผู้ใช้ 2 ^ 46 ไปที่ที่อยู่เคอร์เนลและ 2 ^ 46 ใช้สำหรับการกำหนดที่อยู่หน่วยความจำกายภาพ
Gilles 'หยุดความชั่วร้าย' ใน

@ gsi-frank หากคุณได้รับสำเนาหนังสือคลาสสิก " การพัฒนาระบบปฏิบัติการ 32 บิตของคุณเอง " มันจะเจาะลึกลงไปมากเกี่ยวกับเหตุผลที่ผู้เขียนทำการตัดสินใจที่คล้ายกันสำหรับระบบปฏิบัติการของเขาเอง (ในกรณีนี้ การแบ่งพื้นที่ที่อยู่เสมือน 4GiB ของ 80386 เป็นเซ็กเมนต์เคอร์เนล 2GiB ที่มีการแมป RAM ทางกายภาพ 1GiB และส่วนผู้ใช้ 2GiB) ทุกคนที่สนใจในระบบปฏิบัติการภายในควรอ่านมัน - มันมีการออกแบบที่เรียบง่ายพอที่จะเข้าใจ แต่ขั้นสูงพอที่จะเป็นเคอร์เนลระบบปฏิบัติการที่มีประโยชน์
จูลส์

ตั้งแต่เวอร์ชั่น 4.13 ของเคอร์เนล x86-64 (และสถาปัตยกรรมอื่น ๆ ) สามารถสร้างได้ด้วยpagetables ห้าระดับซึ่งเพิ่มพื้นที่ที่อยู่บน x86-64 ถึง 52 บิตสำหรับ RAM จริงและ 57 บิตสำหรับเสมือน (4 PiB / 128 PiB) โปรดทราบว่าการแมปหน่วยความจำในพื้นที่เคอร์เนลนำเสนอปัญหาด้านความปลอดภัยดังนั้นจึงมีแนวโน้มที่จะเปลี่ยนแปลงในอนาคตอันใกล้
Stephen Kitt

9

ฉันไม่รู้ว่าทำไม แต่ฉันสามารถคิดได้เจ็ดเหตุผลว่าทำไมมันจะมีประโยชน์ในการสนับสนุนพื้นที่ที่อยู่สองเท่าของหน่วยความจำกายภาพ

  1. สิ่งแรกคือเพื่อให้คุณสามารถเรียกใช้แอปพลิเคชันที่ต้องการหน่วยความจำเพิ่มเติม - แม้ว่าจะหมายถึงการสลับไปยังดิสก์
  2. รูปแบบหน่วยความจำที่สะอาดขึ้นสำหรับการใช้งานหน่วยความจำพาร์ติชัน เช่นระบบปฏิบัติการอาจใช้ที่อยู่ที่มีหมายเลขสูงกว่าและปล่อยให้ที่อยู่ที่มีตัวเลขต่ำกว่าสำหรับแอปพลิเคชันเพื่อให้ตัวแยกสะอาดขึ้น
  3. การสุ่มเลย์เอาต์ของพื้นที่ที่อยู่นั้นมีประสิทธิภาพมากกว่า
  4. การทำเครื่องหมายหน้าเว็บเป็นไฟล์เรียกทำงานอาจหมายถึงหน่วยความจำเหลือ
  5. I / O ที่แมปหน่วยความจำ
  6. การจัดสรรหน่วยความจำง่ายกว่า: เราสามารถจัดสรรชิ้นที่ใหญ่กว่าได้ในแต่ละครั้ง
  7. การกระจายตัวของหน่วยความจำลดลง

1
ขอบคุณ! 1) เห็นได้ชัดและขั้นพื้นฐานที่ฉันรู้สึกอายสำหรับคำถาม;)
gsi-frank

2
(3) ก็สำคัญเช่นกัน คุณจริงๆต้องการพื้นที่ที่อยู่เสมือนว่าเป็นคำสั่งของขนาดใหญ่กว่าจำนวนหน่วยความจำที่คุณจะได้รับการจัดสรรเพื่อให้คาดเดาสุ่มเกือบแน่นอนส่งผลในกับดัก
..

6

นั่นคือข้อ จำกัด ของฮาร์ดแวร์ ฮาร์ดแวร์ x86_64 / amd64 ปัจจุบันให้ที่อยู่เสมือน 48- บิตและขนาดต่าง ๆ (ขึ้นอยู่กับการนำไปใช้งาน - เช่นเวิร์กสเตชันของฉันที่นี่รองรับเฉพาะ 36 บิต) เคอร์เนล Linux แบ่งพื้นที่ที่อยู่เสมือนครึ่งหนึ่ง (ใช้ครึ่งสำหรับเคอร์เนลครึ่งหนึ่งสำหรับพื้นที่ผู้ใช้เหมือนกับที่ทำบน x86)

ดังนั้นคุณจะได้รับ:

2⁴⁸ไบต์÷ 2 = 2⁴⁷ไบต์ = 128 TiB

ขนาดของที่อยู่ทางกายภาพมักจะเล็กกว่าเนื่องจากเป็นของจริง มันใช้หมุด / แผ่นทรานซิสเตอร์การเชื่อมต่อ ฯลฯ เปิด / ใน CPU และเส้นการติดตามบนกระดาน อาจเป็นเช่นเดียวกันในชิปเซ็ต มันไม่มีเหตุผลที่จะสนับสนุน ram จำนวนมากซึ่งไม่น่าจะเรียกได้ว่าอายุการใช้งานการออกแบบของคอร์หรือซ็อกเก็ต - สิ่งเหล่านี้เสียค่าใช้จ่าย (แม้จะมีช่อง 32 DIMM และ 64GiB DIMM ในแต่ละช่องคุณก็ยังคงอยู่ที่ 2TiB เท่านั้นแม้ว่าความจุ DIMM จะเพิ่มขึ้นเป็นสองเท่าต่อปีเราอยู่ห่างจาก 64TiB 5 ปี

ในขณะที่Peter Cordesชี้ให้เห็นว่าตอนนี้ผู้คนกำลังเชื่อมต่อที่จัดเก็บข้อมูลแบบไม่ลบเลือนเช่น3D XPointไปยังหน่วยความจำบัสซึ่งทำให้พื้นที่แอดเดรสไม่เพียงพอ โปรเซสเซอร์รุ่นใหม่ได้ขยายพื้นที่ที่อยู่ทางกายภาพเป็น 48 บิต เป็นไปได้ว่า Debian wiki เพิ่งไม่ได้รับการอัพเดต


ที่จัดเก็บข้อมูลแบบไม่ลบเลือนที่เชื่อมต่อโดยตรงกับหน่วยความจำบัส (เช่น 3D XPoint) กำลังกลายเป็นสิ่งหนึ่งและสิ่งนี้สามารถเพิ่มความต้องการพื้นที่ที่อยู่ทางกายภาพได้อย่างมากในอีกไม่กี่ปีข้างหน้า (เนื่องจากหนาแน่นกว่า DRAM และมีประโยชน์สำหรับ ในหลายกรณีมากกว่าจะเป็นประโยชน์ในการมี RAM ของเรือโหลด) ดูzdnet.com/article/the-non-volatile-memory-revolutionสำหรับบทความที่ไม่ค่อยมีเทคนิค (หรือ google เพื่อสิ่งที่ดีกว่า) Intel Skylake รองรับด้วยคำแนะนำclflushและ clflushopt
ปีเตอร์กอร์เดส

1
คุณสามารถซื้อระบบที่มี RAM สูงสุด 12TiB ใน 96 สล็อต ( ตัวอย่างเช่นระบบ HPC สี่ซ็อกเก็ตของ Tyan ) ดังนั้น 64TiB อาจน้อยกว่าห้าปี และบางคนจะซื้อพวกเขาและพอดีกับพวกเขาที่มี RAM มากว่า ...
สตีเฟ่นกิต

@StephenKitt อืมมันก็โอเคเพราะความจุ DIMM ใช้เวลาใกล้กับ 3 ปีในการเพิ่มเป็นสองเท่า😁
derobert

ปรากฎว่าคุณสามารถซื้อระบบด้วย 64 TiB of RAM ได้ทันที
Stephen Kitt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.