
Antecedentes
Olá Congratulo-me com todos categoricamente, hoje eu gostaria de contar sobre minha experiência em escrever um sistema operacional viável para arquitetura x86.
Numa noite de primavera, tive uma idéia brilhante - tentar escrever seu próprio sistema operacional, o que permite executar programas, trabalhar com dispositivos e, em geral, extrair toda a energia da arquitetura da Intel em suas necessidades: por exemplo, para sua fábrica ou algo mais. Meu objetivo era e é escrever um sistema operacional que permita o máximo desempenho para algumas tarefas específicas sem perder tempo de CPU em todos os tipos de excessos. Busco principalmente o interesse esportivo, adquirindo experiência em programação de sistemas e escrevendo drivers para dispositivos usados em qualquer lugar. Cabe a você decidir o que aconteceu, direi imediatamente que você não precisa escrever comentários sobre a criação de sua própria distribuição Linux, e estava interessado em escrever tudo "Do zero" - do zero, para mergulhar no tema do OSdev. Quero expressar minha profunda gratidão a Benjamin Lunt e ao fórum OSDev, bem como a sua Wiki. Ben me ajudou a lidar com o EHCI, que sem dúvida fez uma enorme contribuição para o meu sistema operacional - dispositivos USB, eles estão por toda parte! Também tive a tarefa de criar minha própria arquitetura, conveniente para mim, sem excluir o uso dos padrões de arquivo ELF.
Bem, vamos direto ao ponto.
UPD: todas as informações podem ser encontradas no grupo
tyk , há também um post com docas e uma imagem (antiga, agora estou adicionando docas para a versão estável)
O que está feito?
Agora, meu sistema operacional pode trabalhar com unidades flash USB, mouses, teclados, discos AHCI, controlador PCI IDE, APIC e ACPI, a multitarefa deslocada é implementada, os programas são lançados, o trabalho de streaming com arquivos, o driver SVGA, que funciona no modo 0x118 VBE, DNS, DHCP, TCP, UPD, IPv4, HTTP, o driver FAT32 completo, o driver RTL8139 (69) e o Intel Gigabit Ethernet funcionam.
O sistema de janelas, junto com minha implementação do SVGA, permite produzir até 120 FPS com um redesenho completo da tela. Vamos seguir como tudo isso é implementado e geralmente pode funcionar.
Como isso funciona?
Para começar, escrevi um gerenciador de inicialização que lê um gerenciador de inicialização secundário com um kernel com FAT32. O segundo carregador de inicialização entra no modo protegido e salta para o kernel, onde carrego e configuro o IDT, após o qual inicializo os dispositivos PCI, inicio os kernels e o CMD.
Alguém perguntará: como você conseguiu esse desempenho com o SVGA? A resposta é simples: montador, montador e montador novamente. Não sem as instruções SSE, que aceleram bastante a cópia da memória. Por exemplo, aqui está o código para copiar um buffer de vídeo no LFB (Linear Frame Buffer):
.byte 0x60#Save registers in stack
mov %2,%%ecx #Repeat count to ecx
mov %0,%%edi #Video memory start to edi
mov %1,%%esi #Video buffer start to esi
ww1sse2:
movaps (%%esi),%%xmm0 #Copy 16 bytes to xmm0 from buffer
movaps %%xmm0,(%%edi) #Copy from xmm0 to video memory
movaps 16(%%esi),%%xmm0 #16 again, but + 16 from current
movaps %%xmm0,16(%%edi) #16 again, but + 16 from current
movaps 32(%%esi),%%xmm0 #16 again, but + 32 from current
movaps %%xmm0,32(%%edi) #16 again, but + 32 from current
movaps 48(%%esi),%%xmm0 #16 again, but + 48 from current
movaps %%xmm0,48(%%edi) #16 again, but + 48 from current
add $64,%%edi #Add 64 bytes to edi
add $64,%%esi #Add 64 bytes to esi
dec%%ecx#Decrement count
#test %%ecx,%%ecx #Compare ecx with zero
jnz ww1sse2 #If not zero, repeat again
.byte 0x61 #Restore registers from stack
, , , .
— «Watermark Allocator». , , , ..
-, .
MS-DOS: — . MBR , GPT .
— - , — .
, , — , , : , VIM.
, : , , return , - . , , - , .
: , , , , . — , , — — return'.
, , -, .
— - , - - , , ( , ) — , , .
!