2008-10-20 16 views
13

Estoy trabajando en la entrada de teclado para un núcleo muy básico que estoy desarrollando y estoy completamente atascado. Parece que no puedo encontrar ninguna información en línea que pueda mostrarme la información que necesito saber.Acceso al teclado en modo protegido en el ensamblaje x86

Mi núcleo se está ejecutando en modo protegido en este momento, por lo que no puedo usar las rutinas del teclado en modo real sin saltar al modo real y volver, lo cual estoy tratando de evitar. Quiero poder acceder a mi teclado desde el modo protegido. ¿Alguien sabe como hacer esto? Lo único que he encontrado hasta ahora es que implica hablar directamente con el controlador usando puertos de entrada/salida, pero más allá de eso estoy perplejo. Esto es, por supuesto, no es algo que aparece muy a menudo. Normalmente, los tutoriales de ensamblado suponen que está ejecutando un sistema operativo debajo.

Soy nuevo en el ensamblaje x86, así que solo estoy buscando algunos recursos buenos para trabajar con el hardware estándar desde el modo protegido. Estoy compilando el código fuente de ensamblado con NASM y vinculándolo al código fuente C compilado con DJGPP. ¿Alguna sugerencia?

+0

Hola, sé que esta es una vieja pregunta, pero ¿puedes editar tu pregunta con la solución o echar un vistazo a mi pregunta http://stackoverflow.com/questions/22744624/keyboard-interrupt-handler-for- own-kernel-c? Gracias –

Respuesta

12

El MIT operating systems class tiene muchas buenas referencias. En particular, consulte Adam Chapweske's resources en la programación de teclado y mouse.

En resumen, sí, usará los puertos de entrada/salida sin procesar, que requieren ya sea ejecutar en modo kernel o tener los bits de permiso de E/S (IOPL) establecidos en el registro EFLAGS. Consulte this page para obtener más información sobre los permisos de E/S.

+1

¡Yay!Lo hice funcionar gracias a esas páginas. Eres increíble, y te votaría 10 veces si pudiera. Ahora solo necesito convertir los códigos de escaneo a ASCII, pero eso probablemente pueda hacerlo, (¡Y además, tener la salida de los códigos de escaneo a la pantalla se ve muy bien!) ¡Muchas gracias! –

+1

¡Extremadamente útil! –

+0

Enlace de MIT muerto, probablemente actualizado a: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/ –

3

Trabaja con hardware heredado estándar de la misma manera en modos reales y protegidos. En este caso, desea hablar con el 8042 en los puertos de E/S 0x60 a 0x6f, que a su vez le hablará al controlador dentro del teclado en el otro extremo del cable.

Una búsqueda rápida en Google me encontró un recurso interesante en http://heim.ifi.uio.no/~stanisls/helppc/8042.html (para el 8042) y http://heim.ifi.uio.no/~stanisls/helppc/keyboard_commands.html (para el teclado).

En caso de que no esté acostumbrado, habla con componentes en puertos de E/S a través de los códigos de operación IN (leer) y OUT (escritura), que reciben el número de puerto de E/S (un valor de 16 bits) y el valor que debe leerse o escribirse (ya sea 8, 16 o 32 bits). Tenga en cuenta que el tamaño leído o escrito es importante. Escribir 16 bits para algo que está esperando 8 bits (o viceversa) es una receta para el desastre. Acostúmbrate a estos códigos de operación, ya que los usarás mucho (es la única forma de hablar con algunos periféricos, incluidos algunos esenciales, otros periféricos usan E/S mapeadas en memoria (MMIO) o DMA de masterización de bus).

+0

Esta es una buena información Sin embargo, descubrí que necesitaba hablar con los puertos 0x60 y ox64, no con los de 0x6F. Toda la documentación parece apuntar de esta manera también. Tal vez un error tipográfico? –

+0

Son puertos 0x60 _to_ 0x6f (mira/proc/ioports en cualquier máquina Linux x86). De estos, 0x60 y 0x64 se usan realmente. – CesarB

+0

Enlaces muertos, pero la máquina de retorno los tiene: https://web.archive.org/web/20150503041658/http://heim.ifi.uio.no/~stanisls/helppc/keyboard_commands.html –

0

El controlador 8042 PS/2 parece la posibilidad más simple.

El oszur11 OS tutorial contiene un ejemplo de trabajo bajo https://sourceforge.net/p/oszur11/code/ci/master/tree/Chapter_06_Shell/04_Makepp/arch/i386/arch/devices/i8042.c

Justo:

sudo apt-get install build-essential qemu 
sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu 
git clone git://git.code.sf.net/p/oszur11/code oszur11 
cd oszur11/Chapter_06_Shell/04_Makepp 
make qemu 

Probado en Ubuntu 14.04 AMD64.

Mi espejo GitHub (inactivo aguas arriba): https://github.com/cirosantilli/oszur11-operating-system-examples

No reproducir aquí porque el código es demasiado largo, se actualizará si me las arreglo para aislar la parte del teclado en un ejemplo mínimo.

Cuestiones relacionadas