ข้อผิดพลาดที่อาจเกิดขึ้นกับการมีเคอร์เนลน้อยที่สุดที่เรียกใช้รหัสที่ได้รับการจัดการคืออะไร?


14

สมมติว่าฉันต้องการสร้างระบบปฏิบัติการโดยใช้เคอร์เนลตัวล่างที่เล็กมากซึ่งทำหน้าที่เป็นตัวแปลรหัสที่ได้รับการจัดการ / รันไทม์และเคอร์เนลส่วนบนขนาดใหญ่ที่คอมไพล์กับภาษาเครื่องที่ไม่ใช่เจ้าของภาษา (Java bytecode, CIL เป็นต้น) ตัวอย่างของระบบปฏิบัติการที่คล้ายกันจะเป็นเอกเทศและคอสมอส

ข้อผิดพลาดและความท้าทายในการพัฒนาที่มีอยู่คือการเขียนระบบปฏิบัติการด้วยโครงสร้างพื้นฐานแบบนี้ซึ่งแตกต่างจากโซลูชั่นดั้งเดิม

คำตอบ:


8

ความท้าทายในการพัฒนามีดังนี้:

  1. พอยน์เตอร์:หากภาษาไม่มีพอยน์เตอร์มันจะเป็นความท้าทายในการทำงานที่ค่อนข้างง่าย ตัวอย่างเช่นคุณสามารถใช้ตัวชี้เพื่อเขียนไปยังหน่วยความจำ VGA สำหรับการพิมพ์ไปที่หน้าจอ อย่างไรก็ตามในภาษาที่มีการจัดการคุณจะต้องมี "plug" (จาก C / C ++) บางประเภทเพื่อทำสิ่งเดียวกัน

  2. การประกอบ:ระบบปฏิบัติการต้องการแอสเซมบลีบางอย่างเสมอ ภาษาเช่น C #, Java, ฯลฯ ใช้งานได้ไม่ดีเท่า C / C ++ ใน C หรือ C ++ คุณสามารถมีชุดประกอบแบบอินไลน์ซึ่งมีประโยชน์มากสำหรับงานหลายอย่าง มีหลายกรณีที่จำเป็นต้องใช้สิ่งนี้ (ตัวอย่างใน x86): การโหลด GDT การโหลด IDT การเปิดใช้งานการเพจการตั้งค่า IRQ เป็นต้น

  3. การควบคุม:ถ้าคุณกำลังใช้บางอย่างเช่นจักรวาลคุณไม่สามารถควบคุมได้อย่างเต็มที่ จักรวาลเป็นไมโครเคอร์เนลและ "bootstraps" เคอร์เนล "ของคุณ" เป็นหลัก คุณสามารถใช้บางอย่างเช่นคอสโมสตั้งแต่เริ่มต้นได้หากคุณต้องการจริงๆซึ่งอาจใช้เวลานานนาน

  4. ค่าโสหุ้ย:ด้วยภาษาที่จัดการมีค่าใช้จ่ายจำนวนมากเมื่อเทียบกับ C หรือแม้แต่ C ++ สิ่งต่าง ๆ เช่นคอสมอสจำเป็นต้องใช้หลายสิ่งก่อนที่แม้แต่เคอร์เนลโลก C # hello ก็สามารถทำงานได้ ใน C คุณพร้อมที่จะไปไม่ต้องตั้งค่าจริง ใน C ++ มีบางสิ่งที่จำเป็นต้องนำมาใช้เพื่อใช้งานคุณสมบัติของ C ++

  5. โครงสร้าง:ใน C / C ++ มีโครงสร้างที่ไม่มีภาษาที่มีการจัดการจำนวนมากและดังนั้นคุณจะต้องใช้วิธีการบางอย่างเช่น struct ตัวอย่างเช่นถ้าคุณต้องการที่จะโหลดราชกิจจานุเบกษา (Interrupt Descriptor Table) ใน C / C ++, คุณสามารถสร้าง struct (ที่มีคุณลักษณะที่บรรจุ) และโหลดโดยใช้การเรียนการสอน x86 ASM lidt ในภาษาที่มีการจัดการสิ่งนี้ยากที่จะทำ ...

ภาษาที่มีการจัดการไวยากรณ์ฉลาดง่ายกว่าอย่างไรก็ตามสำหรับสิ่งต่าง ๆ ที่เกี่ยวข้องกับระบบปฏิบัติการหลาย ๆ ครั้งไม่เหมาะอย่างยิ่ง ไม่ได้หมายความว่าไม่สามารถใช้งานได้ แต่มักจะแนะนำให้ใช้ C / C ++


