Este é um pequeno sistema operacional para brincar com coisas que eu nunca fiz antes ... não tem a intenção de ser funcional, útil, seguro ou confiável. É para ser aproximadamente divertido de implementar.
Se você quiser ver as últimas coisas que estou fazendo, consulte a filial dev neste repositório. Geralmente, master deve compilar e executar.
Comece no librs (o equivalente à LIBC para este projeto).
user/src/main.rs como um exemplo de programa de uso de usuários.cargo xbuild --target target.jsonPaginação
memory::paging::map_regionMensagem zero cópia que passa para o IPC. Para enviar uma mensagem,
Estou brincando com a idéia de não ter processos, apenas dags de continuações que podem ou não optar por transmitir suas capacidades.
Atualmente, é um pouco mais de 1500 loc (não incluindo comentários + dependências de espaço em branco +). Nada mal!
O kernel em si é baseado em continuação, em vez de usar algo como Kthreads. No primeiro passe, estou apenas fazendo as coisas funcionarem. Mais tarde, posso voltar e torná -lo eficiente.
Nenhuma preempção baseada em timer no espaço de kernels ou no Usuários (embora ocorram interrupções do timer para que os temporizadores possam funcionar). Sem bloqueios, sem multi-threading no espaço do usuário. Todo processo é um único thread e baseado em continuação. Cada Continuation pode retornar um conjunto de continuações adicionais a serem executadas em qualquer ordem, um erro ou nada. As continuações também podem aguardar eventos, como E/S ou o término de outro processo.
Espaço de endereço único. Tudo vive no mesmo espaço de endereço. Página Bits de entrada da tabela são usados para desativar certas partes do espaço de endereço para algumas continuações.
Pequena pilha do kernel para alocação de memória dinâmica.
Buddy Allocator para alocação de quadros físicos.
Buddy Allocator para regiões de espaço de endereço virtual.
Sistema de capacidade simples para gerenciar o acesso a recursos no sistema, como regiões de memória.
Mudando para Usermode e Voltar.
Chamadas de sistema via Instruções syscall e sysret .
Carregando um binário ELF independente da posição como uma tarefa no modo de usuário, executando-a e saindo por meio de um syscall.
Agora que tenho um kernel básico em sua maioria, posso começar a brincar com coisas!
ferrugem, todas as noites
rustc 1.45.0-nightly (99cb9ccb9 2020-05-11) componente de distribuição de ferrugem llvm-tools-preview via rustup component add llvm-tools-preview
cargo xbuild e cargo bootimage via cargo install cargo-xbuild bootimage
build-essentials e utilitários padrão: gcc , make , ld , objcopy , dd
qemu para correr
Para construir e correr
$ cd os2/user
$ cargo xbuild --target x86_64-unknown-elf.json --release
$ cd ../kernel
$ bootimage run Opcionalmente, bootimage pode ser aprovado --release de compilações otimizadas.