viernes, 30 de diciembre de 2011

NuOS v0.01

He aquí la primera versión de este kernel, tan solo es capaz de escribir un mensaje, pero cumple con el fin de este proyecto: entregar una forma mas fácil de programar un SO y entregar las herramientas necesarias para comenzar.
De aquí en adelante trabajaré en funciones mas complejas y en la E/S del kernel.
Descargar

Update: He abierto la página en sourceforge.net de NuOS. Incluye una wiki en desarrollo que se encuentra aquí (en inglés).

jueves, 29 de diciembre de 2011

Vuelta al proyecto

Luego de un tiempo con el proyecto en stand by he vuelto a iniciar la programación, pero con un objetivo distinto, debido principalmente a la desmotivación provocada por el hecho de saber que mi bootloader no funcionaba correctamente.
Ahora trabajo en un kernel en C que se iniciara con GRUB, con algunas funciones simples, espero que los que hayan seguido hasta ahora el proyecto lo sigan haciendo y sigan con las ganas de crear su propio kernel, que nada es imposible!
Aprovecho este post para agradecer a #Arming por explicarme como utilizar GRUB.

sábado, 17 de diciembre de 2011

Guía para programar Sistemas Operativos

Lo he estado pensando bien, y en caso de resultar esto, escribire una guía para programar Sistemas Operativos, o por lo menos para programar un Bootloader funcional con características mínimas, para demostrar que no es imposible realizar todo esto que estoy intentando ahora. Estoy aprovechando mis tiempos libres por el momento para escribir líneas y mas líneas de código, pero ya que salí de vacaciones podre tener mas tiempo libre y asi hare todo lo que planeo hacer.
También publicare links interesantes sobre el tema a continuación:
http://es.wikipedia.org/wiki/Llamada_de_interrupci%C3%B3n_del_BIOS
http://es.wikipedia.org/wiki/Boot_Strap_Loader#Funciones_del_BIOS
http://www.ctyme.com/intr/int.htm

viernes, 16 de diciembre de 2011

How to pt1.: Imprimir en pantalla

Este How to trata sobre cómo escribir en pantalla, para esto tratare de ser lo mas gráfico y explicativo posible, para evitar cometer los errores que muchas páginas (y personas que no nombrare) han cometido.

Modo Real:
Escribir en el Modo Real es bastante fácil, ya que se ocupan las interrupciones de la BIOS, la cual en este caso es 10h.

[BITS 16]
[ORG 7C00h]
jmp main
bootmesg db "Loading... please wait... ",0Dh,0Ah,0
print_mesg:
   mov ah,13h     ;Llama a la función 13h
   mov al,00h     ;Modo de escritura
   mov bx,0007h  
   mov cx,1Ah     ;Indica que el numero de caracteres es 26
   mov dx,0000h
   mov bl,07h
   int 10h        ;Llama a la interrupcion 10h

main:
   mov bp, bootmesg
   call print mesg
times 510-($-$$) db 0
db 0x55
db 0xAA


Modo Protegido:
Escribir en el Modo Protegido, a pesar de no ser tan fácil como en el Modo Real, es igualmente fácil, sólo se necesita unas declaraciones y un bucle.

mov ax, 10h
mov ds, ax
mov ss, ax
mov esp, 090000h
mov esi,words
xor edx,edx
loop0:
    mov word cx,[esi]
    mov word [ds:0B8000h+160d+edx],cx
    inc edx
    inc esi
    cmp byte [esi],0
    jnz loop0

words db 'Epspcprpipbpap pspup ptpepxptpop apqpupip',0Dh,0A,0


Aclaro que este código no lo he escrito yo, si no que lo encontre en internet y la verdad es que funciona bastante bien, aun que me encuentro en estos momentos buscando una forma de optimizar el código y buscar las funciones extras.
La letra p entre cada letra del texto a mostrar indica que el texto estara escrito en color negro con fondo gris y estoy tratando de encontrar una forma de escribir en gris con fondo negro.
Cualquier aporte porfavor un comentario o un mensaje en la sección Contacto.

