Article View: es.comp.os.linux.programacion
Article #18786Re: Ensamblador y Linux
From: Oscar Martin Gonzalez
Date: Thu, 22 Jul 1999 00:00
Date: Thu, 22 Jul 1999 00:00
135 lines
7382 bytes
7382 bytes
Como no os veo muy puestos en el tema os voy a dar una buena explicaci�n de
como funciona Linux frente a Win/Dos para que sepas que se puede hacer con
ensamblador bajo Linux.
Hasta hace unos a�os se programaba bajo DOS. Dichos programas evitaban
hacer las tareas m�s complejas y dependientes (lectura de sectores, acceso
a teclado, visualizaci�n en pantalla) haciendo uso de unos servicios
estandarizados que el propio ordenador proporciona (BIOS) que se hace uso
de ellos a traves de llamadas a interrupciones software.
Existe una instrucci�n llamada INT xx que fuerza la ejecucion de la
interrupci�n xx. Esta interrupci�n en Modo Real de los 386 o superiores
funciona exactamente igual que el antiguo 8086. Existe una tabla en la
direcci�n 0 de memoria donde se guardan consecutivamente las direcciones
(en formato segmento+desplazamiento) a donde saltar� a ejecutar la CPU
tras la interrupci�n.
Sin embargo Linux funciona en modo protegido. En dicho modo los antiguos
segmentos que coindidian con la posici�n n� de segmentox16 ya no
funcionan de esa manera. Donde antiguamente se almacenaban los valores del
segmento, ahora se guardan indices (denominados descriptores) a unas tablas
que guardan la posici�n inicial en memoria l�gica (porque a dem�s se
sopota segmentaci�n sobre paginaci�n ), longitud del segmento, nivel de
privilegio, entre otras cosas.
De hecho la propia tabla de vectores de interrupci�n pasa a ser la tabla
de descriptores de interrupci�n cambiando el formato (dejando inservibles
las funciones de la BIOS)
Y a�n as� existen muchas otras diferencias. Conclusi�n. Los programas
en ensamblador para modo real, no funcionan en modo protegido.
Como Intel sab�a que esto romper�a demasiado la compatibilidad (un SO
que funcionase en modo protegido no podr�a hacer funcionar aplicaciones
antiguas), cre� un tercer modo, (que es realmente un submodo del modo
protegido) denominado V86 sobre el cual, los registros de segmentos no contienen
descriptores sino que funcionan de modo similar al modo real. Sin embargo
siguen funcionando el resto de capacidades del modo protegido. De hecho al
ejecutar la instrucci�n INT no estamos ejecutando la interrupci�n que
se indica en la posici�n que se ve en 0 sino lo que diga la IDT (tabla de
descriptores de interrupci�n) que puede estar localizada en cualquier zona
de la memoria. De esta manera se pueden seguir simulando que se est� en
modo real aunque realmente se est� en modo protegido/V86.
Para emular un 8086 bajo modo protegido se requiere ayuda de software pero
el modo V86 facilita dicha emulaci�n para poder realizarse a un costo
aceptable.
Dicho modo es el escogido para correr aplicaciones de DOS bajo Windows. De
hecho , Windows 9x surge de una ampliaci�n de W3.11 donde las aplicaciones
sobre V86 son las m�s importantes...
Bajo V86 es posible correr una aplicaci�n en ensamblador con llamadas
cl�sicas a la BIOS. En Linux, esto se puede hacer con dosemu el cual
crea una tarea V86 bajo Linux y se encarga de emular todas las llamadas a
la BIOS.
Bajo Windows, esta emulaci�n est� integrada de por si con el SO, y
es usado hasta extremos de llamar a los antiguos drivers de DOS sobre V86
en caso de no disponer de drivers programados en modo protegido, a costa
de aplicar m�todos dr�sticos para garantizar el uso del driver
correctamente. Ten en cuenta que en modo real/DOS no se usaba multitarea por
lo que muchas veces los programas se hacian no reentrantes... es decir, no
consideraban la posibilidad de que otro programa les llamase durante su i
ejecuci�n. Sin embargo, con multitarea puede ocurrir. Esto obliga a Windows
a organizar las peticiones del driver y hacerlas una por una (entre otras cosas)
con la consiguiente p�rdida de rendimiento... Es el ineficiente modo
"compatibilidad MSDOS".
Linux fue dise�ado de 0, y no realiza llamadas a modo real/V86 para
realizar sus operaciones. Eso le obliga a hacer todas las operaciones
directamente sin apoyarse en la BIOS.
Bajo Linux todas las aplicaciones (salvo emulaciones) funcionan en modo
protegido nativo. No se molesta en emular ninguna BIOS, (ni falta que le hace)
asi que ejecutar una INT 21, lleva a ejecutar una INT21 de la IDT de linux
que provoca una se�al SIGSEGV (referencia a memoria invalida).
En Linux, existen un conjunto de servicios que proporciona el kernel que
son accesibles a traves de la interrupci�n 0x80
En EAX se guarda el n. de la funci�n del kernel a la que queremos llamar
y en EBX,ECX,EDX... etc guardamos los par�metros de dicha funci�n.
Os proporciono el cl�sico ejemplo de libro:
; saludo.asm
[BITS 32]
GLOBAL _start ;exportamos _start que es el inicio del programa
_start:
mov eax,4 ; 4 -> funci�n sys_write(): corresponde a "man 2 write"
mov ebx,1 ; fd. 0 = stdin | 1 = stdout | 2 = stderr
mov ecx,mensaje ; ecx apunta al buffer de datos.
mov edx,fin_mensaje - mensaje ; longitud del buffer
int 80h ; llamamos a write(1,&mensaje,sizeof(mensaje)
mov eax,1 ; 1 -> funci�n sys_exit()
xor ebx,ebx ; ebx = codigo de error
int 80h
mensaje:
db 'Hola linuxero, desde ensamblador',10
fin_mensaje:
; fin de saludo.asm
Lo podeis compilar con el NASM as�.
nasm -f elf saludo.asm -o saludo.o
ld saludo.o -o saludo
./saludo
Las funciones del kernel las podeis encontrar en arch/i386/kernel/entry.S
(sys_call_table)
relativo al directorio donde descomprimais las fuentes.
Linux, como buen SO que es no permite ejecutar instrucciones privilegiadas desde
una aplicaci�n bajo circunstancias normales. Estas circunstancias pueden
variarse con llamadas especiales al SO que deber�n ejecutarse como
superusuario garantizando que ning�n usuario pueda alterar la estabilidad
del sistema.
Como ves, el equivalente de BIOS en Linux est� muy orientado a C por lo
que usar ensamblador pierde su sentido salvo cuando se quieren hacer cosas
muy concretas... Eso si, por hacer puedes hacer lo que quieras, pero no vas
a conseguir ninguna gran ventaja sobre el C (salvo en cuestiones de espacio
y/o velocidad)
En resumen. Usa C y ensamblador donde la velocidad sea cr�tica.
En tu caso particular, la INT 10h no es usable, as� que olvidate de VESA.
Sin embargo hay equivalentes Linux para manejar la tarjeta (X,DGA,Framebuffer,
svgalib, etc)
Especifica lo que quieres hacer y entonces te propondremos las alternativas
en Linux para hacer esto mismo.
Un saludo.
Technical Details
Message-ID:
<7n6v25$o1u$1@simancas.cpd.uva.es>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<378B1020.92519607@mx2.redestb.es> <slrn7ore5c.7lr.rdiazmar@localhost.localdomain> <378F0BB5.D09D3309@mx2.redestb.es>Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: f86c8,5caf804ab6769869
X-Google-Attributes: gidf86c8,public
From: Oscar Martin Gonzalez <oscar@gui.uva.es>
Subject: Re: Ensamblador y Linux
Date: 1999/07/22
Message-ID: <7n6v25$o1u$1@simancas.cpd.uva.es>
X-Deja-AN: 503946839
Distribution: es
Content-Transfer-Encoding: 8bit
References: <378B1020.92519607@mx2.redestb.es> <slrn7ore5c.7lr.rdiazmar@localhost.localdomain> <378F0BB5.D09D3309@mx2.redestb.es>
Content-Type: text/plain; charset=ISO-8859-1
Organization: GUI
Mime-Version: 1.0
User-Agent: tin/pre-1.4-19990216 ("Styrofoam") (UNIX) (Linux/2.2.10 (i686))
Newsgroups: es.comp.os.linux.programacion