함수의 첫줄에 내용을 추가하였습니다.
Reboot 해보니 login화면에서부터 타이핑 자체가 진행이 되지 않았습니다.
이는 원래 interrupt가 발생 후, 키보드 입력과정을 처리한 뒤 IRQ_HANDLED를 리턴하는데, 이과정들을 거치지 않고 바로 IRQ_HANDLED를 리턴하도록 했기 때문에, 어떤 문자를 입력해도 실행이 되지 않는 것입니다.
Login 자체가 불가능하여 다시 타이핑이 가능하게 하려면 linux2로 접속하여 함수를 다시 바꿔주고 리부팅을 해야했습니다.
Printk를 통해 x pressed를 구현했다.
이와 같이 입력하면 x pressed가 출력이되는 것을 확인했습니다.
Code의 값을 하나 증가 시키도록 하여 입력한 키의 오른쪽 버튼이 입력되도록 하였습니다.
다음과 같이 입력됨을 확인하였습니다. Root 를 치려면 eiir]을 입력해야 했습니다. 글자를 지우려고 해도 backspace왼쪽의 +=키를 눌러야했습니다.
Main.c에 “s”를 입력할 때까지 기다리다가 s가 입력되어야 종료하는 mydelay함수를 정의해주었습니다.
정의한 mydelay함수를 do_basic_setup 아래줄에 호출해주었다.
Atkbd.c로 다시돌아가서 atkbd_interrupt함수에서 “s”의 스캔코드값인 31이 들어올 경우 exit_delay를 1로 바꾸어 mydelay를 탈출하는 코드를 추가하였다.
재부팅을 하니 basic setup이 종료되고 boot가 멈추고 s를 입력하니 다시 booting이 시작되었다.
입력한 키의 스캔코드를 출력해주는 함수를 modify했던 부분이다. ATK_KEY_NULL이 아니면 input_event()함수를 실행하므로 입력이 제대로 진행되면 실행되는 함수라는 것을 알 수 있다. 따라서 input_event()가 실질적으로 입력된 키를 모니터에 출력하는 function이라고 판단하였다.
/arch/x86/kernel/trap_64.c의 trap_init함수에서 divide_error를 발견하였다.
ISR1은 interrupt[0] = IRQ00_interrupt ISR2는 irq_desc[0].action-> handler = timer_interrupt으로 예상된다.
'Quality control (Univ. Study) > Operating System' 카테고리의 다른 글
OS (fork) (0) | 2022.11.10 |
---|---|
OS(process id) (1) | 2022.11.05 |
OS(system_call) (0) | 2022.10.11 |
OS(modificating kernel) (0) | 2022.10.07 |
OS (linux, start_kernel) (1) | 2022.10.03 |