เคอร์เนลป้องกันโปรแกรมที่เป็นอันตรายจากการอ่าน RAM ทั้งหมดได้อย่างไร


10

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

ฉันคุ้นเคยกับสถาปัตยกรรมซีพียูขนาดเล็กที่รหัสแอสเซมบลีใด ๆ สามารถเข้าถึงทุกสิ่งได้ ฉันไม่เข้าใจว่าโปรแกรม (เคอร์เนล) สามารถตรวจจับการดำเนินการที่เป็นอันตรายดังกล่าวได้อย่างไร


2
โดยทั่วไปแล้ว MMU จะดูแลไม่ให้คุณเข้าถึงหน่วยความจำนอกพื้นที่ที่อนุญาต
ott--

1
ทีนี้ MMU ได้รับการกำหนดค่าโดยแอสเซมบลี ดังนั้นรหัสชุดประกอบสามารถเปลี่ยนการกำหนดค่า MMU และเข้าถึงหน้าหน่วยความจำอื่นใช่ไหม
nowox

สิ่งนี้จะเกิดขึ้นได้ก็ต่อเมื่อคุณเรียกใช้โค้ดในฐานะรูท
ott--

2
คุณควรอ่านเกี่ยวกับหน้าตารางและสิ่งที่เป็นนามธรรมในเคอร์เนล
Clarus

@ott: แม้รากไม่สามารถแก้ไข MMU (อย่างน้อยไม่ได้อยู่บน Linux) เคอร์เนลเท่านั้นที่ทำ
Basile Starynkevitch

คำตอบ:


12

ไม่ใช่เคอร์เนลที่ป้องกันการเข้าถึงหน่วยความจำไม่ดี แต่เป็น CPU บทบาทของเคอร์เนลมีเพียงการกำหนดค่า CPU อย่างถูกต้อง

อีกอย่างแม่นยำส่วนประกอบฮาร์ดแวร์ที่ป้องกันไม่ให้หน่วยความจำที่ไม่ดีเข้าถึงเป็นMMU เมื่อโปรแกรมเข้าถึงที่อยู่หน่วยความจำที่อยู่จะถูกถอดรหัสโดย CPU โดยยึดตามเนื้อหาของ MMU MMU สร้างการแปลจากที่อยู่เสมือนไปยังที่อยู่ทางกายภาพ: เมื่อ CPU ทำการโหลดหรือที่เก็บที่อยู่เสมือนที่แน่นอนจะคำนวณที่อยู่ทางกายภาพที่สอดคล้องตามเนื้อหา MMU เคอร์เนลตั้งค่าการกำหนดค่า MMU ในลักษณะที่แต่ละโปรแกรมสามารถเข้าถึงหน่วยความจำที่มีสิทธิ์เท่านั้น หน่วยความจำของโปรแกรมอื่นและการลงทะเบียนฮาร์ดแวร์ไม่ได้ถูกแมปในหน่วยความจำของโปรแกรมเลย: ที่อยู่จริงเหล่านี้ไม่มีที่อยู่เสมือนที่สอดคล้องกันในการกำหนดค่า MMU สำหรับโปรแกรมนั้น

บนการสลับบริบทระหว่างกระบวนการต่าง ๆ เคอร์เนลจะแก้ไขการกำหนดค่า MMU เพื่อให้มีการแปลที่ต้องการสำหรับกระบวนการใหม่

ที่อยู่เสมือนบางอันไม่ได้ถูกแมปเลยนั่นคือ MMU แปลให้เป็นค่าพิเศษ“ ไม่มีที่อยู่ดังกล่าว” เมื่อตัวประมวลผลถูกยกเลิกการกำหนดแอดเดรสที่ไม่ได้แมปสิ่งนี้จะทำให้กับดัก: ตัวประมวลผลแยกไปยังตำแหน่งที่กำหนดไว้ล่วงหน้าในโค้ดเคอร์เนล กับดักบางชนิดนั้นถูกกฎหมาย ตัวอย่างเช่นที่อยู่เสมือนสามารถสอดคล้องกับหน้าเว็บที่อยู่ในพื้นที่สว็อปซึ่งในกรณีที่รหัสเคอร์เนลจะโหลดเนื้อหาของหน้าจากการสลับจากนั้นสลับกลับไปที่โปรแกรมต้นฉบับในลักษณะที่คำสั่งการเข้าถึงหน่วยความจำถูกดำเนินการอีกครั้ง กับดักอื่น ๆ นั้นไม่ถูกต้องตามกฎหมายซึ่งในกรณีนี้กระบวนการได้รับสัญญาณซึ่งโดยค่าเริ่มต้นจะฆ่าโปรแกรมทันที (และถ้าไม่แยกไปที่ตัวจัดการสัญญาณในโปรแกรม: ในกรณีใด ๆ คำสั่งการเข้าถึงหน่วยความจำไม่สมบูรณ์)


คุณสามารถระบุคำสั่งเล็กน้อย"ที่อยู่นี้ถูกถอดรหัสโดย CPU ตามเนื้อหาของ MMU"หรือไม่? มีรหัสจริงในโปรแกรมที่ทำงานซึ่งถอดรหัสที่อยู่หรือไม่ หรือเมื่อ CPU ทำการเข้าถึงที่อยู่ - การเข้าถึงถูกทำกับ MMU ซึ่งแปล / จัดการอย่างถูกต้อง (ทำให้การเข้าถึงหน่วยความจำหรือแคชและส่งคืนผลลัพธ์หรือทำให้เกิดกระบวนการเคอร์เนล)? ดังนั้นจากมุมมองของไมโครคอนโทรลเลอร์ / แอสเซมบลี MMU เป็นส่วนใหม่ CPU ไม่ได้เชื่อมต่อโดยตรงกับหน่วยความจำมันถูกเชื่อมต่อกับ MMU และนั่นเป็นที่ที่การทำนามธรรมของหน่วยความจำเสมือนเสร็จสิ้น
xealits

3
@ xealits การแปลจากที่อยู่เสมือนเป็นที่อยู่ทางกายภาพเสร็จสิ้นภายใน MMU ซึ่งเป็นวงจรฮาร์ดแวร์ ไม่มีรหัสให้ทำในโปรแกรมหรือในเคอร์เนล เคอร์เนลถูกเรียกใช้เฉพาะในกรณีพิเศษเมื่อโปรแกรมพยายามเข้าถึงที่อยู่เสมือนซึ่งรายการ MMU ระบุว่า“ ที่อยู่ไม่ถูกต้อง” เคอร์เนลยังทำงานของการกำหนดค่ารีจิสเตอร์และตารางใน RAM ที่ MMU ใช้
Gilles 'หยุดชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.