Pergunta

Eu estou trabalhando em entrada de teclado para um kernel muito básico que estou desenvolvendo e estou completamente preso. Eu não consigo encontrar qualquer informação on-line que pode me mostrar as informações que preciso saber.

O meu kernel é executado em modo protegido agora, então eu não posso usar as rotinas de teclado modo real, sem saltar para o modo real e volta, que eu estou tentando evitar. Eu quero ser capaz de acessar meu teclado de modo protegido. Alguém sabe como fazer isso? A única coisa que eu encontrei até agora é que ele envolve a falar com o controlador diretamente utilizando in / out portos, mas além disso eu estou perplexo. Este é, naturalmente, não é algo que surge com muita frequência. Normalmente, tutoriais Assembléia assumir que você está executando um sistema operacional por baixo.

Eu sou muito novo para o x86 montagem, por isso estou apenas à procura de alguns bons recursos para trabalhar com o hardware padrão do modo protegido. Estou compilando o código fonte Assembléia com NASM e vinculá-lo ao código-fonte C compilado com DJGPP. Alguma sugestão?

Foi útil?

Solução

O MIT sistemas operacionais classe tem muitas boas referências. Em particular, veja recursos de Adão Chapweske no teclado e mouse de programação.

Em suma, sim, você estará usando o em matéria-/ out portos, o que requer ou em execução no modo kernel, ou ter o conjunto de E / S bits de permissão (IOPL) nos EFLAGS registo. Consulte este página para obter mais detalhes sobre as permissões de I / O .

Outras dicas

Você trabalha com hardware legado padrão da mesma maneira em modos reais e protegidos. Neste caso, você quer falar com o 8042 nos portos de E / S 0x60 para 0x6F, que por sua vez vai falar com o controlador dentro do teclado na outra extremidade do fio.

Uma rápida pesquisa no Google me encontrou um recurso interessante em http: // heim.ifi.uio.no/~stanisls/helppc/8042.html (para o 8042) e http://heim.ifi.uio.no/~stanisls/helppc/keyboard_commands.html (para o teclado).

No caso de você não está acostumado a isso, você fala com componentes de I / portos O através da IN (leitura) e OUT opcodes (escrever), que receberá o número de I / O port (um valor de 16-bit) e o valor a ser lido ou escrito (seja 8, 16, ou 32 bits). Note-se que o tamanho lido ou escrito é importante! Escrevendo 16 bits para algo que está esperando 8 bits (ou vice-versa) é uma receita para o desastre. Acostume-se a esses opcodes, já que você estará usando-los muito (é a única maneira de falar com alguns periféricos, incluindo vários os essenciais; outros periféricos usar mapeamento de memória I / O (MMIO) ou-bus dominar DMA).

O 8042 PS / 2 Controlador parece que a possibilidade mais simples.

O tutorial oszur11 OS contém um exemplo de trabalho em https://sourceforge.net/p/oszur11/code/ci/master/tree/Chapter_06_Shell/04_Makepp/arch/i386/arch/devices/i8042.c

Apenas:

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

Testado em Ubuntu 14.04 AMD64.

O meu GitHub espelho (inativo upstream): https://github.com/cirosantilli/ oszur11-operacional do sistema-exemplos

Não reproduzi-lo aqui, porque o código-lo por muito tempo, irá atualizar se eu conseguir isolar a parte do teclado em um exemplo mínimo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top