การพัฒนาระบบปฏิบัติการในคำถาม C ++


9

ในฐานะโครงการปริญญาโทฉันกำลังออกแบบระบบปฏิบัติการง่าย ๆ มันถูกออกแบบมาให้ทำงานในโหมดจริง 16 บิตบนสถาปัตยกรรม x86 โดยหลักการแล้วฉันต้องการพัฒนาระบบปฏิบัติการนี้ใน C ++ และใช้แอสเซมบลีเท่าที่จำเป็นเท่านั้น จนถึงตอนนี้ฉันมีบูตโหลดเดอร์ที่เขียนด้วยชุดประกอบที่โหลดเคอร์เนลที่ผสม C ++ และ asm คำถามของฉันเกี่ยวกับการใช้ C ++ ณ ตอนนี้คอมไพล์และสามารถรันได้ แต่ฉันไม่ได้ใช้การจัดสรรหน่วยความจำแบบไดนามิกใด ๆ

ถ้าฉันใช้ C มันจะสมเหตุสมผลที่จะเขียนฟังก์ชั่น malloc ที่จะจัดการการจัดสรรหน่วยความจำ แต่ใน C ++ จะมีการใช้คำหลักใหม่ ดังนั้น...

'ใหม่' ทำงานอย่างไรเบื้องหลังการจัดสรรหน่วยความจำและฉันจะจัดการเรื่องนี้อย่างไร

และเป็นข้อพิสูจน์ ...

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

โปรดระบุเหตุผลหากคุณเชื่อว่า C ++ จะไม่ใช่ตัวเลือกที่ดี

คำตอบ:


9

newมือคำหลักปิดการจัดสรรที่แท้จริงoperator newซึ่งมีลักษณะการทำงานที่ค่อนข้างคล้ายกับmalloc: จะได้รับหน่วยความจำจากที่ไหนสักแห่ง คอมไพเลอร์จะทำเวทสร้างทั้งหมด ดังนั้น C ++ คอมไพเลอร์จะคาดหวัง c ++ รันไทม์ lib (หรือรหัสของคุณ) operator newเพื่อให้การดำเนินการของ

แน่นอนว่ามันสมเหตุสมผลที่จะใช้ C ++ สำหรับนามธรรมบางอย่าง std::list<>ไม่มีเหตุผลใดที่ระบบปฏิบัติการควรม้วนของตัวเองไม่ได้ ข้อยกเว้นมีปัญหามากขึ้น ในระหว่างนั้นมีการไล่ระดับสีจากสิ่งที่มีประโยชน์ไปสู่สิ่งที่ไร้ประโยชน์ std::complex? มันทำงานได้อย่างสมบูรณ์แบบ แต่ทำไมคุณต้องใช้


5

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

newทำสองสิ่ง: ได้รับหน่วยความจำจากที่ใดที่หนึ่งและทำงานสิ่งก่อสร้างที่จำเป็น mallocในการได้รับหน่วยความจำก็ไม่แตกต่างจาก


3

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

template <class T>
T *new_object() { 
    void *raw_data = ::operator new(sizeof(T));
    return new(raw_data) T;
}

หากคุณสนใจวิธีการnewทำงานการติดตาม (เกือบ) ที่หลีกเลี่ยงไม่ได้คือวิธีการdeleteทำงาน:

template <class T>
void delete_object(T const *object) { 
    object->~T();
    ::operator delete(object);
}

อย่างที่คนอื่น ๆ ชี้ไปแล้ว::operator newและ::operator deleteเป็นตัวจัดสรรหน่วยความจำพื้นฐานที่ค่อนข้างดี ตัวอย่างเช่นในระบบที่คล้าย Unix พวกเขาอาจจะเรียกสิ่งที่ชอบbrkหรือsbrkจัดสรรหน่วยความจำขนาดใหญ่แล้วส่งชิ้นเล็ก ๆ จากบล็อกขนาดใหญ่เหล่านั้น ในระบบปฏิบัติการของคุณเองคุณยังอาจต้องการอะนาล็อกบางประเภทsbrkเช่น - สิ่งที่เริ่มต้นด้วยหน่วยความจำทั้งหมดเป็น "ฟรี" และจัดสรรหน่วยความจำตามต้องการ เนื่องจากคุณกำลังทำงานในโหมดจริงซึ่งอาจจะค่อนข้างง่าย - เนื่องจากหน่วยความจำขนาดเล็กที่มีอยู่การออกแบบที่ใช้งานได้จริงเกือบจะต้องเน้นขนาดที่เล็กกว่าอัลกอริธึมที่ซับซ้อน


-4

ระบบปฏิบัติการส่วนใหญ่เขียนด้วย CI คิดว่า ในทางตรงกันข้ามมันเป็นโครงการของอาจารย์ดังนั้นทำสิ่งที่แตกต่างและน่าสนใจ


1
เริ่มต้นระบบปฏิบัติการขนาดใหญ่ส่วนใหญ่ก่อนที่ C ++ จะพร้อมใช้งาน ทางเลือกที่ จำกัด :-)
Bo Persson

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