การเขียนระบบปฏิบัติการมัลติทาสก์สำหรับโปรเซสเซอร์ที่ไม่มี MMU


9

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

เนื่องจากฉันทำงานกับโปรเซสเซอร์ i386 + มาตลอดและไม่เคยทำสิ่งอื่นใด (ยกเว้น Microchip PIC บางตัว) ตอนนี้ฉันสับสนและไม่แน่ใจว่าใครสามารถเขียนระบบปฏิบัติการที่ใช้งานได้ซึ่งฟังก์ชั่นจะไม่ถูก จำกัด เมื่อเปรียบเทียบกับระบบปฏิบัติการที่เขียน สำหรับ MPU กับ MMU

ฉันสามารถคิดถึงวิธีแก้ปัญหาเล็กน้อยสำหรับ "การแทนที่" หรือ "การจำลอง" MMU และฉันมีคำถามสองสามข้อ:

  • บนโปรเซสเซอร์ Intel ในโหมด 16 และ 32 บิตมีวิธีการใช้เซกเมนต์และตัวเลือกเซกเมนต์เพื่อใช้บล็อกหน่วยความจำที่แตกต่างกันตามงานที่แตกต่างกัน นั่นหมายความว่าฉันสามารถเปลี่ยนพื้นที่หน่วยความจำได้โดยการเปลี่ยนเนื้อหาของเซกเมนต์รีจิสเตอร์เมื่อทำการสลับงานเมื่อใช้ x86 มีแนวคิดทั่วไปสำหรับการแบ่งส่วนหน่วยความจำที่สามารถใช้กับสถาปัตยกรรม ARM ได้หรือไม่?
  • โดยการโหลดไฟล์ออบเจกต์ที่เชื่อมโยงแทนการปฏิบัติการฉันสามารถใช้การเปลี่ยนตำแหน่ง (การแก้ไข) หรือวางโค้ดอิสระเพื่อชี้ตำแหน่งงานบนชิ้นส่วนของหน่วยความจำในลักษณะเดียวกับที่ฉันทำแผนที่หน่วยความจำโดยใช้โครงสร้างเพจจิ้ง สิ่งนี้จะมีประสิทธิภาพเพียงพอหรือไม่
  • ฉันได้อ่านบางอย่างเกี่ยวกับหน่วยความจำการป้องกันในโปรเซสเซอร์ ARM สิ่งเหล่านี้จะเป็นประโยชน์หรือไม่?

มีวิธี "ปกติ" ในการจัดการงานบนระบบที่ไม่มี MMU หรือไม่?

คำตอบ:


16

จริงๆแล้วมันไม่ยากเลยที่จะออกแบบระบบปฏิบัติการที่ไม่ต้องการ MMU มีสิ่งอำนวยความสะดวกบางอย่างที่คุณต้องทำโดยไม่ต้องมี แต่ไม่มีอะไรผ่านไม่ได้

  • เนื่องจากจะต้องโหลดงานที่แตกต่างกันตามที่อยู่ที่แตกต่างกันรหัสทั้งหมดของคุณ (ยกเว้นเคอร์เนลไลบรารีมาตรฐานและรหัสอื่น ๆ ที่เป็นส่วนหนึ่งของสภาพแวดล้อมรันไทม์พื้นฐานของคุณ) จึงต้องรวบรวมเป็นตำแหน่งที่ไม่ขึ้นกับตำแหน่ง ซึ่งหมายความว่าการข้ามแบบสัมพันธ์และที่อยู่พื้นฐานสำหรับการเข้าถึงฮีปที่เก็บไว้ในรีจิสเตอร์ การใช้การลงทะเบียนหนึ่งครั้งเป็นที่อยู่พื้นฐานอาจดูเหมือนว่ามีค่าใช้จ่ายสูงหากคุณคุ้นเคยกับการลงทะเบียนทั่วไปสี่ตัวของ x86-32 แต่สถาปัตยกรรมสมัยใหม่ส่วนใหญ่มีมากขึ้นและ 8088 ก็มีการลงทะเบียนส่วนนั้นอย่างแม่นยำ
  • จะต้องแก้ไขสถาปัตยกรรมที่เหมือน Unix เพราะคุณไม่สามารถใช้งานforkได้ ที่ ok forkส่วนใหญ่ระบบปฏิบัติการไม่ได้ (คุณสามารถมีvfork)
  • คุณไม่สามารถจัดสรรพื้นที่ขนาดใหญ่ได้โดยไม่ต้องจัดสรรหน่วยความจำที่เกี่ยวข้อง ซึ่งหมายความว่าจะไม่มีการเติบโตของสแต็กหรือกองอย่างรวดเร็วในการจัดสรรครั้งละหนึ่งหน้า

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

uClinuxเป็นโครงการที่ใช้เคอร์เนล Linux ที่ทำงานบนโปรเซสเซอร์ (รวมถึง ARM Cortex-M) โดยไม่มี MMU มันมีข้อ จำกัด ในการทำงานแบบ multitaskingเป็นหลักสิ่งที่ผมระบุไว้ข้างต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.