Autor Tema: Proyecto retomado 15/02/06 y kernel de prueba  (Leído 5934 veces)

Desconectado HQH

  • Administrator
  • Miembro Imprescindible
  • *****
  • Mensajes: 1.856
    • Ver Perfil
Proyecto retomado 15/02/06 y kernel de prueba
« en: Febrero 15, 2006, 01:20:05 pm »
Hola amigos, como sabeis este proyecto lleva mucho tiempo parado.
Es hora de retomarlo. Cuando lo empece, ni siquiera estaba en la universidad, ahora practicamente he terminado y he aprendido mucho sobre sistemas operativos.

Por lo cual, creo que ahora, con mucho mas conocimiento de causa, es momento de retomarlo, ya que creo que ahora yo personalmente estoy mucho mas preparado. Por supuesto, quien quiera unirse es libre de ello.

Perdi gran parte del material que poseia, asi que he decidio empezar de 0.

He ido a este site : http://www.mega-tokyo.com/osfaq2/index.php/BareBones y he conseguido codigo para hacer un programa arrancable en GRUB , le he metido un poco de codigo C para hacer pruebas, y funciona sin problemas.

El archivo del kernel es "kernel.bin" y he hecho un script de linux para compilarlo.
Simplemente borra la pantalla y muestra el mensaje "Hola Hispabyte ;)", usando una printk muy rudimentaria.

Tambien he actualizado (Casi) todos los enlaces del proyecto, eliminando antiguos. Ahora voy a intentar recuperar el documento de Harpo, si lo hago lo cuelgo.

Ahora os comento el primer paso que creo que debemos dar: crear un manejador de interrupciones.

Quien se quiera involucrar activamente en el desarrollo (por ahora no hace falta testers ni grafistas, solo dise?adores y codificadores) puede ponerse en contacto conmigo. Tampoco hace falta ser el puto amo, solo tener ganas de aprender y facilidad para documentar autodidacticamente.

Os dejo el kernel de ejemplo compilado en el archivo adjunto

Paxet

  • Visitante
Proyecto retomado 15/02/06 y kernel de prueba
« Respuesta #1 en: Abril 05, 2006, 08:23:13 am »
Creo que estamos en la misma situaci?n, porque cuando empezamos el proyecto yo tambi?n estaba comenzando a aprender a programar y ahora me queda 1 asignatura para terminar la carrera  :lol: .

Ayer estuve mirando el c?digo e intentando compilar y tal. Lo que no puede hacer (me tuve que acostar ya) fue cargar el kernel, pero por el resto he conseguido compilar bien.

Lo que he hecho es cambiar tu escript compila por un Makefile, y ahora con solo hacer:
Código: [Seleccionar]
bash$: makeCompila el kernel, hace el ensamblado y lo enlaza con el linker. Y he camviado el mv a.out kernel.bin, por el parametro -o kernel.bin en el ld.

Adem?s he realizado ciertas modificaciones en el k_printf debido a que me daba error con
Código: [Seleccionar]
*message++;Lo he cambiado por:
Código: [Seleccionar]
*message= *message+1;Porque me dec?a que no se hac?a nada con el valor calculado. ?Qu? versi?n del gcc tienes? Es importante por si no tenemos la misma.

Y otras modificaciones que he hecho, es en el loader.S, ya que tengo un amd64 y los registros no son los mismos. Pero me falta modificar el makefile para que coja el loader correcto seg?n el tipo de procesador.

Ahora estoy en el curro, pero esta tarde lo apa?o, lo pruebo y si todo va bien lo posteo.


Lo que necesitar?amos es un repositorio svn (o cvs) y alguien que fuera documentando el proceso de creaci?n desde cero. Para luego tener as? un documento sobre c?mo crear un sistema operativo desde cero.

Y otra cosa, ?qu? le pones al grub para que cargue el kernel? ?Y d?nde situas el kernel.bin?

