Ctrl + Alt + F를 누르면 어떻게 되나요?억압받고 있나요?

Ctrl + Alt + F를 누르면 어떻게 되나요?억압받고 있나요?

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

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

답변1

이것이 핵심입니다. 키보드는 하드웨어이며 여기서 발생하는 모든 일은 커널을 통과합니다. 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(이 파일들은 모두 같은 디렉토리에 있습니다) callset_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 상호 참조 식별자 검색훌륭한 도구입니다.
  • 이것대화형 Linux 커널 다이어그램상호 참조 도구에 대한 흥미로운 그래픽 프런트 엔드입니다.
  • 적어도 1995년까지 거슬러 올라가는 LKML(Linux Kernel Mailing List)의 광범위한 기록 아카이브가 있으며 그 중 일부는 유지 관리되지 않고 검색 기능이 손상되었습니다.게르만 No.1아주 잘 작동하는 것 같습니다. 개발자들 간의 주요 소통 수단인 메일링 리스트에 사람들이 많은 질문을 합니다.
  • printk간단한 추적 방법으로 자신만의 라인을 소스 코드에 삽입할 수 있습니다 (stdio의 printf를 포함하여 모든 표준 C 라이브러리를 커널 코드에서 사용할 수 있는 것은 아닙니다). printk의 내용은 결국 syslog에 표시됩니다.

Wolfgang Mauerer는 2.6 커널에 관한 훌륭한 책을 썼습니다.전문 Linux 커널 아키텍처, 그것은 많은 소스를 거칩니다. 그렉 크로하트만지난 10년 동안 주요 개발자 중 하나이며 많은 일이 진행되고 있습니다.

관련 정보