jueves, 15 de diciembre de 2011

Sistema Operativo pt.2: Modo Protegido

Siguiendo con esta guía sobre la programación de un Sistema Operativo desde cero, escribo ahora la segunda parte de esta travesía. Esta vez el tema es el Modo Protegido.
De por si, el paso al modo protegido puede ser dificultoso, sin embargo es bastante fácil, como yo ya lo pude comprobar. Antes de realizar el paso se deben apagar las interrupciones con cli y luego se debe declarar GDT e iniciarlo.
Esto se logra con la siguiente secuencia:

   cli
   lgdt [gdt_desc]


Por lo que para lograr un bootloader funcional se debería escribir:

;NuOS Kernel.
;Copyright (C) 2011  Felipe Cabrera

;This program is free software: you can redistribute it and/or modify
;it under the terms of the GNU General Public License as published by
;the Free Software Foundation, either version 3 of the License, or
;(at your option) any later version.

;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;GNU General Public License for more details.

;You should have received a copy of the GNU General Public License
;along with this program.  If not, see <http://www.gnu.org/licenses/>.



;------------------------------boot.asm------------------------------;
[BITS 16]
[ORG 0x7c00]


jmp main

switch_protected:
   cli
   lgdt [gdt_desc]
   mov eax, cr0
   or eax, 1
   mov cr0, eax
   jmp 0x08:protected_main


main: 
   call switch_protected
   jmp main


[BITS 32]

protected_main:
   jmp protected_main

gdt:
 
gdt_null:
   dd 0
   dd 0
 
gdt_code:
   dw 0FFFFh
   dw 0
   db 0
   db 10011010b
   db 11001111b
   db 0
 
gdt_data:
   dw 0FFFFh
   dw 0
   db 0
   db 10010010b
   db 11001111b
   db 0
 
gdt_end:
 
gdt_desc:
   dw gdt_end - gdt - 1
   dd gdt


times 510-($-$$) db 0
db 0x55
db 0xAA


Pero claro, este bootloader no hace nada, y con nada me refiero visualmente nada, y esto no le agrada mucho a la gente. Además descubrí como escribir en el Modo Protegido, por lo que hay que aprovechar esto.


;NuOS Kernel.
;Copyright (C) 2011  Felipe Cabrera

;This program is free software: you can redistribute it and/or modify
;it under the terms of the GNU General Public License as published by
;the Free Software Foundation, either version 3 of the License, or
;(at your option) any later version.

;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;GNU General Public License for more details.

;You should have received a copy of the GNU General Public License
;along with this program.  If not, see <http://www.gnu.org/licenses/>.


;------------------------------boot.asm------------------------------;
[BITS 16]
[ORG 0x7c00]

jmp main

bootmesg db "Loading... please wait... "

init:
   mov ax, cs
   mov ds, ax
   mov es, ax
   ret

print_mesg :
   mov ah,0x13
   mov al,0x00
   mov bx,0x0007
   mov cx,0x1A
   mov dx,0x0000
   int 0x10
   ret

clrscr :
   mov ax,0x0600
   mov cx,0x0000
   mov dx,0x174f
   mov bh,0
   int 0x10
   ret

switch_protected:
   cli
   lgdt [gdt_desc]
   mov eax, cr0
   or eax, 1
   mov cr0, eax
   jmp 0x08:protected_main

main:
   call init
   call clrscr
   mov bp,bootmesg
   call print_mesg
   call switch_protected
   jmp main

[BITS 32]
protected_main:
   mov ax, 10h
   mov ds, ax
   mov ss, ax
   mov esp, 090000h
   mov esi,words
   xor edx,edx
   loop0:
       mov word cx,[esi]
       mov word [ds:0B8000h+160d+edx],cx
       inc edx
       inc esi
       cmp byte [esi],0
       jnz loop0
   jmp protected_main

gdt:

gdt_null:
   dd 0
   dd 0

gdt_code:
   dw 0FFFFh
   dw 0
   db 0
   db 10011010b
   db 11001111b
   db 0

gdt_data:
   dw 0FFFFh
   dw 0
   db 0
   db 10010010b
   db 11001111b
   db 0