Desconectado HQH

  • Administrator
  • Miembro Imprescindible
  • *****
  • Mensajes: 1.856
    • Ver Perfil
Proyecto retomado 15/02/06 y kernel de prueba
« Respuesta #2 en: Abril 05, 2006, 10:58:37 am »
[CONTAR VIDA Y EXCUSARSE]Bueno , prepare esa parte pero no segui porque el proyecto, las practicas y algunas cosas personales me estan quitando tiempo, pero este verano estare limpio (espero trabajar antes, mi idea es acabar o casi acabar el proyecto en pascua). Esque realmente me quedan 2 asignaturas + proyecto, pero como me quiero pasar a la superior, me he cogido 3 mas para ir quitandome cosas. [/CONTAR VIDA Y EXCUSARSE]

Por lo demas , tus ideas me parecen geniales

-Documentar el proceso. Esto a ver si lo puedo hacer estos dias sobre lo poco que hice..

-Crear un makefile (ya lo hiciste)

Para cargar el Kernel, cree una entrada de Grub normal y corriente indicandole la ruta del archivo .bin
No estoy en linux, cuando este te pongo los cambios exactos.

Si tu loader.s funciona, postealo como una version para AMD.

Un saludo Paxet

Desconectado JMA_SP

  • Moderator
  • Miembro Imprescindible
  • *****
  • Mensajes: 752
    • Ver Perfil
Proyecto retomado 15/02/06 y kernel de prueba
« Respuesta #3 en: Abril 05, 2006, 03:03:23 pm »
Supongo que utilizando GRUB ya no se puede decir empezando de 0 puesto que el bootloader nos lo saltamos, luego ya programamos en C por lo tanto el GRUB ?en que nos deja? modo protegido y todo eso?

- Lo de saber la versi?n de compilador esta bien para que a todos nos funcione igual.

- Supongo que como esto es hispabyte.net el S.O. se puede llamar HipabyteOS.

- Bas?ndose en este nombre ya puedes empezar a organizar un concurso de banners de inicio, eso si que no tenga ventanitas...para sacar una pantalla inicial mientras carga en por ejemplo 640x480 o menor resoluci?n y 256 colores aunque se puede sacar con otra resoluci?n y color claro, para ellos solo necesitamos establecer el modo gr?fico y hacer una transferencia de bloques a la memoria de video, no es mucho pero que ya tenga una presentaci?n salvo que el inicio lo querais en modo texto. Lo dec?a por que se ponga en dicha presentaci?n ya la versi?n. Luego le hacemos un fading y que aparezca el resto de mensajes del kernel.

- En C ando un poco-bastante pez pero intentar? releerme alg?n libro y ejemplos m?s que el ?ltimo de C++ me perd? un poco. Intentar? colaborar en lo que pueda as? me sirve para practicar C.

- Unos de los primeros pasos tambi?n ser?a que realizase el reconocimiento de elementos simples del equipo como cantidad de memoria, disqueteras, discos, cpu (cpuid), puertos serie / paralelo....(en pci me pierdo y usb-firewire por tanto ni idea)  y lo presente en pantalla similar a como lo hace linux.

- Lo puedo probar en bastantes equipos incluido alg?n AMD 64 si en alg?n momento los veo libres.

- Nada m?s que cuando pueda me miro el c?digo y lo compilo.

Por cierto la edici?n de documentaci?n y otros recursos creo que deberiamos realizarla con la referencia de OPENOFFICE que funciona muy bien y es accesible a todos, por ejemplo para generar en formato .odt. Como de ah? se puede luego guardar en otros incluyendo html.
Puntualizar que no siempre se ven igual los documentos si de guardan en .doc cuando se cargan con el office y que la salida html tiene sus ventajas por los hiperenlaces pero tampoco se hasta que punto el html generado dar?a m?s trabajo que otra cosa en el momento que por ejemplo se incluyan im?genes.
« última modificación: Abril 05, 2006, 03:10:09 pm por JMA_SP »

