Pengembangan OS di Pertanyaan C ++

9

Sebagai proyek Master, saya merancang sistem operasi sederhana. Ini sedang dirancang untuk berjalan dalam Mode Nyata 16-bit pada arsitektur x86. Idealnya, saya ingin mengembangkan OS ini dalam C ++, dan hanya menggunakan perakitan jika perlu. Sejauh ini, saya memiliki boot loader yang ditulis dalam assembly, yang memuat kernel yang merupakan campuran dari C ++ dan asm. Pertanyaan saya berkaitan dengan penggunaan C ++. Sampai sekarang, ini telah dikompilasi dan dapat berjalan, tetapi saya belum menggunakan alokasi memori dinamis.

Jika saya menggunakan C, masuk akal untuk menulis fungsi malloc yang akan menangani alokasi memori, tetapi dalam C ++ kata kunci baru digunakan. Begitu...

Bagaimana cara 'baru' bekerja di belakang layar untuk mengalokasikan memori, dan bagaimana cara menangani ini?

Dan sebagai akibat wajar ...

Apakah masuk akal untuk mencoba menggunakan C ++ untuk mengambil keuntungan dari abstaksi tingkat tinggi? Atau akan lebih sakit kepala untuk menggunakannya dan haruskah saya tetap menggunakan C?

Berikan alasan jika Anda percaya bahwa C ++ tidak akan menjadi pilihan yang baik.

bunglestink
sumber

Jawaban:

9

Kata newkunci melepaskan alokasi aktual operator new, yang berperilaku agak mirip dengan malloc: ia mendapatkan memori dari suatu tempat. Kompiler kemudian akan melakukan semua keajaiban konstruktor. Oleh karena itu, kompiler C ++ akan mengharapkan lib runtime C ++ (atau kode Anda) untuk menyediakan implementasi operator new.

Masuk akal untuk menggunakan C ++ untuk abstraksi tertentu. Tidak ada alasan mengapa OS harus roll sendiri std::list<>. Pengecualian jauh lebih merepotkan. Di antara ada gradien dari hal berguna ke hal-hal yang tidak berguna. std::complex? Ini bekerja dengan sempurna, tetapi mengapa Anda membutuhkannya?

MSalters
sumber
5

Banyak kelebihan C ++ daripada C tidak ada hubungannya dengan dukungan runtime, dan dalam kasus-kasus itu benar-benar tidak ada perbedaan antara kode yang ditulis dalam C dan kode yang ditulis dalam C ++. Template, misalnya, tidak melakukan apa pun saat runtime. Mereka tidak melakukan apa pun yang tidak dapat Anda lakukan dengan banyak mengetik ekstra. C ++ adalah bahasa yang sangat masuk akal untuk menulis sistem operasi, karena ia menyediakan akses tingkat rendah ketika Anda membutuhkannya, dikombinasikan dengan abstraksi tingkat yang lebih tinggi daripada C ketika Anda tidak perlu fokus pada sedikit-twiddling.

newmelakukan dua hal: itu mendapatkan memori dari suatu tempat, dan menjalankan konstruktor yang diperlukan. Dalam mendapatkan ingatan, tidak ada bedanya dengan malloc.

David Thornley
sumber
3

Mungkin akan masuk akal untuk memberikan gambaran kasar tentang kode yang biasanya dihasilkan untuk newekspresi. Itu dihasilkan oleh kompiler, tetapi jika Anda mengimplementasikannya sebagai fungsi, itu akan terlihat seperti ini:

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

Jika Anda peduli tentang cara newkerjanya, tindak lanjut (hampir) yang tak terhindarkan adalah cara deletekerjanya:

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

Seperti yang telah ditunjukkan orang lain, ::operator newdan ::operator deletemerupakan pengalokasi memori yang cukup mendasar. Misalnya, pada sistem mirip Unix mereka mungkin akan memanggil sesuatu seperti brkatau sbrkuntuk mengalokasikan potongan memori yang besar, dan kemudian membagikan potongan yang lebih kecil dari blok-blok besar itu. Di OS Anda sendiri, Anda mungkin masih menginginkan semacam analog sbrkdan semacamnya - sesuatu yang dimulai dengan semua memori pada dasarnya sebagai "bebas", dan mengalokasikan potongan-potongan memori sesuai kebutuhan. Karena Anda bekerja dalam mode nyata, itu mungkin akan cukup sederhana - mengingat jumlah memori yang tersedia sedikit, desain praktis hampir perlu menekankan ukuran kecil di atas algoritma yang rumit.

Jerry Coffin
sumber
-4

Sebagian besar sistem operasi ditulis dalam CI think. Di sisi lain itu adalah proyek master jadi lakukan sesuatu yang berbeda dan menarik.

Kevin
sumber
1
Sebagian besar sistem operasi besar awalnya ditulis sebelum C ++ tersedia. Itu membatasi pilihan. :-)
Bo Persson
1
terkadang saya pikir downvotes menular.
Kevin