การป้องกันหน่วยความจำจาก CPU: มันทำงานอย่างไร?

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

เมื่อถึงจุดหนึ่งในวิวัฒนาการซีพียูเริ่มใช้ระบบป้องกันหน่วยความจำที่แยกส่วนที่อยู่ไปยัง แรม ออกเป็นหลายส่วน หากต้องการทำความเข้าใจคุณต้องจินตนาการว่ามีพื้นที่ใกล้เคียงสำหรับการใช้งานเฉพาะในเมืองและกองกำลังตำรวจที่ป้องกันไม่ให้เข้าถึงพื้นที่ใกล้เคียงดังกล่าวสำหรับผู้ที่ไม่สามารถใช้งานได้ประชาชนจะได้รับสิทธิพิเศษในการใช้กระบวนการทั้งหมดของระบบปฏิบัติการ .

การป้องกันหน่วยความจำจาก CPU

เหตุใดจึงจำเป็นต้องมีการป้องกันหน่วยความจำ

การป้องกันหน่วยความจำกลายเป็นสิ่งจำเป็นในซีพียูของพีซีทันทีที่จำเป็นในการสร้างสภาพแวดล้อมมัลติทาสก์ซึ่งหลายโปรแกรมใช้ร่วมกันในการเข้าถึงหน่วยความจำในการเปลี่ยนแปลงที่แตกต่างกัน ในช่วงปีแรก ๆ ของการใช้คอมพิวเตอร์นั้นมีโปรแกรมงานเดียวที่ทำหน้าที่ของระบบปฏิบัติการในเวลาเดียวกันโดยเฉพาะบนคอมพิวเตอร์ในบ้านแบบ 8 และ 16 บิตที่ใช้ MOS 6502 และ Z80A

Proteccion Memoria Guru การทำสมาธิ

กรณีที่มีชื่อเสียงสำหรับการขาดการป้องกันหน่วยความจำในไฟล์ ซีพียู เรามีอยู่ใน Commodore Amiga แบบคลาสสิกซึ่งเวอร์ชันที่ใช้มาตรฐาน 68K เคยเกิดปัญหาอย่างต่อเนื่องเนื่องจากการใช้งานระบบปฏิบัติการมัลติทาสก์บน CPU โดยไม่มีการป้องกันหน่วยความจำเช่นเดียวกับที่เกิดขึ้นกับ Apple Macintosh ภายใต้โปรเซสเซอร์เดียวกัน

ปัจจุบันซีพียูทั้งหมดรวมการป้องกันหน่วยความจำโดยต้องรันระบบปฏิบัติการมัลติทาสก์ที่ซับซ้อนสูงซึ่งจำนวนกระบวนการพร้อมกันเป็นหลักพัน

การป้องกันหน่วยความจำทำงานอย่างไร?

ตารางหน้า

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

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

ต้องคำนึงว่า Page Table ไม่เพียง แต่มีข้อมูลเกี่ยวกับองค์กรหน่วยความจำตลอดจนส่วนการเข้าถึงที่มีสิทธิพิเศษเท่านั้น แต่ยังรวมถึงสถานการณ์ของ RAM ตลอดเวลาด้วย การจัดการดำเนินการโดยเคอร์เนลเธรดของระบบปฏิบัติการซึ่งรับผิดชอบในการกำหนดทรัพยากรที่แตกต่างกันให้กับโปรแกรมที่ใช้งานอยู่ไม่ว่าจะในรูปแบบของเวลาดำเนินการของ CPU หรือการเข้าถึงหน่วยความจำ

โปรแกรมคัดค้าน

ซิสเทมาบินาริโอ

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

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

บิตไม่มีการดำเนินการ

บิตนี้บนซีพียู x86 เรียกว่า No-Execute หรือบิต NX นี่เป็นมาตรการรักษาความปลอดภัยที่ง่ายมากที่ระบบปฏิบัติการสามารถจัดการได้ แต่ไม่ใช่เพียงมาตรการเดียวที่ระบบปฏิบัติการมีไว้เพื่อป้องกันการเรียกใช้รหัสที่ไม่ถูกต้อง แม้ว่ากลไกการป้องกันจะไม่ทำงานเสมอไปและยังมีกลไกอื่น ๆ ที่ CPU ทำให้หน่วยความจำที่ได้รับการป้องกันสับสนกับแอปพลิเคชัน

