idt keyboard x86 kernel osdev protected-mode

keyboard - idt - isr osdev



Acceso al teclado en modo protegido en ensamblaje x86 (3)

Estoy trabajando en la entrada del 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.

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 viceversa, 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 muy nuevo en el ensamble x86, así que estoy buscando algunos recursos buenos para trabajar con el hardware estándar desde el modo protegido. Estoy compilando el código fuente de la Asamblea con NASM y vinculándolo al código fuente C compilado con DJGPP. ¿Alguna sugerencia?


La clase de sistemas operativos MIT tiene muchas buenas referencias. En particular, consulte los recursos de Adam Chapweske en la programación de teclado y mouse.

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


Usted 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 los componentes en los 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 para sea ​​leído o escrito (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 varios periféricos, otros periféricos usan E / S mapeadas en memoria (MMIO) o DMA de masterización de bus).


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

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

Sólo:

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 (aguas arriba inactivo): https://github.com/cirosantilli/oszur11-operating-system-examples

No lo reproduzco aquí porque el código es demasiado largo, se actualizará si logro aislar la parte del teclado en un ejemplo mínimo.