ทำไม x86 ซีพียูจึงใช้ 2 ใน 4 เสียงดัง?


13

ดังนั้นทั้งระบบ Linux หรือ Windows ที่ใช้ x86 จะใช้วงแหวน 0 สำหรับโหมดเคอร์เนลและแหวน 3 สำหรับโหมดผู้ใช้เท่านั้น เหตุใดโปรเซสเซอร์จึงแยกความแตกต่างของเสียงกริ่งที่แตกต่างกันสี่แบบถ้าพวกเขาทั้งหมดใช้เพียงสองเสียง และสิ่งนี้มีการเปลี่ยนแปลงในสถาปัตยกรรม AMD64 หรือไม่?


โดยวิธีการฉันขอแนะนำให้เปลี่ยนชื่อคำถามเป็น "ทำไมระบบปฏิบัติการ x86 ใช้เพียง 2 ใน 4 วง" หรืออาจจะ "ทำไมระบบปฏิบัติการบน x86 ซีพียูเท่านั้น ... " CPU ทำสิ่งที่ระบบปฏิบัติการบอกให้ทำเท่านั้น
เจมี่ Hanrahan

คัดลอกแล้ว: howtogeek.com/251081/…
เลิกทำ

คำตอบ:


16

มีสองเหตุผลหลัก

เหตุผลแรกคือแม้ว่า x86 CPUs จะเสนอการป้องกันหน่วยความจำสี่วง แต่การป้องกันที่มีระดับความละเอียดที่เสนอจึงอยู่ในระดับต่อเซ็กเมนต์เท่านั้น นั่นคือแต่ละเซ็กเมนต์สามารถตั้งค่าเป็นเสียงเรียกเข้าเฉพาะ ("ระดับสิทธิ์") จาก 0 ถึง 3 พร้อมกับการป้องกันอื่น ๆ เช่นการเขียนถูกปิดใช้งาน แต่ไม่มีตัวอธิบายเซกเมนต์จำนวนมากที่พร้อมใช้งาน ระบบปฏิบัติการส่วนใหญ่ต้องการให้มีการป้องกันหน่วยความจำที่ละเอียดยิ่งขึ้น กดไลค์ ... สำหรับแต่ละหน้า

ดังนั้นป้อนการป้องกันตามรายการตารางหน้า (PTE) ส่วนใหญ่ถ้าไม่ใช่ทุกระบบปฏิบัติการ x86 ที่ทันสมัยไม่มากก็น้อยก็เพิกเฉยต่อกลไกการแบ่งกลุ่ม (มากที่สุดเท่าที่จะทำได้) และพึ่งพาการป้องกันแบบ PTE นี่เป็นข้อมูลจำเพาะด้วยค่าสถานะบิตซึ่งต่ำกว่า 12 บิตในแต่ละ PTE - บวกบิต 63 บน CPU ที่ไม่สนับสนุนการดำเนินการ มีหนึ่ง PTE สำหรับแต่ละหน้าซึ่งปกติคือ 4K

หนึ่งในบิตตั้งค่าสถานะเหล่านี้เรียกว่าบิต "สิทธิพิเศษ" บิตนี้ควบคุมว่าตัวประมวลผลจะต้องอยู่ในระดับ "สิทธิ์" ระดับใดระดับหนึ่งเพื่อเข้าถึงหน้าหรือไม่ ระดับ "สิทธิพิเศษ" คือ PL 0, 1 และ 2 แต่เป็นเพียงหนึ่งบิตดังนั้นในระดับการป้องกันแบบทีละหน้าจำนวน "โหมด" ที่มีอยู่เท่าที่การป้องกันหน่วยความจำเกี่ยวข้องเพียงสอง: หน้า สามารถเข้าถึงได้จากโหมดที่ไม่มีสิทธิพิเศษหรือไม่ ดังนั้นเพียงสองวง

ในการมีสี่ริงที่เป็นไปได้สำหรับแต่ละหน้าพวกเขาจะต้องมีบิตการป้องกันสองรายการในแต่ละตารางเพจเพื่อเข้ารหัสหนึ่งในสี่หมายเลขริงที่เป็นไปได้ (เช่นเดียวกับตัวอธิบายเซกเมนต์) พวกเขาทำไม่ได้

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

มีเหตุผลที่สามที่เฉพาะเจาะจงสำหรับการพัฒนา Windows NT นักออกแบบของ NT (David Cutler และทีมงานของเขาซึ่ง Microsoft จ้างจาก DEC Western Region Labs) เคยมีประสบการณ์เกี่ยวกับ VMS มาก่อน ในความเป็นจริงมีดและอีกไม่กี่คนอยู่ในกลุ่มนักออกแบบดั้งเดิมของ VMS และหน่วยประมวลผล VAX ที่ VMS ได้รับการออกแบบ (และในทางกลับกัน) มีสี่วง VMS ใช้สี่วง (อันที่จริง VAX มีบิตการป้องกันสี่บิตใน PTE อนุญาตให้ใช้การรวมกันเช่น "อ่านอย่างเดียวจากโหมดผู้ใช้ แต่สามารถเขียนได้จากวงแหวน 2 และด้านใน" แต่ฉันพูดนอกเรื่อง)

