Linux 커널은 키보드 입력/출력을 어떻게 처리합니까?

Linux 커널은 키보드 입력/출력을 어떻게 처리합니까?

가상 터미널 장치(예: )를 이해하지 못하지만 을 누르면 /dev/tty1"전환"할 수 있다는 것을 알고 있습니다 .tty1ctrl + alt + f1

나는 사용자 정의 키보드 레이아웃을 갖고 있는데 /usr/share/X11/xkb/symbols/usX가 실행 중인 경우에만 "작동"합니다.

가상 터미널과 X는 둘 다 자신만의 방식으로 키보드 입력/출력을 관리하는 것처럼 보이지만 아마도 둘 다 어떤 방식으로든 (Linux) 커널과 인터페이스하며 이는 키보드 하드웨어에 대한 일종의 추상화를 제공해야 합니다.

Linux 커널은 키보드 입력/출력을 어떻게 처리합니까? 모든 스캔코드/키코드/keysims/등의 목록과 함께 Linux가 "키보드"의 전체 아이디어를 관리하는 방법에 대한 전반적인 논리를 볼 수 있는 소스 파일이 있습니까?

(나는 Lubuntu를 실행하고 있습니다.)

답변1

보다키보드 입력과 텍스트 출력은 어떻게 작동합니까?주제에 대한 개요를 확인하세요.

좀 더 자세히 설명하자면, Linux에서는 커널이 하드웨어로부터 스캔 코드를 받아 키코드로 변환합니다. (이 용어는 완전히 표준은 아닙니다. 둘 다에 사용되는 "스캔 코드" 또는 "키 코드"를 찾을 수 있습니다.) 이 변환이 작동하는 방식은 키보드 드라이버에 따라 다릅니다. PS/2 키보드의 경우 다음을 사용하여 구성할 수 있습니다.setkeycodes. USB 키보드의 경우 구성할 수 있습니다.udev를 통해. 또한보십시오아치 위키. 키보드, 마우스 등 모든 사용자 입력 장치는 이벤트 장치를 통해 노출됩니다 /dev/input/event*.

Linux 콘솔에서 키코드는 콘솔 키맵에 따라 이스케이프 시퀀스에 매핑됩니다. 콘솔은 텍스트 터미널이므로 애플리케이션은 자신을 나타내는 인쇄 가능한 문자와 제어 문자 또는 이스케이프 시퀀스를 사용하여 인코딩된 기능 키가 포함된 바이트를 확인합니다. 다음을 사용하여 매핑을 변경할 수 있습니다.loadkeys. 매핑은 키코드+수정자 조합(3개의 수정자: shift, control, alt)에서 키심으로, 그리고 키심에서 문자열(문자 또는 이스케이프 시퀀스)로 두 가지 수준의 간접 참조를 사용합니다. 키심 세트는 고정되어 있으므로 사용자 정의 조합을 정의하려면 , F13, F14… 등 달리 사용되지 않는 기존 키심을 사용해야 합니다.

이러한 번역을 구현하는 소스 코드를 보려면 다음을 참조하세요.키보드 드라이버그리고일반 입력 코드, 그리고udev그리고libudev.

X11(GUI)에는 애플리케이션이 수신하는 키코드를 매핑하는 고유한 방법이 있습니다. X11 애플리케이션은 키심과 수정자를 확인하므로 기능 키를 더 이상 인코딩할 필요가 없습니다. 실제로 X에서 키맵을 정의하는 방법에는 두 가지가 있습니다. 고전적인 방법인 xmodmap과 더 강력하지만 더 복잡한 최신 메커니즘인 XKB입니다.

관련 정보