ตัวอย่างเช่นระบบปฏิบัติการกำหนดบิตการเข้าถึงพิเศษสำหรับเธรดทั้งหมดให้ตัวเอง เมื่อแอปพลิเคชันที่ไม่มีสิทธิ์ได้รับมอบหมายให้เข้าถึง RAM ที่ได้รับการป้องกันโดยการเปลี่ยนบิตการเข้าถึงสิ่งที่ระบบปฏิบัติการทำคือคืนค่าบิตนั้นโดยการจัดการส่วนที่สอดคล้องกับแอปพลิเคชันในตารางหน้า

CPU รับ Page Table ได้อย่างไร?

ไบออส

โปรแกรมแรกที่รันบนพีซีไม่ว่าจะมีรูปแบบใดก็ตามคือระบบปฏิบัติการ ระบบที่ซับซ้อนกว่าบางระบบจะโหลดระบบแสดงตัวอย่างที่เปิดเครื่องฮาร์ดแวร์และส่งคำให้การไปยังระบบปฏิบัติการในลักษณะปลอมตัว กระบวนการนี้ไม่ได้ขึ้นอยู่กับฮาร์ดแวร์ แต่ฮาร์ดแวร์ทั้งหมดมีที่อยู่หน่วยความจำที่เริ่มต้นและจากที่นั่นจะเดินทางผ่านหน่วยความจำในทิศทางเดียวหรืออีกทางหนึ่งขึ้นอยู่กับว่าเรากำลังจัดการกับซีพียู Big Endian หรือ Little Endian

ดังนั้นในที่อยู่หน่วยความจำเหล่านี้จะต้องมีข้อมูลเพื่อเริ่มต้นพีซีซึ่งวันนี้คือ UEFI แต่ในจุดเริ่มต้นมันคือ BIOS ซึ่งทำหน้าที่เป็นตัวเปิดสำหรับระบบปฏิบัติการ แต่ระบบปฏิบัติการได้รับสถานการณ์ RAM ที่ไหน? มันทำได้โดยใช้สองตารางที่เก็บไว้ในไฟล์ เมนบอร์ด ชิปเซ็ตที่เรียกว่าตาราง ACPI

ชิปเซ็ต integrado

ACPI เป็นกลไกแรกที่รับผิดชอบในการจัดการการเข้าถึงหน่วยความจำของอุปกรณ์ต่อพ่วงและการจัดระเบียบของ RAM ในการทำเช่นนี้จะส่งตารางสองตารางไปยังระบบปฏิบัติการที่มีฟังก์ชันเดียวกัน ตารางเหล่านี้คือ:

  • RSDT (ตารางตัวอธิบายระบบรูท)
  • XSDT (Extended Root System Descriptor Table)

หากระบบปฏิบัติการเป็น 32 บิตระบบจะให้ RSDT แก่คุณถ้าเป็น 64 บิต XSDT จากนั้นระบบปฏิบัติการจะมีทุกสิ่งที่จำเป็นสำหรับจัดการการเข้าถึงหน่วยความจำด้วยโปรเซสเซอร์อยู่แล้ว

ระบบปฏิบัติการเป็นพระมหากษัตริย์

Windows

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

สิ่งนี้ทำให้เกิดปัญหาหลายอย่างเกี่ยวกับการเข้าถึงหน่วยความจำในระบบเวอร์ชวลไลซ์ซึ่งทำให้ต้องเพิ่มบิตเพิ่มเติมในการกำหนดแอดเดรสหน่วยความจำเสมือนซึ่งทำหน้าที่ระบุระดับสิทธิ์พิเศษสำหรับแอปพลิเคชันที่ทำงานในเครื่องเสมือนให้ CPU ทราบ .

ในการทำเช่นนี้ไม่เพียง แต่จะต้องติดตั้ง CPU ให้พร้อมกับความเป็นไปได้นี้เท่านั้น แต่ยังมีผลต่อวิธีการจัดระบบปฏิบัติการด้วย ระบบปฏิบัติการในระบบคลาวด์มักจะเรียกใช้ไฮเปอร์ไวเซอร์ซึ่งมีหน้าที่จัดการการเข้าถึง RAM ของเครื่องเสมือนต่างๆ