Разработка ОС на C ++ Вопросы


9

Как проект магистра, я проектирую простую операционную систему. Он предназначен для работы в 16-битном реальном режиме на архитектуре x86. В идеале я хотел бы разработать эту ОС на C ++ и использовать сборку только там, где это необходимо. До сих пор у меня есть загрузчик, написанный на ассемблере, который загружает ядро, представляющее собой смесь C ++ и asm. Мой вопрос касается использования C ++. На данный момент он скомпилирован и может работать, но я не использовал динамическое выделение памяти.

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

Как «новое» работает за кулисами для выделения памяти, и как бы я справился с этим?

И как следствие ...

Имеет ли смысл пытаться использовать C ++, чтобы воспользоваться преимуществами его абстракций более высокого уровня? Или было бы больше головной боли использовать его, и я должен придерживаться C?

Пожалуйста, предоставьте обоснование, если вы считаете, что C ++ не будет хорошим выбором.

Ответы:


9

В newключевых слов руки прочь от фактического распределения к operator new, который ведет себя весьма похоже на malloc: она получает память от где - то. Затем компилятор сделает всю магию конструктора. Следовательно, компилятор C ++ будет ожидать, что библиотека времени выполнения C ++ (или ваш код) обеспечит реализацию 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.