Escribir su propio sistema operativo durante seis meses

imagen

Antecedentes


Hola Doy la bienvenida a todos categóricamente, hoy me gustaría contarles sobre mi experiencia en la redacción de un sistema operativo viable para la arquitectura x86.

Una noche de primavera, tuve una idea brillante: intentar escribir su propio sistema operativo, que puede permitirle ejecutar programas, trabajar con dispositivos y, en general, exprimir toda la potencia de la arquitectura de Intel en sus necesidades: por ejemplo, para su fábrica o alguna otra cosa Mi objetivo era y es escribir un sistema operativo que pueda permitir el máximo rendimiento para algunas tareas específicas sin perder tiempo de CPU en todo tipo de excesos. Principalmente persigo el interés deportivo, obteniendo experiencia para mí mismo en la programación del sistema y escribiendo controladores para dispositivos que se usan en todas partes. Depende de usted decidir qué surgió, diré de inmediato que no tiene que escribir comentarios sobre la creación de su propia distribución de Linux, y estaba interesado en escribir todo "desde cero", desde cero, para profundizar en el tema de OSdev. Quiero expresar mi profunda gratitud a Benjamin Lunt y al foro OSDev, así como a su Wiki. Ben me ayudó a tratar con EHCI, que sin duda hizo una gran contribución a mi sistema operativo: los dispositivos USB, ¡están en todas partes! También tuve la tarea de crear mi propia arquitectura, conveniente para mí, sin excluir el uso de estándares de archivos ELF. Bueno, vamos al grano.
UPD: toda la información se puede encontrar en el grupo tyk , también hay una publicación con muelles y una imagen (antigua, ahora estoy agregando muelles para la versión estable)

Que se hace


Ahora mi sistema operativo es capaz de trabajar con unidades flash USB, ratones, teclados, discos AHCI, controlador PCI IDE, APIC y ACPI, se implementa el desplazamiento de multitarea, se inician programas, el trabajo de transmisión con archivos, el controlador SVGA, que funciona en modo 0x118 VBE, DNS, DHCP, TCP, UPD, IPv4, HTTP, el controlador FAT32 completo, el controlador RTL8139 (69) y Intel Gigabit Ethernet funcionan.

El sistema de ventanas, junto con mi implementación de SVGA, permite producir hasta 120 FPS con un rediseño completo de la pantalla. Pasemos a cómo se implementa todo esto y, en general, puede funcionar.

Como funciona


Para empezar, escribí un gestor de arranque que lee un gestor de arranque secundario con un núcleo con FAT32. El segundo gestor de arranque entra en modo protegido y salta al núcleo, donde cargo y configuro IDT, después de lo cual inicializo los dispositivos PCI, inicio los núcleos e inicio CMD.

Alguien preguntará, ¿cómo lograste tal desempeño con SVGA? La respuesta es simple: ensamblador, ensamblador y ensamblador nuevamente. No sin las instrucciones SSE, que aceleran enormemente la copia de memoria. Por ejemplo, aquí está el código para copiar un búfer de video en 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/es426525/


All Articles