Este é um pequeno experimento em que estou trabalhando onde tento criar um núcleo de programação do sistema operacional.
O objetivo não é criar um sistema operacional "totalmente" funcional (o que quer que isso signifique), mas aprender mais sobre os sistemas operacionais e como eles são feitos.
Originalmente, planejava implementar um sistema FAT32-Files. Implementei um uma vez (em c), mas não posso continuar trabalhando no projeto devido à falta de harware. É claro que você pode implementar facilmente um sistema de arquivos no Linux, mas isso é meio chato.
Então, em vez disso, comecei a escrever meu próprio sistema operacional para este projeto. É também uma maneira de começar a aprender. Bem, pelo menos um pouco.
Quando tive a ideia de escrever um sistema operacional, sabia que não quero usar C, pois já tinha alguma experiência em escrever um sistema operacional em C., deliberei se eu deveria usar a ferrugem ou ir para escrever meu sistema operacional. O fator decisivo no final foi que o Go seria o maior desafio.
Agora, você pode pensar que não é uma idéia tão boa de usar, vá para escrever um kernel, e você estaria certo. O Go-Runtime foi projetado para ser usado no espaço de usuários de um sistema operacional. Existem muitas suposições que isso implica, como a capacidade de invocar Syscalls e o uso da alocação de memória dinâmica. Em um kernel, você não pode confiar em um sistema operacional para lidar com isso para você, como você é o sistema operacional. No entanto, com programação cuidadosa e desistindo de certas recursos que você pode fazer, então por que não? É um desafio.
Um objetivo deste projeto é alcançar coisas rapidamente, então não passei tempo projetando o sistema operacional. Para acelerar todo o processo, decidi usar a interface syscall do Linux. Dessa forma, eu não precisaria escrever minhas próprias bibliotecas de espaço de usuários e poderia usar qualquer linguagem de programação que eu quisesse no meu espaço de usuários. Mas tem algumas desvantagens. Enquanto eu faço os syscalls da mesma maneira que o Linux, isso exige que eu também use todas as suposições do Linux. Por exemplo, iniciar um processo re -quuri para configurar seu espaço de memória da mesma maneira que o Linux, os syscalls precisam retornar valores que são esperados em um kernel Linux e o design do kernel é assumido como monolítico.
Ainda não tenho certeza se eu continuo com esse design. Outra idéia que tive é escrever meu próprio ABI, mas também escrever uma biblioteca de wrapper Linux-SysCall que intercepte o Linux Syscalls e a traduzisse no meu sistema operacional.