คำตอบนี้ค่อนข้างอ่อนแอ อะไรคือ“ ภารกิจที่ค่อนข้างง่าย” ที่คุณไม่สามารถทำได้หากไม่มีพอยน์เตอร์ (ยกเว้นมูลนิธิเล็ก ๆ )? ชิ้นส่วนที่ต้องประกอบมีอะไรบ้าง คุณขาดการควบคุมอะไร? คุณยึดถือถ้อยแถลงเกี่ยวกับค่าใช้จ่าย ทำไมคุณไม่มีโครงสร้างในภาษาที่มีการจัดการ
Gilles 'หยุดความชั่วร้าย' ใน

1. ไม่มีเหตุผลว่าทำไมภาษาที่มีการจัดการจะไม่สามารถให้ความสามารถในการเข้าถึงหน่วยความจำ VGA มันเป็นเพียงการทำแผนที่ / unmapping ที่จะต้องให้เป็นแบบดั้งเดิม (ดั้งเดิมการจัดการหน่วยความจำ) 2. โดยทั่วไปแล้วการสลับงาน (เช่นการบันทึกการลงทะเบียน) จะต้องทำเป็นรหัสแอสเซมบลี แต่มีการแปลเป็นภาษาท้องถิ่นมากไม่ใช่การโต้แย้งว่ามี 99% ของระบบปฏิบัติการในภาษาที่มีการจัดการ การจัดการ MMU เป็นพื้นฐานการจัดการหน่วยความจำ 4. C ต้องการตั้งค่าด้วย (ตั้งค่า stack และ heap); ภาษาที่มีการจัดการต้องการการตั้งค่าอีกเล็กน้อย แต่ไม่มีความแตกต่างเชิงคุณภาพ
Gilles 'หยุดความชั่วร้าย' ใน

@Gilles คำถามคือสิ่งที่ท้าทายการพัฒนาสำหรับการใช้ภาษาที่มีการจัดการ สิ่งเหล่านี้เป็นความท้าทายด้านการพัฒนาอย่างไรก็ตามคุณยังคงสามารถเอาชนะความท้าทายดังกล่าวได้ ...
mmk

5

ฉันเคยได้ยินมันอ้างว่า (โดยนักวิจัยที่ทำงานเกี่ยวกับเทคนิค microkernel ที่มีการแข่งขัน ) ที่ไม่ค่อยมีใครรู้จักเกี่ยวกับวิธีการประเมินความปลอดภัยของระบบที่สามารถขยายได้ผ่านการจัดการรหัส

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

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

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


นั่นเป็นจุดที่ยอดเยี่ยม
Adam Maras

ฉันพบว่าข้อโต้แย้งเหล่านี้แปลกมาก (ได้รับฉันอาจจะลำเอียงโดยพื้นหลังของฉันในวิธีการอย่างเป็นทางการ แต่นี่ไม่ได้เป็นเพียงพื้นฐานสำหรับความคิดของฉัน.) พิมพ์ดีดไม่ซับซ้อนดังนั้นเมื่อเทียบกับ microkernel บวก MMU ตัวอย่างเช่น microkernel ของ Coq มีขนาดประมาณ 14kLoC ของ OCaml - ใหญ่กว่า microkernel แต่ไม่มากเลยและเขียนด้วยภาษาที่มีข้อผิดพลาดน้อยกว่าเมล็ดส่วนใหญ่ (ไม่มี C หรือแอสเซมเบลอร์) ตัวตรวจสอบชนิดไม่ไวต่อสภาพการแข่งขันซึ่งเป็นข้อบกพร่องที่ละเอียดอ่อนเป็นพิเศษ
Gilles 'หยุดความชั่วร้าย' ใน

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

ในทางปฏิบัติเครื่องเสมือนหลายเครื่องที่แยกได้รับการรับรองที่ EAL5 ขึ้นไป นี่คือตัวอย่างที่สองที่คุณอาจมีในกระเป๋าสตางค์ของคุณถ้าคุณยุโรปเพราะพวกเขาจะใช้ในมาร์ทการ์ดเช่นบัตรเครดิต: MULTOS , Java บัตรแพลตฟอร์มแบบเปิด ในชุมชนการประเมินความปลอดภัยฉันได้ยินมาหลายข้อสงสัยว่าการแยก MMU อาจเกินกว่า EAL2
Gilles 'หยุดความชั่วร้าย' ใน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.