Desenvolvimento de SO em perguntas em C ++

9

Como projeto de mestrado, estou projetando um sistema operacional simples. Ele está sendo projetado para ser executado no modo Real de 16 bits em uma arquitetura x86. Idealmente, eu gostaria de desenvolver esse sistema operacional em C ++ e usar somente montagem quando necessário. Até agora, eu tenho um carregador de boot escrito em assembly, que carrega um kernel que é uma mistura de C ++ e asm. Minha pergunta é em relação ao uso de C ++. A partir de agora, ele foi compilado e pode ser executado, mas eu não usei nenhuma alocação de memória dinâmica.

Se eu estivesse usando C, faria sentido escrever funções malloc que tratariam da alocação de memória, mas em C ++ a nova palavra-chave é usada. Então...

Como 'novo' funciona nos bastidores para alocar memória, e como eu lidaria com isso?

E como corolário ...

Faz sentido tentar usar C ++ para tirar proveito de suas abstações de nível superior? Ou seria mais dor de cabeça usá-lo e devo ficar com C?

Por favor, forneça justificativa se você acredita que o C ++ não seria uma boa escolha.

bunglestink
fonte

Respostas:

9

A newpalavra-chave entrega a alocação real para operator new, que se comporta de maneira semelhante a malloc: obtém memória de algum lugar. O compilador fará toda a mágica do construtor. Portanto, o compilador C ++ espera que a lib de tempo de execução C ++ (ou seu código) forneça uma implementação de operator new.

Certamente faz sentido usar C ++ para certas abstrações. Não há razão para que um sistema operacional seja lançado std::list<>. Exceções são muito mais problemáticas. No meio, há um gradiente de coisas úteis para coisas inúteis. std::complex? Funciona perfeitamente, mas por que você precisaria?

MSalters
fonte
5

Muitas das vantagens do C ++ sobre o C não têm nada a ver com o suporte ao tempo de execução e, nesses casos, não há realmente nenhuma diferença entre o código escrito em C e o código escrito em C ++. Modelos, por exemplo, não fazem nada em tempo de execução. Eles não fazem nada que você não poderia fazer com muita digitação extra. O C ++ é uma linguagem bastante razoável para a gravação de sistemas operacionais, pois fornece acesso de baixo nível quando necessário, combinado com abstrações de nível superior ao C quando você não precisa se concentrar na manipulação de bits.

newfaz duas coisas: obtém memória de algum lugar e executa os construtores necessários. Ao obter a memória, não é diferente malloc.

David Thornley
fonte
3

Talvez seja razoável dar uma idéia aproximada do código que normalmente é gerado para uma newexpressão. É gerado pelo compilador, mas se você o estivesse implementando como uma função, seria algo parecido com isto:

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

Se você se preocupa com como newfunciona, o acompanhamento (quase) inevitável é como deletefunciona:

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

Como outros já apontaram, ::operator newe ::operator deletesão alocadores de memória bastante básicos. Por exemplo, em um sistema semelhante ao Unix, eles provavelmente chamariam algo como brkou sbrkalocariam grandes pedaços de memória e depois distribuiriam pedaços menores desses grandes blocos. No seu próprio sistema operacional, você provavelmente ainda deseja algum tipo de analógico sbrke algo assim - algo que começa com essencialmente toda a memória como "livre" e aloca partes da memória conforme necessário. Como você está trabalhando no modo real, isso provavelmente será bastante simples - dada a pequena quantidade de memória disponível, um design prático quase precisa enfatizar o tamanho pequeno em relação a algoritmos elaborados.

Jerry Coffin
fonte
-4

A maioria dos sistemas operacionais são escritos no pensamento de CI. Por outro lado, é um projeto de mestrado, então faça algo diferente e interessante.

Kevin
fonte
11
A maioria dos grandes sistemas operacionais foi escrita inicialmente antes que o C ++ estivesse disponível. Isso limitou a escolha. :-)
Bo Persson
11
às vezes acho que votos negativos são contagiosos.
23711 Kevin