เหตุใดส่วนข้อมูลและรหัสจึงทับซ้อนกันอย่างสมบูรณ์ใน Linux


5

บริบท: ฉันกำลังอ่าน "การทำความเข้าใจกับเคอร์เนล Linux, 3d ed" ซึ่งใช้เคอร์เนล 2.6.11

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

ตารางคำอธิบายส่วนกลางของ Linux ประกอบด้วยส่วนของรหัสผู้ใช้และส่วนข้อมูล แต่ที่อยู่พื้นฐานของทั้งสองเซ็กเมนต์คือ0x0และขนาดก็เหมือนกัน ดังนั้นพวกเขาจึงทับซ้อนกันอย่างสมบูรณ์ ดังนั้นอย่างที่ฉันเข้าใจที่อยู่ทางลอจิคัลcs + offsetเหมือนกับที่อยู่แบบลอจิคัลds + offsetที่ไหนcsและdsมีการลงทะเบียน CPU ที่เก็บตัวเลือกเซ็กเมนต์รหัสและตัวเลือกเซ็กเมนต์ข้อมูลตามลำดับ ฉันคิดว่าเป็นกรณีนี้เพราะทั้งสองเซ็กเมนต์มีที่อยู่ฐานเดียวกันซึ่งเพิ่มขึ้นด้วยออฟเซ็ตเพื่อรับที่อยู่เชิงเส้น

หากเป็นกรณีนี้และพวกเขาทั้งคู่แมปไปยังที่อยู่เชิงเส้นเดียวกันพวกเขาจะแมปไปยังที่อยู่ทางกายภาพเดียวกันหรือไม่ ถ้าเป็นเช่นนั้นการใช้การแยกcsและการdsลงทะเบียนคืออะไร?

คำตอบ:


5

การแบ่งกลุ่มการลงทะเบียนเป็นมรดกจากวันแรก ๆ ของโปรเซสเซอร์ x86 เมื่อoffsetขนาดไม่ใหญ่พอที่จะจัดการกับหน่วยความจำทั้งหมดที่โปรเซสเซอร์สามารถจัดการได้ 8086ดั้งเดิมมีพื้นที่ที่อยู่ 20 บิต แต่สามารถใช้ออฟเซ็ต 16 บิตเท่านั้น คุณต้องใช้การลงทะเบียนเซกเมนต์เพื่อระบุ 64KB ของพื้นที่ที่อยู่ 1024KB ที่คุณต้องการ เซ็กเมนต์รีจิสเตอร์เป็นรีจิสเตอร์ 20 บิตอย่างมีประสิทธิภาพโดยที่ 4 บิตต่ำสุดถูกบังคับให้เป็น 0 การโหลดรีจิสเตอร์เซ็กเมนต์ตั้งค่า 16 บิตบนของรีจิสเตอร์ สิ่งนี้ได้รับอนุญาตsegment + offsetให้ครอบคลุมพื้นที่ที่อยู่ 20 บิตทั้งหมด

การลงทะเบียนกลุ่มยังคงมีอยู่ แต่ Linux ตั้งค่าเป็น 0 เพื่อให้สามารถทำเป็นว่าไม่มี โปรเซสเซอร์ x86 ที่ทันสมัย ​​(หมายถึง80386และใหม่กว่า) สามารถใช้ออฟเซ็ตใหญ่พอที่จะครอบคลุมพื้นที่ที่อยู่ทั้งหมดทำให้การแบ่งเซ็กเมนต์หน่วยความจำเป็นเรื่องยุ่งยากที่ไม่จำเป็นอีกต่อไป อ่านการแบ่งส่วนหน่วยความจำ x86และรุ่นหน่วยความจำแบบแบนสำหรับรายละเอียดเพิ่มเติม


ดังนั้น linux จะใช้การเพจเท่านั้นและไม่มีการแบ่งส่วนในการจัดการหน่วยความจำ?
codd

ใช่ที่ถูกต้อง.
cjm

ที่จริงแล้วเรามีการจัดเรียงของการกลับไปใช้โมเดลเหมือนเซ็กเมนต์ที่มี PAE ซึ่งพื้นที่แอดเดรส 64G (36 บิต) สามารถแก้ไขได้ใน 4G ชิ้นโดยแอปพลิเคชันเท่านั้น
Ruslan

@cjm ฉันขอขยายคำถามนี้ได้ไหม เมื่อได้รับที่อยู่ทางกายภาพ 20 บิตโดยการเพิ่ม (ส่วน 16 บิต << 4) และออฟเซ็ต 16 บิตนั่นไม่ได้หมายความว่าจะสามารถรับที่อยู่ทางกายภาพหนึ่งรายการจากหลายส่วนของคู่ที่แตกต่างกัน ตัวอย่างเช่น ... 1010 + 0011 = 101011 และ 1000 + 1011 = 101011
LukášŘádek

@ LukášŘádekใช่แล้วมันเป็นเรื่องจริงและฉันแน่ใจว่ามีซอฟต์แวร์ที่ทำเช่นนั้นด้วยเหตุผลหลายประการ การแบ่งส่วนการลงทะเบียนไม่ได้เกี่ยวกับการป้องกันหน่วยความจำ แต่เป็นการขยายพื้นที่ที่อยู่
cjm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.