반응형

이전 글에서 배운 키보드 디바이스 드라이버에 대한 내용을 이제 FS64 OS에 통합하여 키보드 디바이스 드라이버와 간단한 셸을 추가합니다.

 


 

→ 키보드 디바이스 드라이버 파일 추가

 

키보드 디바이스 드라이버Keyboard.cKeyboard.h 파일로 구성되며, 02.Kernel64/Source 디렉터리에 위치합니다.

 

아래는 Keyboard.cKeyboard.h 파일의 내용을 나타낸 것입니다.

 

앞에서 설명한 내용 외에 A20 게이트 활성화 코드를 응용하여 프로세서를 리셋(Reset)하는 kReboot() 함수가 추가되었습니다.

 

/02.Kernel64/Source/Keyboard.c와 /02.Kernel64/Source/Keyboard.h

 

키보드 디바이스 드라이버 소스 파일(02.Kernel64/source/Keyboard.c) 1

 

키보드 디바이스 드라이버 소스 파일(02.Kernel64/source/Keyboard.c) 2

 

키보드 디바이스 드라이버 소스 파일(02.Kernel64/source/Keyboard.c) 3

 

키보드 디바이스 드라이버 소스 파일(02.Kernel64/source/Keyboard.c) 4

 

키보드 디바이스 드라이버 소스 파일(02.Kernel64/source/Keyboard.c) 5

 

키보드 디바이스 드라이버 소스 파일(02.Kernel64/source/Keyboard.c) 6

 

키보드 디바이스 드라이버 소스 파일(02.Kernel64/source/Keyboard.c) 7

 

키보드 디바이스 드라이버 소스 파일(02.Kernel64/source/Keyboard.c) 8

 

키보드 디바이스 드라이버 소스 파일(02.Kernel64/source/Keyboard.c) 9

 

키보드 디바이스 드라이버 소스 파일(02.Kernel64/source/Keyboard.c)  10

 

키보드 디바이스 드라이버 소스 파일(02.Kernel64/source/Keyboard.c) 11

 

키보드 디바이스 드라이버 소스 파일(02.Kernel64/source/Keyboard.c) 12
키보드 디바이스 드라이버 소스 파일(02.Kernel64/source/Keyboard.c)  13
키보드 디바이스 드라이버 소스 파일(02.Kernel64/source/Keyboard.c)  14

 


 

(키보드 디바이스 드라이버 헤더 파일(02.Kernel64/Source/Keyboard.h) 1

 

(키보드 디바이스 드라이버 헤더 파일(02.Kernel64/Source/Keyboard.h) 2

 

(키보드 디바이스 드라이버 헤더 파일(02.Kernel64/Source/Keyboard.h) 3

 


 

→ 어셈블리어 유틸리티 파일 추가

 

키보드 디바이스 드라이버에서 사용하는 kInPortByte()kOutPortByte() 함수는 실제로 어셈블리어 명령인 in과 out을 호출하는 어셈블리어 함수이기 때문에 커널 디바이스 드라이버가 정상적으로 링크되려면 어셈블리어 함수가 정의된 오브젝트 파일이 필요합니다.

 

앞으로 진행하면서 어셈블리어 사용을 피할 수 없는 경우가 여러 번 있으므로, 어셈블리어 함수를 위해 AssemblyUtility.asm과 AssemblyUtility.h 파일을 생성하여 어셈블리어 함수를 추가하는 용도로 사용합니다.

 

아래는 AssemblyUtility.asmAssemblyUtility.h 파일의 내용을 나타낸 것입니다.

 

어셈블리어 유틸리티 함수 소스 파일(02.Kernel64/Source/AssemblyUtility.asm)

 

어셈블리어 유틸리티 함수 헤더 파일(02.Kernel64/Source/AssemblyUtility.h)


 

→ C언어 커널 엔트리 포인트 파일 수정

 

마지막으로 C 언어 커널 엔트리 포인트를 수정합니다.

 

새로 추가된 기능을 수행할 수 있도록 키보드 컨트롤러와 키보드를 활성화하고 간단한 셸을 실행하기 위해서 엔트리 포인트의 뒷부분에 키보드 드라이버 함수를 호출하는 코드를 추가하면 됩니다.

 

아래는 수정된 엔트리 포인트 코드입니다.

 

C 언어 커널 엔트리 포인트는 지난 장과 거의 같으므로 수정된 부분 위주로 정리했습니다.

 

IA-32e 모드 커널의 C 언어 엔트리 포인트 소스 코드(02.Kernel64/Source/Main.c) 1

 

IA-32e 모드 커널의 C 언어 엔트리 포인트 소스 코드(02.Kernel64/Source/Main.c) 2

 


 

→ 빌드와 실행

 

이제 FS64 OS를 다시 빌드한 뒤, 새로 생성된 Disk.img 파일을 QEMU나 실제 PC에서 실행하면 아래와 같은 화면이 뜰 것입니다.

 

하지만, QEMU는 키보드 LED를 지원하지 않으므로 LED를 확인하려면 실제 PC에서 테스트해야 합니다.

 

키보드가 정상적으로 활성화된 화면과 키보드를 통해 메시지를 입력한 화면

make clean

make

sudo qemu-system-x86_64 -m 64 -fda ./Disk.img -rtc base=localtime -M pc

 

앞으로 FS64 OS에 기능을 추가하면서 다양한 디바이스 드라이버를 작성합니다.

 

디바이스마다 사용하는 커맨드와 포트 번호가 다르지만, 전체적인 흐름은 키보드 디바이스 드라이버를 만드는 과정과 거의 같습니다.

 

구현한 키보드 디바이스 드라이버는 아직 미완성입니다.

 

키보드에서 값을 읽으려고 프로세서가 계속 키보드 컨트롤러를 확인해야 합니다.

 

아무리 빠르게 키를 입력한다고 해도 프로세서의 입장에서는 수백만 개의 명령어를 실행할 수 있을 만큼 긴 시간입니다.

 

이러한 문제는 멀티태스킹 환경으로 넘어가면 더욱더 심각한 성능 저하를 초래하므로 이에 대한 해결책으로 인터럽트 방식을 사용합니다.

 

인터럽트 방식을 사용하면 프로세서는 키 입력을 기다리지 않아도 되며, 키가 입력되었을 때 즉시 알 수 있기 때문에 효율적으로 처리할 수 있습니다.

 

 

반응형

+ Recent posts