Domanda

Sto lavorando all'input da tastiera per un kernel molto semplice che sto sviluppando e sono completamente bloccato. Non riesco a trovare informazioni online che possano mostrarmi le informazioni che devo conoscere.

Il mio kernel sta funzionando in modalità protetta in questo momento, quindi non posso usare le routine di tastiera in modalità reale senza passare alla modalità reale e viceversa, cosa che sto cercando di evitare. Voglio essere in grado di accedere alla mia tastiera dalla modalità protetta. Qualcuno sa come fare questo? L'unica cosa che ho trovato finora è che implica parlare direttamente con il controller usando le porte in / out, ma oltre a ciò sono sconcertato. Questo, ovviamente, non è qualcosa che si presenta molto spesso. Normalmente, le esercitazioni di Assembly presuppongono che tu stia eseguendo un sistema operativo sotto.

Sono molto nuovo nell'assembly x86, quindi sto solo cercando delle buone risorse per lavorare con l'hardware standard dalla modalità protetta. Sto compilando il codice sorgente di Assembly con NASM e collegandolo al codice sorgente C compilato con DJGPP. Qualche suggerimento?

È stato utile?

Soluzione

La classe dei sistemi operativi MIT ha molti buoni riferimenti. In particolare, controlla risorse di Adam Chapweske sulla programmazione di tastiera e mouse.

In breve, sì, userete le porte raw in / out, che richiedono l'esecuzione in modalità kernel o con i bit di autorizzazione I / O (IOPL) impostati nel registro EFLAGS. Vedi questa pagina per maggiori dettagli sulle autorizzazioni I / O .

Altri suggerimenti

Lavori con hardware legacy standard allo stesso modo su modalità reali e protette. In questo caso, si desidera parlare con l'8042 nelle porte I / O da 0x60 a 0x6f, che a sua volta parlerà con il controller all'interno della tastiera all'altra estremità del filo.

Una rapida ricerca su Google mi ha trovato una risorsa interessante su http: // heim.ifi.uio.no/~stanisls/helppc/8042.html (per l'8042) e http://heim.ifi.uio.no/~stanisls/helppc/keyboard_commands.html (per la tastiera).

Nel caso in cui non ci si sia abituati, si parla con componenti su porte I / O tramite i codici operativi IN (lettura) e OUT (scrittura), che ricevono il numero di porta I / O (un valore a 16 bit) e il valore da leggere o scrivere (8, 16 o 32 bit). Nota che la dimensione letta o scritta è importante! Scrivere 16 bit su qualcosa che si aspetta 8 bit (o viceversa) è una ricetta per il disastro. Abituati a questi codici operativi, dal momento che li userai molto (è l'unico modo per parlare con alcune periferiche, tra cui alcune essenziali; altre periferiche usano I / O (MMIO) mappato in memoria o DMA di masterizzazione del bus).

Il 8042 PS / 2 Controller sembra la possibilità più semplice.

Il tutorial del sistema operativo oszur11 contiene un esempio funzionante in https://sourceforge.net/p/oszur11/code/ci/master/tree/Chapter_06_Shell/04_Makepp/arch/i386/arch/devices/i8042.c

Just:

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

Testato su Ubuntu 14.04 AMD64.

Il mio mirror GitHub (upstream inattivo): https://github.com/cirosantilli/ oszur11-sistema operativo-examples

Non riproducendolo qui perché il codice è troppo lungo, verrà aggiornato se riesco a isolare la parte della tastiera in un esempio minimo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top