Desconectado HQH

  • Administrator
  • Miembro Imprescindible
  • *****
  • Mensajes: 1.856
    • Ver Perfil
Proyecto retomado 15/02/06 y kernel de prueba
« Respuesta #4 en: Abril 05, 2006, 07:38:19 pm »
Lo de GRUB, si, nos salta el bootloader. Pero bueno, asi aparte de tener uno estandard, lo podemos practicar todo y hacer un boot loader mas tarde.

Tranquilo el C con la practica, no tendras problemas.

Es MUY pronto para pensar en Banners y parecidos tengo que advertirte de eso.

La idea de lo proximo a hacer, es un controlador de interrupciones del hardware, que simplemente registre interrupciones y sepa a que funcion llamar cuando de produzcan para que las trate.

Poco a poco, la idea es esa.

Sobre la version del compilador, el error de Paxet, es extra?o, deberia funcionar en cualquier GCC.
Pero si, seria bueno usar la misma.

Sobre la doc, a ver si puedo redactar algo cuando tenga un rato. Sobre el formato, HTML, ODT oPDF eso descarao :D

Un saludo.

Paxet

  • Visitante
Proyecto retomado 15/02/06 y kernel de prueba
« Respuesta #5 en: Abril 05, 2006, 09:28:06 pm »
Posteame lo del grub por fa... que aun no he podido cargar satisfactoriamente el kernel.
Me dice que no tiene un formato elf correcto, o algo as?

EDITADO:

En cuanto pueda arrancar el kernel, posteo los ficheros con los cambios realizados
« última modificación: Abril 05, 2006, 09:28:47 pm por Paxet »

Paxet

  • Visitante
Proyecto retomado 15/02/06 y kernel de prueba
« Respuesta #6 en: Abril 05, 2006, 10:43:39 pm »
Lo subo, por si quer?is probarlo vosotros.

Lo que no he conseguido aun es una forma de detectar el tipo de procesador en el makefile, as? que os toca hacer un:
Código: [Seleccionar]
export CPU=$(uname -m)Antes de hacer el make.

Con make install si est?is como root copiais el kernel.bin a /boot
Y con make clean limpiais el directorio de .o y archivos de respaldo (los que terminan en ~).
« última modificación: Abril 06, 2006, 07:31:44 am por Paxet »

Desconectado HQH

  • Administrator
  • Miembro Imprescindible
  • *****
  • Mensajes: 1.856
    • Ver Perfil
Proyecto retomado 15/02/06 y kernel de prueba
« Respuesta #7 en: Abril 06, 2006, 12:51:53 am »
Lo que te comentaba del GRUB:

Debemos editar el archivo de configuracion del GRUB. En mi caso, en ubuntu esta en :

/boot/grub/menu.lst

Ahi debemos a?adir las lineas, junto a las demas opciones de arranque
Código: [Seleccionar]
title           Mi sistema operativo
root            (hd0,6)
kernel          /home/usuario/proyectoSO/kernelminimo/kernel.bin
boot
En title, colocar como quereis que os salga al arrancar
En root, creo que es el dispositivo que tomamos como raiz, ese en mi caso
En kernel, colocar la ruta de donde tengais el kernel.
La opcion boot indica que es arrancable

