답변:
커널입니다. 키보드는 하드웨어이며 키보드에서 발생하는 모든 것은 커널을 통과합니다. VT 스위칭의 경우 이벤트를 완전히 처리하고 사용자 공간으로 아무것도 전달하지 않습니다 (단, 사용자 공간 프로그램에 관련된 스위치에 대해 사용자 공간 프로그램에 통지하여 영향을 미칠 수있는 ioctl 관련 수단이 있다고 생각합니다. X는 의심의 여지가 없습니다.
커널에는 키맵이 내장 되어 있습니다. 로 실행하는 동안 수정할 수 있으며 다음을 사용 loadkeys
하여 볼 수 있습니다 dumpkeys
.
[...]
keycode 59 = F1 F13 Console_13 F25
alt keycode 59 = Console_1
control alt keycode 59 = Console_1
keycode 60 = F2 F14 Console_14 F26
alt keycode 60 = Console_2
control alt keycode 60 = Console_2
keycode 61 = F3 F15 Console_15 F27
alt keycode 61 = Console_3
control alt keycode 61 = Console_3
[...]
커널 소스에는 다음과 같은 기본 키맵 파일이 있습니다. 3.12.2의 경우 src/drivers/tty/vt/defkeymap.map
입니다. 또한 해당 defkeymap.c 파일이 있음을 알 수 있습니다 (이 파일은로 생성 할 수 있음 loadkeys --mktable
). 처리는에 keyboard.c
호출하는 (모든 파일이 같은 디렉토리에있는) set_console()
에서vt.c
:
» grep set_console *.c
keyboard.c: set_console(last_console);
keyboard.c: set_console(i);
keyboard.c: set_console(i);
keyboard.c: set_console(value);
vt.c:int set_console(int nr)
vt_ioctl.c: set_console(arg);
해당 목록에서 일부 조회수를 수정했습니다. 마지막 두 번째 줄에서 함수 서명을 볼 수 있습니다.
이것이 스위칭과 관련된 것입니다. 당신이 전화의 순서를 보면, 결국은 다시 오지 kbd_event()
에서 keyboard.c
. 이것은 모듈의 이벤트 핸들러로 등록됩니다.
(3.12.2 drivers/tty/vt/keyboard.c
행 1473)
MODULE_DEVICE_TABLE(input, kbd_ids);
static struct input_handler kbd_handler = {
.event = kbd_event, <--- function pointer HERE
.match = kbd_match,
.connect = kbd_connect,
.disconnect = kbd_disconnect,
.start = kbd_start,
.name = "kbd",
.id_table = kbd_ids,
};
int __init kbd_init(void)
{
[...]
error = input_register_handler(&kbd_handler);
따라서 kbd_event()
실제 하드웨어 드라이버에서 무언가가 나올 때 (아마도 drivers/hid/
나 에서 나온 것) 호출해야합니다 drivers/input/
. 그러나 kbd_event
함수 포인터를 통해 등록 되었기 때문에 해당 파일의 외부 로 표시되지 않습니다 .
printk
간단한 추적 수단으로 자체 라인을 소스에 삽입 할 수 있습니다 (stdio의 printf를 포함하여 모든 표준 C lib를 커널 코드에서 사용할 수있는 것은 아닙니다). printk 항목은 syslog로 끝납니다.Wolfgang Mauerer는 2.6 커널 인 Professional Linux Kernel Architecture 에 대한 큰 책을 썼습니다 . 지난 10 년간의 주요 개발자 중 한 명인 Greg Kroah-Hartman 도 많은 일을하고 있습니다.
keyboard.c
이벤트 핸들러가 될 것입니다. "키보드 드라이버"자체는 더 낮은 수준 drivers/input/keyboard/
일 것입니다. USB 물건은 표준화되어 있으므로 하나만 (아마도 관련이 있음 drivers/hid/usbhid/usbkbd.c
) 있습니다. 키보드 드라이버는 vt / keyboard.c에 전달할 수 있는 스캔 코드 를 생성하기위한 것 같습니다 (맨 위의 getkeycode () 참조). Documentation/input/input.txt
(놀랍게도 고대의 lol) 힌트가 있습니다.