gdt_end:
 
gdt_desc:
   dw gdt_end - gdt - 1
   dd gdt

words db ' p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p pNpupOpSp pkpeprpnpeplp p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p pPprpoptpepcptpepdp pMpopdpep pEpnpapbplpepdp.p p',0000

times 510-($-$$) db 0
db 0x55
db 0xAA


Esto da como resultado lo siguiente:

miércoles, 14 de diciembre de 2011

Aviso!

El mismo día de la publicación de mi última entrada, mi notbook (en el cual poseo todo el entorno en el cual programo) perdió a su cargador de batería y, lógicamente, se terminó por acabar. Es por esto que no he seguido publicando, pero apenas compre el cable, reanudare mi trabajo sobre los sistemas operativos, lo cual espero que suceda de aquí a mañana.

domingo, 11 de diciembre de 2011

Bootloader Update

---------------------------------------------------------------------------------------------------------
Actualizado:
La función no escribe en Modo Protegido, tal como lo dice Eternal Idol en el foro de elhacker.net y probando con mover los códigos me di cuenta que realmente paso a Modo protegido, ya que al trasladar todo el código para imprimir en pantalla al sector de 32 Bits simplemente no escribe nada. El código del boot lo corregí, pero ahora solo escribe en el main de la sección a 16 bits, mientras busco como grabar a la memoria de video en el modo protegido.
---------------------------------------------------------------------------------------------------------
Bueno, este update es para mostrar lo que he avanzado desde anoche hasta hoy. Puede que suene a poco tiempo, pero he aprendido muchas cosas nuevas.
Esta vez incluire una captura de pantalla, y lamentablemente el código por ahora no tiene comentarios, pero los agregare durante el día (Me da mucha flojera -.-) Tal vez deba aclarar que este código no funciona al 100%, pero estoy depurandolo para obtener el resultado deseado.
Acá va el código:

;NuOS Kernel.
;Copyright (C) 2011  Felipe Cabrera

;This program is free software: you can redistribute it and/or modify
;it under the terms of the GNU General Public License as published by
;the Free Software Foundation, either version 3 of the License, or
;(at your option) any later version.

;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;GNU General Public License for more details.

;You should have received a copy of the GNU General Public License
;along with this program.  If not, see <http://www.gnu.org/licenses/>.
;----------------boot.asm------------------;
[BITS 16]
[ORG 0x7c00]

jmp main

bootmesg db "Loading... please wait... "

init:
   mov ax, cs
   mov ds, ax
   mov es, ax
   ret

print_mesg :
   mov ah,0x13
   mov al,0x00
   mov bx,0x0007
   mov cx,0x20
   mov dx,0x0000
   int 0x10
   ret

clrscr :
   mov ax,0x0600
   mov cx,0x0000
   mov dx,0x174f
   mov bh,0
   int 0x10
   ret

switch_protected:
   cli
   mov eax, cr0
   or eax, 1
   mov cr0, eax
   jmp 0x08:protected_main

main:
   call init
   call clrscr
   mov bp,bootmesg
   call print_mesg
   call switch_protected
   jmp main

[BITS 32]
protected_main:
   jmp protected_main

