
Aviso! Quase nada está completo ainda. Tudo aqui é experimental e em desenvolvimento muito ativo. Prossiga com cautela.
Os computadores são estranhos . Estranho no sentido de que eles se sentem mágicos se você não souber como eles funcionam. Se, e quando você começa a aprender como funciona, esse sentimento mágico desaparece. Você acabará com "Uau! Isso é Brillant" ou "Uau ... isso é uma merda".
Então, você tem basicamente duas opções:
Caso ainda não fosse óbvio, peguei o último.
Basicamente, eu queria aprender mais sobre "computadores". Trabalhar no software de nível relativamente alto é bastante divertido, mas tenho o mau hábito de acabar olhando para internets de baixo nível e o funcionamento das coisas.
"Oh, então meus pedidos para
malloc()enewacabam chamando o syscallMAIRmmap()? Vamos verificar sua implementação .. oh, o que éVMA? O que é umMMU? O que éTCRTLB?
Havia essas camadas de abstração que eu não fazia ideia! Eu deveria ter parado por aí, mas não. Em vez disso, eu disse: "Ok. Eu realmente gosto da sensação de chamada de material de baixo nível. Vamos enlouquecer e tentar aprender todas as abstrações escrevendo um sistema operacional" simples ". O que poderia dar errado?" E agora, aqui estou eu.
Sistema operacional hobbyista de trabalho em andamento /microkernel "feito à mão" . O nome é do continente mais político e bagunçado do mundo de Game of Thrones. [^2] Eu realmente gosto (sim, julgue-me o quanto você quiser) e a confusão política disso parecia semelhante aos meus próprios objetivos com este projeto. Tudo está em todo o lugar e nada faz sentido.
Este projeto existe apenas para me ajudar a aprender sobre os sistemas operacionais e se divertir ao longo do caminho. Não afirmo saber muito sobre o desenvolvimento do sistema operacional . Portanto, as práticas, o design de chocolate e algumas implementações que você vê aqui o assustarão.
Eu sugiro Kepp suas expectativas baixas>. <
Nota importante: Westeros está em desenvolvimento muito precoce . As coisas mudarão, freio ou reto são estúpidas. Ainda estou para definir um objetivo final. Até então, espere tudo, em todos os lugares, de uma só vez.
/dev e /proc (idk se isso for possível?)mkdir , touch & catVamos mergulhar um pouco mais no trabalho interno das coisas. A máquina de destino é muito específica e estática . Eu queria mantê -lo o mais simples possível, apoiando apenas a arquitetura ARM64 (ARMV8) e a máquina de virt de braço de Qemu.
Aqui está a máquina alvo.

