Consulte https://github.com/zhengruohuang/toddler-ng para a próxima geração de criança!
A criança era originalmente um projeto de meio hobby e meia pesquisa desenvolvido durante as férias de verão e inverno quando eu estava na faculdade. A criança original foi projetada para sistemas IA32 multiprocessadores em pequena escala. O recurso mais destacado foram as técnicas práticas sem bloqueio usadas para sincronização. No entanto, a criança antiga foi projetada excessivamente para componentes do sistema operacional relacionados a hardware e regulares. Então finalmente ficou impraticável continuar o desenvolvimento. A criança final conseguiu criar e executar processos e threads do usuário, além de aceitar entradas de teclado, embora um shell não tenha sido implementado ou portado.
A nova criança, por outro lado, foi projetada com um objetivo completamente diferente. Alghough ainda é um projeto de hobby, ele pretende fornecer um microkernel totalmente utilizável e um ambiente completo do sistema operacional para várias arquiteturas e plataformas. A idéia livre de bloqueio é abandonada, pois criou muita complexidade desnecessária.
A criança possui seu próprio sistema de construção escrito em Python: Tmake . O TMAKE cuida das dependências de arquivos e fornece uma série de primitivas como compilar , link , construção e etc. Scripts tmake (também em Python), em seguida, use as primitivas para construir o procedimento de construção.
O Python é necessário para todos os alvos; GCC e Binutils são necessários para arquiteturas host e alvo; O NASM é necessário para os alvos x86 (IA32 e AMD64). O emulador padrão (Qemu/SIMH/Ski) também é necessário se você deseja testar a criança.
Depois que todos os pacotes estiverem instalados, busque o código -fonte.
git clone https://github.com/zhengruohuang/toddler.git
cd toddler Tipo ./tmake build para construir a criança. Uma vez feito, ele gera imagens de disco no target/ Diretório. Se o qemu estiver instalado para a arquitetura de destino, basta digitar ./tmake qemu para iniciar o qemu com parâmetros padrão.
As duas etapas podem ser combinadas digitando ./tmake all , ou simplesmente ./tmake .
O TMAKE suporta ações . Para especificar ações, use ./tmake <actions> . Por exemplo, ./tmake clean build irá limpar os objetos existentes e os arquivos binários e iniciará uma nova compilação.
O TMAKE suporta vários alvos. Para construir um alvo específico, use ./tmake target=<arch-machine>[-suffix] . Observe que os campos Arch e Machine são exigidos pelo TMAKE e o sufixo é opcional. No entanto, a implementação real de um alvo específico pode exigir que o usuário forneça um valor para o sufixo .
Por exemplo, ./tmake target=ia32-pc-bios construirá a criança para um sistema de PC IA32 baseado em BIOS; ./tmake target=armv7-rpi2 construirá a criança para Raspberry Pi 2.
Observe também que você não pode misturar arbitrariamente campos de arco e máquina . Por exemplo, target=ia32-rpi2 é inválido. Combinações inválidas de campos podem deixar de compilar ou até danificar seu dispositivo.
A camada de abstração de hardware (HAL) fornece uma abstração de cada modelo de processador e dispositivos de IO básicos. Exporta uma série de funções e constantes para o kernel. O HAL é mapeado para os 4MB mais altos de todos os processos, incluindo o processo do kernel.
Ao contrário dos sistemas operacionais convencionais, o kernel da criança é um processo real . O kernel não é mapeado para o espaço de endereço dos processos do usuário. No entanto, o layout do espaço de endereço virtual do kernel é um pouco diferente de outros processos. O kernel tem um mapeamento individual graças ao tamanho pequeno de Hal. Como resultado, o gerenciamento de memória física é muito mais fácil e limpa.
Embora a criança seja um sistema operacional micro-kernel, ser muitos servidores pode não ser uma boa ideia. Em vez disso, muitas funcionalidades no nível do sistema são fornecidas em um único servidor - sistema. O processo do sistema implementa o Universal Recursion Manager (URS), o gerenciador de contas de usuário (UAM) e vários sistemas de arquivos.
O processo de driver fornece vários drivers de dispositivos essenciais, incluindo teclados, consoles e discos.
| Arquitetura | Largura | Máquina de destino | Status |
|---|---|---|---|
| IA32 | 32 | PC baseado em Netburst | Atual |
| ARMV7 | 32 | Raspberry Pi 2, Qemu Raspi2 | Atual |
| MIPS32 | 32 | Criador CI20, Qemu Malta | Atual |
| PPC32 | 32 | Mac mini G4, PowerMac G4, Qemu G3beige, Qemu Mac99 | Atual |
| SPARCV8 | 32 | Qemu Sum4M Sparcstation 10, Qemu Leon-3 | Ativo |
| riscv32 | 32 | Espinho | Planejado |
| M68K | 32 | Qemu MCF5208EVB | Planejado |
| sh4 | 32 | Qemu Shix | Planejado |
| VAX | 32 | Simh Vax | Planejado |
| or1k | 32 | Qemu OR1K-SIM | Planejado |
| AMD64 | 64 | PC baseado em Skylake | Planejado |
| ARMV8 | 64 | Raspberry Pi 3, Qemu Virt | Ativo |
| PPC64 | 64 | PowerMac G5, Qemu Mac99 | Planejado |
| MIPS64 | 64 | Loongson 3 Desktop, Qemu Malta | Atual |
| SPARCV9 | 64 | Qemu Sun4u | Inicial |
| alfa | 64 | Qemu Clipper | Inicial |
| riscv64 | 64 | Espinho | Planejado |
| S390 | 64 | Qemu S390X | Planejado |
| IA64 | 64 | Esqui | Planejado |
| HPPA | 64 | HP 9000 PA-RISC WorkStation, Qemu HPPA-Generic | Planejado |