Розробка ОС у питаннях C ++


9

Як магістерський проект я розробляю просту операційну систему. Він розроблений для роботи в 16-бітовому реальному режимі в архітектурі x86. В ідеалі я хотів би розробити цю ОС на C ++ і використовувати лише збірку там, де це необхідно. Поки що у мене завантажувач написаний у збірці, який завантажує ядро, яке є сумішшю C ++ та ASM. Моє запитання щодо використання C ++. На сьогодні він компілюється і може працювати, але я не використовував жодного динамічного розподілу пам'яті.

Якби я використовував C, було б доцільно написати функції malloc, які б обробляли розподіл пам'яті, але в C ++ використовується нове ключове слово. Тому...

Як працює "нове" за лаштунками, щоб розподілити пам'ять, і як би я вирішив вирішити це?

І як наслідок ...

Чи є сенс намагатися використовувати C ++, щоб скористатися його абстракціями вищого рівня? Або це буде більше головного болю, щоб використовувати його, і я повинен дотримуватися C?

Будь ласка, надайте обґрунтування, якщо ви вважаєте, що C ++ не буде хорошим вибором.

Відповіді:


9

У newключових слів руки геть від фактичного розподілу до operator new, який веде себе досить схоже на malloc: вона отримує пам'ять від де - то. Потім компілятор виконає всю магію конструктора. Таким чином, компілятор C ++ очікує, що Cb + lib (або ваш код) забезпечить реалізацію operator new.

Звичайно, має сенс використовувати C ++ для певних абстракцій. Немає причини, чому ОС повинна прокручувати свою власну std::list<>. Винятки набагато складніше. Між ними є градієнт від корисних до непотрібних речей. std::complex? Це прекрасно працює, але навіщо вам це потрібно?


5

Багато переваг C ++ над C не мають нічого спільного з підтримкою виконання, і в цих випадках дійсно немає різниці між кодом, написаним на C, і кодом, написаним на C ++. Наприклад, шаблони нічого не роблять під час виконання. Вони не роблять нічого, чого не могли б зробити з великою кількістю зайвих текстів. C ++ - це дуже розумна мова для запису операційних систем, оскільки вона забезпечує доступ низького рівня, коли вам це потрібно, в поєднанні з абстракціями вищого рівня, ніж 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 ++. Це обмежило вибір. :-)
Бо Персон

1
інколи я думаю, що лісоматеріали заразні.
Кевін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.