he creado un kernel llamado ModuKernel, esta en ErickStudios/ModuKernel: un kernel modular con un ecosistema modular completamente documentado en español
este kernel aunque es joven ya tiene
- Archivos de ejemplo
- Una tabla de servicios del sistema modular y estructurada
- Una shell basica
- Un gdt
- manejo de excepciones
- Modulos
- Sistema de archivos FAT12
- Sistema de carpetas virtuales
- Interrupciones
- Contador de tick PIC
- Un script de shell
- Una animacion de logo
- Soporte muy basico para red
- su propia paleta de colores
- Modo texto personalizado
- Soporte para C++
- Libreria avanzada C++
- Drivers
y estoy creando mi propio compilador para un lenguaje llamado ModuCandy que sera directamente integrado en el kernel que vendra como uno de los modulos, no compila C si no algo mas parecido a esto
// mi variable
Build_InInt32 let MiVariable
// no necesita un entry point, puede ser plano
// setea la variable MiVariable
r1<=MiVariable // carga la direccion de la variable en eax
r2=5 // mueve el valor 5 a ecx
unsafe "mov [eax],ecx" // setea la direccion a la que apunta eax con el valor de ecx como dword
// obtener el valor
r1<=MiVariable // carga la direccion de la variable en eax
unsafe "mov eax,[eax]" // obtiene en eax el valor dword al que apunta eax (donde cargo la variable)
return // hace ret, en ModuCandy el return no lleva ningun parametro, el valor de retorno esta en r1 (eax) que es donde se guarda el valor de retorno en C cuando se usa un (int)funcion()
genera algo como
call DATA_MODUCANDY_DATA
mov ebx,0
add eax,ebx
mov ecx,5
mov [eax],ecx
call DATA_MODUCANDY_DATA
mov ebx,0
add eax,ebx
mov eax,[eax]
ret
ret
call FUNCION
DATA_MODUCANDY_DATA:
call DATA_MODUCANDY_DATA_GETEIP
ret
;datas
ret ;place for variable (u/i32)
ret ;place for variable (u/i32)
ret ;place for variable (u/i32)
ret ;place for variable (u/i32)
; ModuCandy: eip get runtime for data calc
DATA_MODUCANDY_DATA_GETEIP:
pop eax
push eax
inc eax
ret
y eso en el compilador luego se compila a codigo i386
tambien se puede llamar al programa en el kernel con
kernel/mcandy /ruta/a/archivo.cdy
o abrir la version interactiva
kernel/mcandy --s
Hablando de la version interactiva
en esa version lo que haces es escribir codigo en tiempo real, con el comando :cls eliminas todas las lineas de codigo que hiciste y empiezas desde 0, con :asm puedes ver el codigo que genera tu programa al convertirse a ensamblador, pero sin compilarlo, con :run compilas el programa y lo ejecutas asi sin restricciones y en ring 0, por que todo mi kernel se ejecuta en ring 0, con :q sales de la aplicacion
donde intervienes tu
que les parece?, que me recomienda mejorar?, que añadirian ustedes?, los leo en los comentarios