Somente os periféricos básicos devem ser definidos. Infelizmente, isso significa que não há USB, NVME e NIC. :( talvez no futuro?
Aqui estão os periféricos que pretendo apoiar.
O kernel segue um design simples de microkernel (como a família L4). Eu queria fazer um kernel simples que seja fácil de entender e me ajudar a aprender o máximo possível durante o processo.
Inicialmente, segui o XV6 do MIT. No entanto, quando perguntados, as pessoas me disseram que era um pouco "ingênuo/barato" e provavelmente não me ajudaria a IRL ( elas são pessoas incríveis ). Então, decidi seguir o conselho deles e seguir um design de microkernel. também parece mais interessante oo
Aviso! Meu design de microkernel feito à mão o desencadeará. Por exemplo, coloquei os drivers de dispositivo no espaço do usuário e o agendador dentro do espaço do kernel (basicamente não seguindo realmente um design "adequado/acedêmico").
Apenas me dê algum tempo. Ainda estou aprendendo enquanto vou>. <
Aqui está uma visão geral do kernel. (TODO: será atualizado em breve ...)

TODO: especificações gerais do sistema operacional. O que é o quê e os objetivos futuros.


|-- Build <- Compiled objects, binaries & debug files
|-- Documents <- Reference documents
|-- Emulation <- QEMU scripts & Device Tree Structure
|-- Kernel <- The source code. Headers, C and C++ files
| `-- Arch <- Architecture related code
| `-- Drivers <- Driver source and header files
| `-- Library <- Library source and header files
| `-- Include <- Kernel header files
|-- Media <- Images and other media
|-- Toolchain <- Cross-compiling environment
|-- Userland <- User level source code
| `-- Dir. <- TBD.
|-- .gitignore <- Good ol' .gitignore
|-- Makefile <- Makefile
`-- README.md <- Main README
Atualmente, a única maneira de inicializar Westeros está na máquina Virt da Qemu Ach64 por meio do parâmetro -kernel .
A parte responsável pelo lançamento do kernel (e, portanto, o sistema operacional) é chamado de calço. É um pequeno pedaço de código vinculado ao lado da imagem do kernel e responsável pelo inicialização do sistema.
Ele lida com algumas operações antes que o kernel assuma o controle.
Referência: Sel4 - Elfloader
Máquina do Estado de ARM64 (por exemplo, registros) logo antes de kmain()
0xffff0000401080000x401010000x401020030x401020000x400007010x401030000x401040030x401040000x400007010xbbff440c04000b00000000 (DEVICE_nGnRnE)0b00000100 (DEVICE_nGnRE)0b00001100 (DEVICE_GRE)0b01000100 (NORMAL_NC)0b11111111 (NORMAL)0b10111011 (NORMAL_WT)0b00000000 (Res)0b00000000 (Res)0x4801000100b0 (48 bit)0b100 (44 bits, 16TB)0b01000 (16)0b01000 (16)0b0 (Hierarchical permissions enabled)0b0 (Hierarchical permissions enabled)0b0 (Top Byte used)0b0 (Top Byte used)0b0 (8 bit)0b0 (TTBR0_EL1.ASID defines the ASID)0b0 (Perform table walk)0b0 (Perform table walk)0b10 (4 KiB)0b00 (4 KiB)0b00 (Non-shareable)0b00 (Non-shareable)0b00 (Outer Non-cacheable)0b00 (Outer Non-cacheable)0b00 (Inner Non-cacheable)0b00 (Inner Non-cacheable)0x40101000 (k_l0_pgtbl)0x40103000 (u_l0_pgtbl)0xc508390b1 (MMU enabled)0b0 (Alignment fault checking is disabled)0b00b1 (SP Alignment check enabled)0b1 (SP Alignment check enabled for EL0)0b1 (System instruction memory barrier enabled for EL0 Aarch32)0b0 (Access to Stage 1 Normal memory from EL0 & EL1 are Stage 1 Non-cacheable)O Westeros Kernel segue um design de microkernel. Pessoas/organizações diferentes têm interpretações diferentes sobre como um microkernel deve ser projetado (por exemplo, L4, minix). Aqui eu uso o termo micro como mantendo o kernel o mais simples possível. Isso significa:
Todos os itens acima precisariam ser implementados como aplicativos de espaço do usuário.
O Kernel fornecerá os seguintes serviços e funções:
mmap() )msgsend() , msgrecv() )thread_create() )intr_attach() )gettimeofday() )yield() ) O kernel requer uma imagem do usuário [inicial] do carregador de inicialização. Esta imagem deve conter os primeiros executáveis da ELF que o kernel será lançado (provavelmente a root task e o process manager ).
A imagem do uso pode ser pensada como o initrd usado nos sistemas Linux.
A lista completa de tudo o que o kernel fornece e o funcionamento interno das coisas será explicado mais tarde no futuro. Ainda estou para implementá -los ..
Quanto à referência, usei o alto uso dos seguintes microkernels e oses:
TODO: Algumas coisas divertidas. O que aguarda alguém que eles lançam o sistema operacional?
Os seguintes serviços devem ser implementados:
services.config ) Para construir e executar o sistema operacional, você precisa de três coisas principais: ARM GNU Toolchain , QEMU e um pouco de paciência ™.
É possível construir tudo no seu sistema operacional favorito. ARM GNU Toolchain está disponível no Windows , MacOS e GNU/Linux . No entanto, ainda não testei o Windows . Então, você está sozinho nesse espaço. Desculpe :(
As etapas abaixo são para hosts GNU/Linux (AARCH64) .
0. Certifique -se de ter git e make
$ apt install git make # if using `apt`
$ pacman -S git make # if using `pacman`1. Clone este repositório
$ git clone https://github.com/TunaCici/WesterOS.git 2. Faça o download da última ARM GNU Toolchain
Navegue para armar a página da web do download da cadeia de ferramentas GNU.
Escolha o destino apropriado do AARCH64 Bare-Matel para baixar. A versão não deve importar, então escolha o mais recente. No entanto, o que hospedou a Chain de ferramentas que você baixará importa. Escolha o que é criado para o seu próprio sistema operacional.
Por exemplo, se o seu sistema operacional for GNU/Linux (x86_64) , você baixará:
https://developer.arm.com/-/media/Files/downloads/gnu/12.2.rel1/binrel/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-elf.tar.xz
$ cd WesterOS/Toolchain
$ wget https://developer.arm.com/-/media/Files/downloads/gnu/12.2.rel1/binrel/arm-gnu-toolchain-12.2.rel1-aarch64-aarch64-none-elf.tar.xzÉ sua responsabilidade verificar a "integridade" e "assinatura" do arquivo baixado. Use as teclas SHA256 fornecidas na página de downloads.
3. Extraia o braço baixado ARM GNU Toolchain
Certifique -se de extraí -lo enquanto estiver em Westeros/Toolchain .
$ tar -xvf arm-gnu-toolchain-12.2.rel1-aarch64-aarch64-none-elf.tar.xz 4. Modifique o TOOLCHAIN_PATH no Makefile
O TOOLCHAIN_PATH deve apontar para a sua ARM GNU Toolchain recém -baixada e extraída. Como o seu sistema operacional host e a versão da cadeia de ferramentas podem ser diferentes do meu, você deve editar a variável do caminho.
Se não estiver definido corretamente, o processo make falhará com uma mensagem de erro como:
make[1]: Toolchain/arm-gnu-toolchain-12.2.rel1-darwin-arm64-aarch64-none-elf/bin/aarch64-none-elf-as: No such file or directory
Portanto, certifique -se de editar o TOOLCHAIN_PATH .
# Open the main Makefile /w your favorite text editor
$ vim Makefile
# And change the `TOOLCHAIN_PATH` accordingly. For example..
> TOOLCHAIN_PATH=Toolchain/arm-gnu-toolchain-12.2.rel1-darwin-arm64-aarch64-none-elf
# Save & exit 5. Construir usando make
$ make allA construção termina com uma mensagem de compilação completa. Aproveite a vida <3 . Se você não vir, entre em contato comigo. Vou tentar consertar o problema>. <
Westeros só pode ser executado usando o QEMU. Não tenho planos de criar uma imagem totalmente ligável para hardware do mundo real. Originalmente, minha idéia era imitar um Raspberrry Pi 4B , mas percebi que não seria "amigável para iniciantes" ao testar e desubgar. Então, qemu é!
Tempo de plugue sem vergonha! Se você quiser mais sobre Qemu, visite meu qemu_starter github Thingy.
0. Certifique-se de ter qemu-system-aarch64 instalado
$ apt install qemu-system qemu-utils # if using `apt`
$ pacman -S qemu-full # if using `pacman`1. Lance Westeros
$ make runA partir de 9 de julho de 2023, o Westeros está vazio! Então, você não pode fazer nada, exceto para ver algumas mensagens de kernel muito básicas no terminal:/
Por outro lado, Westeros é um sistema operacional hobby e um processo de aprendizado . Você realmente deve tentar explorar seu código -fonte. Tenho certeza que você vai se divertir mais lá.
TODO: Navegue pelo usuário para outro ReadMe, que é basicamente a documentação.