커널에서 입력 장치의 입력을 해당 프로세스에게 전달하는 과정을 알려주세요
리눅스 3.14 버전에서 코드 보고 있습니다.
gui환경에서 키보드나 마우스 입력과 같은 장치의 입력 경우, 입력 이벤트를 특정 프로세스에게 전달하는 것은 어떻게 이루어지나요?
키보드에 관한 디바이스 드라이버는 (Linux)/driver/tty/vt/keyboard.c 에서,
마우스에 관한 디바이스 드라이버는 (Linux)/driver/input/mousedev.c 를 살펴보고있는 중이고, input,h 및 input.c, evdev.c도 같이 코드를 보는데...
input_report_key
---> input_event
----->input_handle_event
-------->input_pass_value
---------->input_to_handler
이런식으로 호출이 되고, input_to_handler() 에서 각 디바이스 드라이버의 핸들러에 정의되어 있는 event 함수를 호출한다는 것 까지는 알겠습니다.
근데 keyboard.c의 경우에는 결과적으로 tasklet_schedule()을 거쳐 wakeup_softirq()를 호출하고 이를 통해서 해당 프로세스를 깨우는 것 같고..
mousedev.c의 경우에는 wake_up_interruptible()을 통해 해당 프로세스를 깨우는 것이라 판단됩니다.
더 자세히는, 이렇게 깨우는 과정에서 호출되는 wake_up_interruptible()이나 wakeup_softirq()의 경우, 어떤 이벤트(마우스인지 키보드인지)로 인해 깨워졌는지 알 수 있는 방법은 없을까요?
입력이 발생하고 그로 인해 프로세스가 wakeup하는 경우, 어떤 이벤트로 인해 어느 cpu에서 해당 프로세스를 running하는지에 대해 잘 파악이 안되서..
알려주신다면 대단히 감사하겠습니다 !!!
댓글 달기