Rozwój systemu operacyjnego w języku C ++ Pytania


9

Jako projekt Master projektuję prosty system operacyjny. Jest przeznaczony do działania w 16-bitowym trybie rzeczywistym na architekturze x86. Idealnie, chciałbym opracować ten system operacyjny w C ++ i tylko w razie potrzeby używać asemblera. Do tej pory mam moduł ładujący napisany w asemblerze, który ładuje jądro będące kombinacją C ++ i asm. Moje pytanie dotyczy używania C ++. Na razie skompilował się i może działać, ale nie korzystałem z dynamicznej alokacji pamięci.

Gdybym używał C, sensowne byłoby pisanie funkcji malloc, które obsługiwałyby alokację pamięci, ale w C ++ używane jest nowe słowo kluczowe. Więc...

Jak działa „nowy” za kulisami, aby przydzielić pamięć i jak bym sobie z tym poradził?

I jako następstwo ...

Czy ma sens próba użycia C ++, aby skorzystać z jego abstakcji na wyższym poziomie? A może używanie bólu byłoby bardziej uciążliwe i czy powinienem trzymać się C?

Podaj uzasadnienie, jeśli uważasz, że C ++ nie byłby dobrym wyborem.

Odpowiedzi:


9

Słowo newkluczowe przekazuje rzeczywisty przydział do operator new, który zachowuje się raczej podobnie malloc: pobiera skądś pamięć. Kompilator wykona wtedy całą magię konstruktora. Dlatego kompilator C ++ oczekuje, że biblioteka uruchomieniowa C ++ (lub twój kod) zapewni implementację operator new.

Z pewnością sensowne jest używanie C ++ do niektórych abstrakcji. Nie ma powodu, dla którego system operacyjny powinien mieć własne std::list<>. Wyjątki są znacznie bardziej kłopotliwe. Pomiędzy nimi jest gradient od przydatnych do bezużytecznych rzeczy. std::complex? Działa idealnie, ale dlaczego miałbyś go potrzebować?


5

Wiele zalet C ++ nad C nie ma nic wspólnego ze wsparciem środowiska wykonawczego, aw takich przypadkach tak naprawdę nie ma różnicy między kodem napisanym w C a kodem napisanym w C ++. Na przykład szablony nie robią nic w czasie wykonywania. Nie robią nic, czego nie można zrobić przy dodatkowym pisaniu. C ++ jest bardzo rozsądnym językiem do pisania systemów operacyjnych, ponieważ zapewnia dostęp niskiego poziomu, gdy jest potrzebny, w połączeniu z abstrakcjami wyższego poziomu niż C, gdy nie trzeba skupiać się na kręceniu bitów.

newrobi dwie rzeczy: pobiera skądś pamięć i uruchamia niezbędne konstruktory. W zdobywaniu pamięci nie różni się niczym malloc.


3

Być może uzasadnione byłoby przybliżenie kodu, który normalnie jest generowany dla newwyrażenia. Jest generowany przez kompilator, ale jeśli implementujesz go jako funkcję, wyglądałby mniej więcej tak:

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

Jeśli zależy ci na tym new, jak to działa, (prawie) nieuniknione są następujące deletedziałania:

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

Jak inni już wspomniano, ::operator newi ::operator deletesą dość podstawowe podzielniki pamięci. Na przykład w systemie uniksowym prawdopodobnie nazwaliby coś podobnego brklub sbrkprzydzielili duże porcje pamięci, a następnie rozdawali mniejsze porcje z tych dużych bloków. W swoim systemie operacyjnym prawdopodobnie nadal potrzebujesz jakiegoś analogu sbrki czegoś takiego - coś, co zaczyna się od zasadniczo całej pamięci jako „wolnej” i przydziela fragmenty pamięci w razie potrzeby. Biorąc pod uwagę, że pracujesz w trybie rzeczywistym, prawdopodobnie będzie to dość proste - biorąc pod uwagę niewielką ilość dostępnej pamięci, praktyczny projekt prawie musi podkreślać mały rozmiar w porównaniu do skomplikowanych algorytmów.


-4

Większość systemów operacyjnych jest napisanych w CI. Z drugiej strony jest to projekt mistrza, więc zrób coś innego i interesującego.


1
Większość dużych systemów operacyjnych została napisana początkowo przed udostępnieniem C ++. To ograniczyło wybór. :-)
Bo Persson

1
czasami myślę, że downvotes są zaraźliwe.
Kevin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.