times 510-($-$$) db 0
db 0x55
db 0xAA
Acá incluyo la captura made by myself (Tengo que admitir que tuve que istalar GIMP) la cual muestra un alentador mensaje (jeje) el cual, si analizaron el código, no es lo deseado.
Claramente habíamos quedado en que diría "Loading... please wait' y luego de cargar el Modo 32 Bits (Protected Mode) diría "Switched to protected mode"... pero solo dice "Switch".
---------------------------------------------------------------------------------------------------------
Actualizado:
El error fue bastante estúpido -.-
Simplemente cx estaba indicando que se leerían 32 carácteres y todo en total poseia mas de 32, por lo que se leí cortado. Otro error fue que se cargaba todo el texto inmediatamente y no el orden ya que se almacenaba todo el texto y luego se deplegaba todo. Por esto, ahora me encuentro buscando como escribir en la video memory.
(Tratando de descifrar como se emplea el método que se explica en http://wiki.osdev.org/Printing_to_Screen)
---------------------------------------------------------------------------------------------------------
Yo no sé mucho de ASM por lo que no podría decir con exactitud que és, solo sé que probablemente sea un error al cargar el Modo Protegido. Quien sepa que es lo que pasa y/o tiene una solución para esto por favor que comente en esta publicación o a mi correo feelipee.024@hotmail.com
Pronto tratare de habilitar una página Contact me para este fin, recuerden que si este proyecto se concreta estará a disposición del público en general y de hecho, ya lo está, ya que todo avance es y será publicado.

sábado, 10 de diciembre de 2011

Sistema Operativo pt.1: Bootloader simple

Comenzaré el desarrollo de este blog, explicando que no soy ningún experto en programación, sólo soy un aficionado al cual le interesa poder algún día programar por completo un sistema operativo. La verdad, es que voy aprendiendo a programar mientras desarrollo este SO, al cual he llamado simplemente NuOS.
Ahora vamos a lo que nos reúne, el Bootloader. Como muchos ya me han dicho, puede ser más fácil utilizar GRUB, pero la verdad yo almenos no entiendo como m***** hacerlo funcionar -.-
Por esto que decidí hacer uno propio que simplemente muestre un mensaje. Por ahora eso puede ser suficiente.
Estoy buscando información sobre como leer el segundo sector del floppy y así ejecutar un kernel que hasta ahora estaría programado en C, por favor si alguien tenga esa información puede comentar aquí o enviarlo a mi correo feelipee.024@hotmail.com.
Acá va el código:

;NuOS Kernel.
;Copyright (C) 2011  Felipe Cabrera

;This program is free software: you can redistribute it and/or modify
;it under the terms of the GNU General Public License as published by
;the Free Software Foundation, either version 3 of the License, or
;(at your option) any later version.

;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;GNU General Public License for more details.

;You should have received a copy of the GNU General Public License
;along with this program.  If not, see <http://www.gnu.org/licenses/>.
;------------------------------boot.asm----------------------------------;
[BITS 16]                            ;Indica al compilador NASM (el que yo
                                     ;utilizo) que el Bootloader se ejecuta
                                     ;en Modo Real (16 Bits)
[ORG 0x7c00]                         ;No tengo ni p*** idea de que es esto
 
   xor ax, ax                        ;declaraciones,
   mov ds, ax                        ;declaraciones
   mov ecx, 0xFF                     ;y mas declaraciones...

   cli                               ;Desactiva las interrupciones
   sti                               ;Inicializa las interrupciones
 
   mov si, msg                       ;Mueve el contenido de 'msg' a 'si'

ch_loop:lodsb                       
;Creo que me faltaba algo...
   or al, al                         ;...mas declaraciones -.-
   jz hang                           ;
   mov ah, 0x0E                      ;Mueve 0x0E a 'ah'
   int 0x10                          ;llama a la interrupción 0x10

                                     ;(Imprimir en pantalla)
   jmp ch_loop

hang:
   jmp hang

msg   db 'Inicializado', 13, 10, 0   ;'msg' es el texto a escribir

                                     ;ahora indicamos que el texto sera
                                     ;'Inicializado'

   times 510-($-$$) db 0             ;Indica que todo lo anterior usa 510 bits
   db 0x55                           ;Declaración: el bit 511 corresponde a 0x55
   db 0xAA                           ;Declaración(sabías que odio las

                                     ;declaraciones?): el bit 512 es 0xAA
;Así es como se completan los 512 bits del primer sector del floppy (MBR)
;Recuerda que para compilar debes escribir en la terminal:
;          ~$ nasm boot.asm -o boot.bin
;y para guardarlo en una imagen de floppy
;          ~$ dd if=boot.asm of=floppy
;Recuerda ademas que si no tienes instalado NASM
;          ~$ sudo aptitude install nasm

Cualquier cosa nueva que añada será escrita en este blog, el cuál seguirá mi travesía dentro del mundo de la programación de Sistemas Operativos -.-