แต่ส่วนประกอบที่วิ่งในวงแหวนของ VMS 1 และ 2 (Record Management Services และ CLI, resp.) ถูกปล่อยออกจากการออกแบบ NT Ring 2 ใน VMS ไม่ได้เกี่ยวกับความปลอดภัยของระบบปฏิบัติการ แต่เป็นการรักษาสภาพแวดล้อม CLI ของผู้ใช้จากโปรแกรมหนึ่งไปยังอีกโปรแกรมหนึ่งและ Windows NT ไม่ได้มีแนวคิดนั้น CLI ทำงานเป็นกระบวนการปกติ สำหรับแหวน VMS ของ 1 รหัส RMS ในริง 1 ต้องโทรเข้าวงแหวน 0 ค่อนข้างบ่อยและการเปลี่ยนวงแหวนนั้นมีราคาแพง มันกลับกลายเป็นว่ามีประสิทธิภาพมากกว่าเพียงแค่ไปที่ริง 0 และทำด้วยมันแทนที่จะมีการเปลี่ยนริง 0 จำนวนมากภายในรหัสริง 1 (อีกครั้ง - ไม่ใช่ NT มีอะไรอย่างเช่น RMS อยู่แล้ว)

แต่ทำไมพวกเขาถึงอยู่ที่นั่น? สำหรับสาเหตุที่ x86 ใช้สี่วงในขณะที่ระบบปฏิบัติการไม่ได้ใช้งาน - คุณกำลังพูดถึงระบบปฏิบัติการที่มีการออกแบบล่าสุดมากกว่า x86 คุณสมบัติ "การเขียนโปรแกรมระบบ" จำนวนมากของ x86 ได้รับการออกแบบมานานก่อนที่จะใช้งาน NT หรือเคอร์เนล Unix-ish จริงและพวกเขาไม่รู้ว่าจะใช้ระบบปฏิบัติการใด (มันไม่ได้จนกว่าเราจะเพจจิ้งใน x86 - ซึ่งไม่ได้แสดงจนถึง 80386 - ว่าเราสามารถใช้เมล็ด Unix-ish หรือ VMS ที่เหมือนจริงได้โดยไม่ต้องคิดทบทวนการจัดการหน่วยความจำตั้งแต่ต้น)

ไม่เพียง แต่ระบบปฏิบัติการ x86 ที่ทันสมัยส่วนใหญ่จะไม่สนใจการแบ่งเซ็กเมนต์ (พวกเขาเพิ่งตั้งค่าเซ็กเมนต์ C, D และ S พร้อมที่อยู่พื้นฐาน 0 และขนาด 4 GB; บางครั้งเซ็กเมนต์ F และ G ถูกใช้เพื่อชี้ไปยังโครงสร้างข้อมูลระบบปฏิบัติการหลัก) ส่วนใหญ่ไม่สนใจสิ่งต่าง ๆ เช่น "ส่วนสถานะงาน" กลไก TSS ได้รับการออกแบบมาอย่างชัดเจนสำหรับการสลับบริบทของเธรด แต่ปรากฎว่ามีผลข้างเคียงมากเกินไปดังนั้นระบบปฏิบัติการ x86 ที่ทันสมัยจึงใช้ "มือ" ครั้งเดียวที่ x86 NT เปลี่ยนงานฮาร์ดแวร์ตัวอย่างเช่นสำหรับเงื่อนไขที่ยอดเยี่ยมบางอย่างเช่นข้อผิดพลาดสองเท่า

อีกครั้ง x64 มีคุณสมบัติที่เลิกใช้เหล่านี้จำนวนมาก (จากเครดิตของพวกเขาเอเอ็มดีได้พูดคุยกับทีมงานเคอร์เนลระบบปฏิบัติการจริงและถามสิ่งที่พวกเขาต้องการจาก x86 สิ่งที่พวกเขาไม่ต้องการหรือไม่ต้องการและสิ่งที่พวกเขาต้องการเพิ่ม) เซ็กเมนต์บน x64 มีอยู่เฉพาะในสิ่งที่อาจเป็น เรียกว่าแบบฟอร์มร่องรอยการเปลี่ยนสถานะงานไม่มีอยู่ ฯลฯ และระบบปฏิบัติการยังคงใช้วงแหวนเพียงสองวง


1
ขอบคุณ! (ถ้าคุณไม่สามารถบอกได้ว่าฉันใช้เวลามากกว่าเวลาประมาณเคอร์เนล VMS ... )
Jamie Hanrahan

ใช่ฉันได้รับความประทับใจนี้ ... :-) ฉันรักเมื่อมีคนอย่างคุณที่มีความรู้ลึกซึ้งเกี่ยวกับบางสิ่งบางอย่างเขียนคำตอบแบบนี้นั่นคือประวัติศาสตร์ของไอทีและฉันชอบที่จะรู้ คำตอบของคุณจำฉันได้เมื่อฉันเป็นผู้ชายที่โรงเรียนเมื่อ 20 ปีก่อนและฉันซื้อ "คู่มืออ้างอิงโปรแกรมเมอร์โปรแกรมเมอร์ Intel 80268" จากนั้นคู่มืออ้างอิง 386 รายการ ฉันอ่านมากเกี่ยวกับวงแหวนป้องกัน ... แต่ไม่เคยทำอะไรกับพวกเขาเลย เพียงแค่การเขียนโปรแกรมแอสเซมเบลอร์ x86 อย่างง่าย ๆ ... จากนั้น Turbo Pascal จากนั้น C / C ++, Java ... และสุดท้าย. Net ในช่วง 13 ปีที่ผ่านมา :-)
สูงสุด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.