Este é o primeiro sistema operacional que criei. Está escrito em dois idiomas: C Language and Assembly.
Este projeto foi ativado desde 15 de dezembro de 2017

Plano de trabalho
Bootloader
Personalizado
Setor de inicialização
Estágio 2
Grub
Kernel
Gerenciamento de memória
Página Alocador de quadros
Alocação de memória dinâmica
Sistema de construção
Escreva texto para VGA
Interrupção da CPU (IDT, ISRS, IRQs, etc.)
Leia o personagem do teclado PS/2
Leia a string do teclado PS/2
Memória virtual (paginação, molduras, etc.)
Alocação de quadros de página e desarlocação
Alocação de memória dinâmica (Liballoc)
Timer da CPU
Obtenha informações da CPU
Relógio em tempo real: para que possamos saber quando o filme começa
Rastreamento da pilha do kernel
Multitarefa
Processos no modo de usuário
Driver de disco rígido
Driver de disco disquete
Sistema de arquivos
Interface gráfica do usuário
Este sistema operacional usa um carregador de inicialização de 2 estágios. Caso o segundo estágio seja quando entramos no modo protegido e chama o kernel.
Os primeiros 512 bytes da minha imagem de disquete contém o setor de inicialização que faz muitas coisas que o modo protegido não pode fazer. (por exemplo, carregando material do disco). Em seguida, ele salta para o segundo estágio carregado em 0x7E00 (logo após o setor de inicialização).
Este estágio carrega o GDT e entra no modo protegido e copia o kernel carregado pelo setor de inicialização de 0x1000 a 0x100000 (1 MB). Por último salto!
O tamanho do kernel está sempre crescendo, mas nem sempre posso aumentar os setores para carregar. Como uma solução. Eu decido usar o grub. O kernel é armazenado como uma imagem ELF ( kernel.img ) em um CD que usa ISO 9660 como seu sistema de arquivos. O GRUB também suporta o MultiBoot, para que meu sistema operacional possa trabalhar em conjunto com outras pessoas (Windows, Linux, etc.).
Entramos no modo protegido, o que significa que não temos acesso às funções do BIOS. Portanto, esse kernel precisa reimplementar essas funções para controlar o hardware.
Agora, reimplei dispositivos padrão: tela e teclado. No desenvolvimento adicional. Vou implementar o driver de disco.
Este sistema operacional usa segmentação e paginação para fornecer proteção de memória. Na minha tabela de descritores globais , coloquei 5 descritores de segmentos:
Segmento nulo
Segmento de código para kernel : o segmento onde meu código do kernel pertence
Segmento de dados para kernel : o segmento onde minhas variáveis globais do kernel pertencem a
Segmento de código para usuário : atualmente não está usando
Segmento de dados para o usuário : o mesmo que 4
Eu também habilito a paginação. Agora, mapeei intencionalmente a quarta página na tabela de primeira página para not-present e read-only , para que você possa gerar uma falha de página executando a entrada de bsod na linha de comando do meu sistema operacional.

Esse kernel fornece um alocador de quadros de página , para que o gerenciamento de memória seja mais conveniente e serei mais fácil de abordar a multitarefa.
Como o tutorial de Jamesm sugere, usarei um bitset para determinar se um quadro é livre ou não.
1: Allocated 0: Free
v v
frame_bitset: 11110111110101111101111111
^
get_free_frame()
Atualmente, implementei um Maloc de colocação sem graça , porque todas as variáveis usadas pelo kernel nunca precisam ser libertadas até que os poderes desativem.
Heap Allocation
-----------------------------------------------
Allocated |
Memory | Free.......until the end of memory
|
-----------------------------------------------
Por ser preguiçoso, porto um alocador de memória de terceiros chamado liballoc , que exigia apenas poucas funções no meu sistema operacional.
Este projeto usa o GNU fabricar para construir. Portanto, a maneira de construir é digitar make , se ocorrerem problemas durante a construção, o tipo make make dep antes. Abra um problema se ainda preso.
Se você não estiver usando Linux ou WSL (Subsistema do Windows para Linux), precisará baixar um compilador cruzado daqui. Em seguida, modifique CC e LD em config.mk .