2008-10-20 7 views
13

저는 개발중인 매우 기본적인 커널에서 키보드 입력으로 작업 중이며 완전히 멈췄습니다. 나는 내가 알고 있어야하는 정보를 나에게 보여 줄 수있는 온라인 정보를 찾지 못하는 것 같다.Protected Mode 키보드 액세스 (x86 어셈블리에서 사용)

내 커널은 현재 보호 모드에서 실행 중이므로 실제 모드로 돌아 가지 않고 리얼 모드로 되돌아 가지 않고 사용할 수는 없으므로 피하려고합니다. 키보드를 보호 모드에서 액세스 할 수 있어야합니다. 누구든지이 작업을 수행하는 방법을 알고 있습니까? 지금까지 발견 한 유일한 점은 입/출력 포트를 사용하여 컨트롤러에 직접 이야기하는 것이지만, 그 이상으로 나는 혼란 스럽습니다. 물론 이것은 매우 자주 발생하는 것이 아닙니다. 일반적으로 어셈블리 자습서에서는 운영 체제가 실행되고 있다고 가정합니다.

저는 x86 어셈블리가 처음이므로 보호 모드에서 표준 하드웨어로 작업하기위한 좋은 리소스를 찾고 있습니다. NASM으로 어셈블리 소스 코드를 컴파일하고 DJGPP로 컴파일 된 C 소스 코드에 연결합니다. 어떤 제안?

+0

안녕하세요, 이것은 오래된 질문이지만, 솔루션을 사용하여 질문을 편집하거나 내 질문을보십시오 http://stackoverflow.com/questions/22744624/keyboard-interrupt-handler-for- 자신의 커널 - C? 고맙습니다. –

답변

12

MIT operating systems class에는 많은 참조 정보가 있습니다. 특히, 키보드 및 마우스 프로그래밍에 대해서는 Adam Chapweske's resources을 확인하십시오.

간단히 말해 커널 모드에서 실행 중이거나 EFLAGS 레지스터에 IOPL (I/O 권한 비트)이 설정되어있는 원시 입/출력 포트를 사용하게됩니다. I/O 권한에 대한 자세한 내용은 this page을 참조하십시오.

+1

예!나는 그 페이지 덕분에 일할 수있게되었습니다. 너 놀랍다. 내가 할 수 있다면 10 번이나 투표 할거야. 이제는 스캔 코드를 ASCII로 변환해야하지만, 아마도 그렇게 할 수 있습니다. (게다가 화면에 스캔 코드를 출력하면 정말 멋지게 보입니다!) 감사합니다. –

+1

매우 유용합니다! –

+0

MIT 링크 죽은 가능성 업데이트 : http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/ –

3

실제 레거시 하드웨어와 보호 모드에서 동일한 방식으로 작업합니다. 이 경우 8042를 I/O 포트 0x60에서 0x6f로 말하며, 차례로 키보드의 컨트롤러와 통신 할 것입니다.

빠른 Google 검색은 http://heim.ifi.uio.no/~stanisls/helppc/8042.html (8042) 및 http://heim.ifi.uio.no/~stanisls/helppc/keyboard_commands.html (키보드)에서 흥미로운 자료를 찾았습니다.

익숙하지 않은 경우 I/O 포트 번호 (16 비트 값)를 수신하는 IN (읽기) 및 OUT (쓰기) opcode를 통해 I/O 포트의 구성 요소와 대화합니다. 읽기 또는 쓰기 값 (8, 16 또는 32 비트)을 지정합니다. 읽거나 쓰는 크기가 중요하다는 점에 유의하십시오! 8 비트 (또는 그 반대로)를 기대하고있는 것에 16 비트를 쓰는 것은 재앙을위한 처방이다. 이러한 opcode를 많이 사용하게 될 것이기 때문에 (여러 필수적인 것들을 포함하여 일부 주변 장치와 통신하는 유일한 방법이며, 다른 주변 장치는 메모리 매핑 I/O (MMIO) 또는 버스 마스터 링 DMA를 사용합니다).

+0

이 좋은 정보입니다 그러나, 나는 0x6F가 아닌 0x60과 ox64 포트와 대화 할 필요가 있음을 발견했다. 모든 문서는이 방법을 가리키는 것으로 보인다. 아마도 오타일까요? –

+0

포트는 0x60 ~ 0x6f입니다 (모든 x86 Linux 시스템에서/proc/ioports를보십시오). 이 중 0x60 및 0x64가 실제로 사용됩니다. – CesarB

+0

링크 죽은하지만 뒤로 기계를 가지고 https://web.archive.org/web/20150503041658/http://heim.ifi.uio.no/~stanisls/helppc/keyboard_commands.html –

0

8042 PS/2 컨트롤러은 가장 단순한 가능성처럼 보입니다. 우분투 14.04 AMD64에서 테스트

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 

:

oszur11의 OS 튜토리얼 https://sourceforge.net/p/oszur11/code/ci/master/tree/Chapter_06_Shell/04_Makepp/arch/i386/arch/devices/i8042.c 그냥

에서 동작하는 예제가 포함되어 있습니다.

내 GitHub의 거울 (업스트림 비활성) : 나는 최소한의 예에서 키보드 부분을 분리하기 위해 관리하는 경우 코드가 너무 오래 업데이트 때문에 https://github.com/cirosantilli/oszur11-operating-system-examples

여기를 재생할 수 없습니다.