อีกสองคำตอบ (ในขณะที่เขียน) พูดคุยเกี่ยวกับการขัดจังหวะและ IDT อย่างไรก็ตามนี่เป็นสิ่งที่ถูกต้อง แต่ในซีพียู Intel-esque ที่ทันสมัยมีไม่น้อยกว่าสามวิธีในการเรียกใช้เคอร์เนล
วิธีที่ # 1: การขัดจังหวะ
นี่คือคำอธิบายข้างต้น คุณตั้งค่ารายการในตารางอธิบาย / ขัดจังหวะเวกเตอร์จากนั้นรันซอฟต์แวร์ขัดจังหวะเพื่อป้อนเคอร์เนล
ข้อได้เปรียบหลักของวิธีนี้คือเคอร์เนลทั่วไปต้องสามารถจัดการกับการขัดจังหวะได้และมันทำงานกับฮาร์ดแวร์โบราณ
วิธีที่ # 2: เรียกประตู
ประตูการโทรเป็นตัวเลือกกลุ่มชนิดพิเศษ เป้าหมายของการโทรจะต้องโหลดในตารางตัวบอกส่วนโกลบอลหรือโลคัล (GDT และ LDT ตามลำดับ) หากคุณดำเนินการคำสั่งการโทรแบบไกลโดยใช้เกตการโทรเป็นส่วน (การชดเชยการโทรจะถูกละเว้น) สิ่งนี้จะช่วยให้คุณสามารถเรียกรหัสที่มีสิทธิพิเศษมากขึ้น ประตูการโทรมีความยืดหยุ่นสูง สถาปัตยกรรม IA-32 มีสี่ระดับสิทธิ์และประตูการโทรให้คุณโทรได้ทุกระดับ
ฉันไม่เชื่อว่าลีนุกซ์เคยใช้เกตประตู แต่ Windows 95 ทำได้ บริการเคอร์เนล Win95 ( krnl386.exe
และkernel.dll
) ทำงานในโหมดผู้ใช้จริง (เสียงเรียกเข้า 3) ระดับสิทธิ์ใช้งานสูงสุด (แหวน 0) ใช้สำหรับไดรเวอร์เท่านั้นและ microkernel ซึ่งดำเนินการสลับกระบวนการเท่านั้น การโทรเข้าไปในไดรเวอร์ทำได้โดยใช้ call gates สิ่งนี้ได้รับอนุญาตให้ใช้รหัส 16 บิตแบบดั้งเดิม (ซึ่งมีจำนวนมาก!) เพื่อใช้ไดรเวอร์ Win95 เพียงแค่ใช้การโทรระยะไกลแบบมาตรฐานเช่นเดียวกับที่พวกเขาทำ
การป้องกันตาราง descriptor ทั่วโลกไม่เพียงพอเป็นสาเหตุของการหาประโยชน์หลาย ๆ อย่างของ Windows 95 ซึ่งจัดการติดตั้งประตูการโทรของตัวเองด้วยการเขียนทับหน่วยความจำ
วิธีที่ # 3: SYSCALL / SYSRET และ SYSENTER / SYSEXIT
นี่เป็นคำสั่งสองชุดที่คิดค้นโดยอิสระจาก AMD และ Intel แต่โดยพื้นฐานแล้วพวกเขาทำสิ่งเดียวกัน SYSCALL / SYSRET มาก่อนและเป็น AMD เท่านั้น SYSENTER / SYSEXIT เป็น Intel แต่ AMD นำมาใช้ทันที ดังนั้นฉันจะอธิบาย SYSENTER / SYSEXIT
ซึ่งแตกต่างจาก call gates, SYSENTER สามารถใช้เพื่อถ่ายโอนไปยัง ring 0 เท่านั้นและสามารถถ่ายโอนไปยังที่เดียวเท่านั้น อย่างไรก็ตามมันมีข้อดีของการมีความหน่วงต่ำมากเนื่องจากไม่เหมือนกับการโทรหรือการขัดจังหวะโดยไม่ได้สัมผัสกับกองซ้อน
ตำแหน่งการถ่ายโอนถูกตั้งค่าโดยใช้การลงทะเบียนแบบเฉพาะสามแบบ: หนึ่งรายการสำหรับข้อมูลเซ็กเมนต์และอีกหนึ่งรายการสำหรับตัวชี้คำสั่งและตัวชี้สแต็กของรหัสเคอร์เนล เนื่องจากไม่มีสิ่งใดที่ "ผลัก" ลงบนสแต็กรหัสโหมดผู้ใช้มีหน้าที่บอกเคอร์เนลว่าจะกลับไปที่ใดโดยส่งตัวชี้คำสั่งการส่งคืนและตัวชี้สแต็กในการลงทะเบียน เคอร์เนลมีหน้าที่กู้คืนตัวชี้สแต็กและคำสั่ง SYSEXIT คืนค่าตัวชี้คำสั่ง
ข้อมูลเพิ่มเติมเกี่ยวกับคำแนะนำของ SYSENTER และ SYSEXIT