Escrevendo seu próprio sistema operacional viável por seis meses

imagem

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'.


, , -, .

— - , - - , , ( , ) — , , .

!

Source: https://habr.com/ru/post/pt426525/


All Articles