Con eso, podemos arrancar el kernel que tenemos.
« última modificación: Abril 06, 2006, 12:52:24 am por ]_HQH_[ »

Desconectado JMA_SP

  • Moderator
  • Miembro Imprescindible
  • *****
  • Mensajes: 752
    • Ver Perfil
Proyecto retomado 15/02/06 y kernel de prueba
« Respuesta #8 en: Abril 06, 2006, 10:10:33 pm »
Le?e esto va a resultarme dificil, incluso el ensamblador que utiliza gcc parece preferir la sintaxis de AT&T

?Como se puede realizar c?digo en NASM con sintaxis intel para enlazarlo con el kernel?
?Alg?n ejemplo sencillo de como mostrar mediante ensamblador texto en pantalla, me refiero a nasm y
  el kernel en c?
? Estariamos trabajando en modo protegido o flat mode?
 
« última modificación: Abril 06, 2006, 10:14:02 pm por JMA_SP »

Desconectado HQH

  • Administrator
  • Miembro Imprescindible
  • *****
  • Mensajes: 1.856
    • Ver Perfil
Proyecto retomado 15/02/06 y kernel de prueba
« Respuesta #9 en: Abril 06, 2006, 10:57:10 pm »
Dado que es didactico, yo creo que lo mejor es hacer TODO  en C (En ensamblador solo seria una muy muy peque?a parte para algun caso concreto que seria de "casi copiar y pegar").

La idea no es que sea optimo, sino que funcione y sea facil de entender, asi que no sufrais por el ensamblador.

Sobre lo que preguntas JMA, pos ni idea, yo creo que con que compilemos lo de C para I386 y lo de ensamblador tambien, no habria problemas ?no?

Desconectado JMA_SP

  • Moderator
  • Miembro Imprescindible
  • *****
  • Mensajes: 752
    • Ver Perfil
Proyecto retomado 15/02/06 y kernel de prueba
« Respuesta #10 en: Abril 06, 2006, 11:40:57 pm »
Yo lo digo por varias razones en mi modesto conocimiento:

1?. Por lo que he visto del c?digo de kernel.c utiliza punteros a la direcci?n de memoria 0xb8000 para borrar la pantalla utilizando texto blanco sobre fondo negro en una pantalla de 80x25, hasta ah? claro.
2? Despu?s utiliza una funci?n similar para enviar el texto hola hispabyte a la funci?n k_printf.

Esto es una forma de tener definido un poco como sacar texto por la pantalla, bien.

La cuesti?n es que si no me equivoco compilando un programilla como este no creo que felizmente nos deje, ya que accede directamente a la memoria como lo hariamos desde un DOS, utilizando los servicios de la int 80h de linux puede ser que s?, de  una forma similar a como lo hariamos con la int 21h. Si no me equivoco el acceso a puertos y cosas similares requiere de privilegios como el tipo root. Cuando arrancas el binario ya no estas bajo linux pero mientras compilas ?has podido hacer funcionar algo directamente en linux de las llamadas a 0xb8000?

Si fuese en modo real de 16 bits la direcci?n del adaptador gr?fico color seria 0xb800
al ser en 32 bits la direcci?n del adaptador gr?fico color es en este caso la 0xb8000

De forma similar para utilizar algo ya en modo gr?fico seria como:

Modo real de 16 bits:                0xa000

Modo protegido de 32 bits:      0xa0000

Llegados aqu?, y ya se que no consiste en hacer nada gr?fico pero tratar? de hacer algo para ver que sucede con la forma de pasar a memoria alg?n grafico en comparaci?n al modo de 16 bits.
Uno de los m?s simples de 16bits es el 13h de320x200x256 pasado ese l?mite superamos los 64kbytes y por tanto requer?a un cambio de banco de memoria que lo podemos realizar con las funciones VESA.
A ver si aqu? tambien funcionan las int 10h y las 10h extendidas que pueden dar mucho juego.

Llegamos por tanto a lo que creo que te refer?as que es definir unas interrupciones para el sistema ?no?
supongo que te refieres a interrupciones software o a programar algo mas en el 8259 (en este ?ltimo caso me pierdo a?n m?s aunque un primer paso ser?a estudiarse la informaci?n disponible en internet del universo digital: http://atc.ugr.es/docencia/udigital/index.html)
Si es por definir la primera int propia del sistema si alguien da el primer paso luego supongo que ser?a seguir el mismo patr?n pero d?ndola funcionalidad con m?s servicios.
En mega-tokyo alguien sugiri? el uso de syscall y sysret pero al mismo tiempo que en algunos procesadores parec?a no funcionar as? que mejor el uso tradicional de llamar a la interrupci?n y hacer un ret para retornar.
El c?digo parece copiado de alg?n lado y traducido por lo dem?s OK porque al no utilizar las librerias que llaman a int propietarias de otros SO es una forma de comenzar, algo as? como lo que realiz? Matias con Toro pero el lo lleva bastante m?s avanzado y escogi? freepascal + ensamblador. Tambi?n el en un momento dado cambi? su boot record por grub.


Disculpar la parrafada.
« última modificación: Abril 06, 2006, 11:54:34 pm por JMA_SP »

Desconectado HQH

  • Administrator
  • Miembro Imprescindible
  • *****
  • Mensajes: 1.856
    • Ver Perfil
Proyecto retomado 15/02/06 y kernel de prueba
« Respuesta #11 en: Abril 08, 2006, 11:30:18 am »
Exacto, lo de la memoria es un acceso directo a la memoria de video.

Lo de las interrupciones, es "Simplemente" hacer un soft que detecte a interrupciones, y una vez detectadas, mande ejecutar una funcion concreta y especifica de la interrupcion (manejador de interrupcion)

Hay material sobre como funcionan las interrupciones en I386 , pero si quereis cuando tenga un rato busco y posteo.

Desconectado JMA_SP

  • Moderator
  • Miembro Imprescindible
  • *****
  • Mensajes: 752
    • Ver Perfil
Proyecto retomado 15/02/06 y kernel de prueba
« Respuesta #12 en: Abril 08, 2006, 01:30:26 pm »
Pues s?, porque en todos los que se plantean algo parecido a este proyecto es algo que les trae de cabeza, el como realizar la gesti?n de interrupciones, m?s de uno se sorprender?a de ver la cantidad de gente que postea en otros sitios buscando un primer c?digo o ejemplo simplificado para hacer sus primeros pinitos y que la cosa les funcione. Yo creo que todo esto es porque hay mucho libro y otros escritos pero en vez de ense?ar a dar los primeros pasos ellos ya directamente corren y muchos se quedan igual. Lo de siempre haciendo dificil lo f?cil cuando con un ejemplo claro es mejor.

Dejo este enlace:

http://www.delorie.com/djgpp/

Descargando la versi?n para DOS y 32 bits (no tiene protecci?n de memoria y eso nos interesa sobremanera) , me descargar? FREEDOS y probar? como funciona, ya que creo que es el sistema operativo mejor para desarrollar este otro. Tambi?n permite una vez que se han actualizado sectores con c?digo en el mismo generar una imagen o restaurarla a un disquete mediante el mandato diskcopy que tiene m?s funcionalidades que el del DOS tradicional.

http://www.freedos.org/
http://freedos-32.sourceforge.net/

Tienen una especie de chat pero no veo que lo usen mucho, quiz? en alg?n momento se podr?a entrar all? si no les molestase para exponer ideas.

http://www.tableria.de/freedos.html

Me pierdo un poco, no se si en ese mismo server se podr?a crear algo para utilizarlo en otro canal nuevo.

Un poco de historia (tampoco ellos ten?an todo claro):

http://www.freedos.org/freedos/about/


Para aquellos de vosotros que no lo hayais utilizado nunca os dejo un enlace a sus especificaciones. No es mala idea crearse un disco de arranque o incluso un CD-Bootalbe personalizado con ?l. En esta se ve como est?n desarrollando un nuevo sistema de ficheros LEAN (que es FREE) y es una alternativa al FAT para empezar.
Ventajas:
- Est? en sus comienzos y por tanto el aprenderlo nos dar?a el mismo nivel que tienen ellos en su desarrollo y ser?a compatible con este SO, aparte de
  que la documentaci?n no tiene porque escondernos "nada" y al ser moderno ya tiene un buen desarrollo. Una posible pega es que est? en Ingl?s pero  
  si tengo tiempo lo traducir? para este y para HispanOS (en formato .odt de openoffice), si me da tiempo para ello esta semana santa.Despu?s de    
  todo cualquier sistema operativo tarde o temprano tiene que tener un sistema de archivo para ir organizando el trabajo, tan importante como crear las
  interrupciones software.
« última modificación: Abril 08, 2006, 10:51:25 pm por JMA_SP »

Desconectado JMA_SP

  • Moderator
  • Miembro Imprescindible
  • *****
  • Mensajes: 752
    • Ver Perfil
Proyecto retomado 15/02/06 y kernel de prueba
« Respuesta #13 en: Abril 10, 2006, 11:35:49 pm »
Sobre interrupciones, supongo que cualquier aclaraci?n-aportaci?n nos vendr? bien, sobre todo en el sistema a seguir sobre el paso de par?metros, ya que el tipo de interrupci?n a llamar parece claro que debe efectuarse mediante eax:

http://www.cs.uaf.edu/2006/spring/cs321/le...interrupts.html

Recordar tambi?n que en la parte m?s baja de la memoria (al menos en modo real) tenemos los llamados vectores de interrupci?n, siendo un total de 256,formados por sus correspondientes segmento:desplazamientos (4 bytes si no me equivoco en modo real), con lo cual para calcular el offset o desplazamiento necesitariamos multiplicar el n?mero de vector por 4.

Y ya puestos otras direcciones de memoria por encima de estos vectores (vector=apuntan a direcciones de memoria) se encuentra la famosa BDA o ?rea de datos bios 0040:0000 en adelante (tambi?n existe una EDBA).

El que existan estos vectores de interrupci?n no significa que se utilicen todos, muchos de ellos estan documentados en la web de Ralf Brown, otros simplemente son OEM que cada fabricante implementa como partes de la int 15h y que no necesariamente tienen porque estar documentados.
El hecho de que sean vectores significa que si modificamos la direcci?n a la que apuntan y lo direccionamos a otra donde ubicamos nuestro c?digo, cada vez que se llame a dicha interrupci?n har? lo que especifiquemos (no se si habre?s leido alguna vez sobre el mandato swapvectors o similares).
Retornamos de una llamada de interrupci?n mediante IRET (Interrupt Return).
Lo que no tengo muy claro es el resto de par?metros, si bien es cierto que podemos seguir pas?ndolos con el resto de registros disponibles, lo cual lleva a que interrupciones nos modifican en su retorno dichos registros y si debemos salvaguardarlos previamente.

Por ejemplo si una funci?n de C o Pascal la pasamos a ensamblador vemos que para que todo funcione bien los parametros de la funcion llamante se ponen en orden inverso:

function llamar (a,b,c,d:byte):byte;

se pondr?an el la cola de la pila en el orden d,c,b,a de manera que el c?digo que lo recoge saque primero el valor de la pila LIFO (Last In First Out: ?ltimo en entrar primero en salir) y de esa forma el primer valor que coger?a ser?a el a, luego el b, luego el c y despu?s el d que es el orden establecido inicialmente como queriamos.
Os dejo este enlace donde podeis leer m?s sobre esto:

http://www.hackinthebox.org/modules.php?op...order=0&thold=0

No os extra?eis por el c?digo en ensamblador, est? en el formato AT&T que aunque a mi no me va mucho es la otra opci?n al que probablemente esteis acostumbrados de Intel, pero observ?ndolo un poco se entiende. El modo de entender aqu? los mandatos es por ejemplo al rev?s:

movl $4,%eax mueve $4 al registro eax

similar al formato Intel:

movl eax,04h


 :rolleyes:

Solo una nota final:
En el modo protegido del procesador lo que se utilizan son descriptores siendo los principales:

- LDT.: Local Descriptor Table o Tabla de Descriptores Locales.
- GDT: Global Descriptor Table o Tabla de Descriptores Globales.
- IDT: Interrupt Descriptor Table o Tabla de descriptores de Interrupci?n.
Se cargan con una orden similar precedidos por una L de Load, y ah? a?n me pierdo, salvo que la cosa ya no va como se maneja en modo real el segmento de C?digo (CS) y el segmento de Datos (DS).
Bastante m?s complicado pero tambi?n tiene sus interrupciones con sus prioridades.
Al utilizar tablas permite por ejemplo que la memoria sea como un mapa reubicable de forma que se puede gestionar de una manera l?gica que luego se traduce a la real o f?sica (como dato curioso linux puede llegar a funcionar esquivando zonas de memoria defectuosa de forma similar a como se hace en un disco duro marcando las partes erroneas como no utilizables).

Como sigo aprendiendo si hay fallos, comentarios ayudas ya sabeis postear.
« última modificación: Abril 11, 2006, 12:29:27 am por JMA_SP »

Desconectado octavio

  • Novato
  • *
  • Mensajes: 39
    • Ver Perfil
Proyecto retomado 15/02/06 y kernel de prueba
« Respuesta #14 en: Abril 12, 2006, 01:37:27 pm »
Lo que sigue es solo para un pc x86 en modo real.
La tabla de interrupciones es un array de 256*4 bytes situada al inicio de la memoria
contiene una serie de punteros tipo far (offset,segment) al codigo que se ejecutara
en caso de interrupcion.
Hay tres tipos de interrupciones, primero estan las generadas por la cpu
en casos especiales ,por ejemplo para avisar de una division por zero.
El rango de interrupciones 0-1fh esta reservado para la cpu, pero la bios tambien usa estos vectores.
despues creo que en el rango 28h-2fh y 78h-7fh estan las interrupciones generadas por chips externos
a la cpu.
Y por ultimo estan las interrupciones generadas por software con la instrucci?n 'int'.
para instalar una rutina de interrupci?n basta con escribir su direcci?n en la tabla de
interrupciones ejemplo para la int 40h:
mov es,0
push cs
push int_handler
pop dword [es:40h*4]  ;al usar una sola instrucci?n no hace falta desactivar las interrupciones
int 40h  ;ya se puede usar la int.
ret

y la rutina de interrupcion:
int_handler:
pusha
;hacer algo, teniendo en cuenta que los registros ss,ds,es son los de la aplicacion que hace la llamada
;se pueden pasar parametros usando el stack o la que es mas usual ,usando los registros
popa
iret ;equivale a: pop cs ret  popf

No confundir IRQ con INT , la IRQ 1 (teclado) es una interrupci?n hardware que
se corresponde con la INT 29h dependiendo de como se haya
programado el controlador de interrupciones,y las routinas para procesar IRQ deben
enviar un byte al PIC (programable interrupt controler) para indicarle que puede
seguir generando IRQ ejemplo:

irq_handler_del_teclado:
pusha  ;guardar registros
in al,60h  ;leer los datos del teclado
call almacenar_en_bufer_circular
mov al,20h
out  20h,al   ;enviar el ACK al PIC
popa
ret

Y por ultimo al empezar con un sistema operativo es muy inportante tener alguna funcion
que muestre algo en pantalla:

mov al, ?a? ;letra a mostrar
mov ah,0eh  ;servicio de la bios para imprimir un caracter
int 10h

el otro metodo seria escribir directamente en la memoria de video

mov es,0b000h   ;memoria de video en modo texto
mov b[es:0],'a'  ;un byte es la letra y el otro es el color

Hay por internet un sistema operativo sencillo a mas no poder que os podria interesar, creo que
se llamaba Leos o Eduos y luego tambien esta la compo que se hizo el foro de Fasm
sobre sistemas operativos de 512bytes