Ctrl + Alt + F <Num>을 누르면 어떻게됩니까? 채 터미널을 변경합니까? 커널입니까? 커널

이 키 조합을 눌러 현재 터미널을 변경하면 Linux에서 발생하는 일에 대한 설명을 찾고 있습니다. 특히 어떤 소프트웨어 구성 요소가이 키 조합을 가로 채 터미널을 변경합니까? 커널입니까? 커널 인 경우이를 처리하는 소스 파일의 위치를 ​​제공 할 수 있습니까?

편집 : 그래픽 (X11) 및 텍스트 기반 환경에서 이것이 어떻게 작동하는지 이해하고 싶습니다.



답변

커널입니다. 키보드는 하드웨어이며 키보드에서 발생하는 모든 것은 커널을 통과합니다. 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함수 포인터를 통해 등록 되었기 때문에 해당 파일의 외부 로 표시되지 않습니다 .

커널을 조사하기위한 몇 가지 리소스

  • 리눅스 상호 참조 식별자 검색 훌륭한 도구입니다.
  • 대화 리눅스 커널지도 상호 참조 도구 흥미로운 그래픽 프론트 엔드입니다.
  • 대규모 Linux Kernel Mailing List (LKML)의 기록 보관소는 1995 년 이상으로 거슬러 올라갑니다. 그들 중 일부는 유지되지 않고 검색 기능이 손상되었지만 gmane 하나 는 매우 잘 작동하는 것 같습니다. 사람들은 메일 목록에 대해 많은 질문을했으며 개발자들 사이의 주요 커뮤니케이션 수단이기도합니다.
  • printk간단한 추적 수단으로 자체 라인을 소스에 삽입 할 수 있습니다 (stdio의 printf를 포함하여 모든 표준 C lib를 커널 코드에서 사용할 수있는 것은 아닙니다). printk 항목은 syslog로 끝납니다.

Wolfgang Mauerer는 2.6 커널 인 Professional Linux Kernel Architecture 에 대한 큰 책을 썼습니다 . 지난 10 년간의 주요 개발자 중 한 명인 Greg Kroah-Hartman 도 많은 일을하고 있습니다.


답변