/dev/input - 이게 대체 뭐죠?

/dev/input - 이게 대체 뭐죠?

하드웨어가 운영 체제와 어떻게 상호 작용하는지 궁금하여 다음 기사를 찾았습니다.키보드 입력과 텍스트 출력은 어떻게 작동합니까?

/dev/input 디렉토리에서 많은 마법이 일어나는 것 같습니다. 나는 내 운영 체제(Ubuntu 16.10)를 살펴보고 무엇을 찾을 수 있는지 알아보기로 결정했습니다. 이러한 파일은 모두 0바이트로 나열되며, 이 작업을 수행하면 sudo cat mouse0 | hexdump -C다음과 같은 16진수 데이터가 표시됩니다.

00000000  b3 82 8a 58 00 00 00 00  53 74 09 00 00 00 00 00  |...X....St......|
00000010  01 00 1c 00 00 00 00 00  b3 82 8a 58 00 00 00 00  |...........X....|
00000020  53 74 09 00 00 00 00 00  00 00 00 00 00 00 00 00  |St..............|
00000030  b6 82 8a 58 00 00 00 00  06 56 0e 00 00 00 00 00  |...X.....V......|
00000040  01 00 10 00 01 00 00 00  b6 82 8a 58 00 00 00 00  |...........X....|
00000050  06 56 0e 00 00 00 00 00  00 00 00 00 00 00 00 00  |.V..............|

그래서 몇 가지 질문이 있습니다.

  1. 이 파일의 목적은 무엇입니까? 제가 보기엔 이러한 장치 파일은 스캔 코드를 커널에서 X 서버로 전송하는 중개인으로만 사용되는 것 같습니다. 커널에서 X 서버로 직접 보내면 어떨까요?

  2. 왜 그렇게 많은가요? 20개 이상의 별도 이벤트 파일이 있지만 키보드와 마우스는 하나뿐입니다.

답변1

이 질문에 역순으로 답하겠습니다.

  1. 왜 그렇게 많은가요?

이러한 장치는 시스템에 있는 대부분의 입력을 나타냅니다. 에서 관리되지 않는 마이크와 같은 다른 장치도 있습니다 /dev/input. 키보드 1개와 마우스 1개를 합치면 장치가 2개가 된다는 가정과 달리, 가장 단순한 키보드와 마우스라도 여전히 장치는 6개가 됩니다.

왜 6인가? Xorg는 시작 시 테스트 입력 키보드와 테스트 입력 마우스(둘 다 가상)를 생성하기 때문입니다. 또한 실제 키보드와 테스트 키보드를 기본 가상 장치에 통합합니다. 즉, 입력의 다중화를 수행합니다. 테스트 마우스와 실제 마우스에서도 동일한 현상이 발생합니다.

또한 일반적인 컴퓨터(데스크탑 또는 노트북)에는 키보드 외에 전원 버튼, 절전 버튼 등 다른 버튼이 있습니다.

장치에는 eventNXorg가 생성하는 장치와 컴퓨터가 갖는 장치가 있습니다. N의 ID와 유사한 연속 ID 에서 xinput. 예를 들어 내 컴퓨터에는 다음이 있습니다.

[~]# ls -l /dev/input/
total 0
drwxr-xr-x 2 root root     100 Jan 26 16:01 by-id
drwxr-xr-x 2 root root     140 Jan 26 16:01 by-path
crw-rw---- 1 root input 13, 64 Jan 26 16:01 event0
crw-rw---- 1 root input 13, 65 Jan 26 16:01 event1
crw-rw---- 1 root input 13, 74 Jan 26 16:01 event10
crw-rw---- 1 root input 13, 75 Jan 26 16:01 event11
crw-rw---- 1 root input 13, 76 Jan 26 16:01 event12
crw-rw---- 1 root input 13, 77 Jan 26 16:01 event13
crw-rw---- 1 root input 13, 66 Jan 26 16:01 event2
crw-rw---- 1 root input 13, 67 Jan 26 16:01 event3
crw-rw---- 1 root input 13, 68 Jan 26 16:01 event4
crw-rw---- 1 root input 13, 69 Jan 26 16:01 event5
crw-rw---- 1 root input 13, 70 Jan 26 16:01 event6
crw-rw---- 1 root input 13, 71 Jan 26 16:01 event7
crw-rw---- 1 root input 13, 72 Jan 26 16:01 event8
crw-rw---- 1 root input 13, 73 Jan 26 16:01 event9
crw-rw---- 1 root input 13, 63 Jan 26 16:01 mice
crw-rw---- 1 root input 13, 32 Jan 26 16:01 mouse0
crw-rw---- 1 root input 13, 33 Jan 26 16:01 mouse1

그리고 xinput나에게 다음과 같은 ID를 주었습니다.

[~]$ xinput list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Optical Mouse                id=10   [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=14   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ USB 2.0 Camera                            id=11   [slave  keyboard (3)]
    ↳ Asus Laptop extra buttons                 id=12   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=13   [slave  keyboard (3)]

( eventN해당 항목 참조 id=N)

Xorg 없음

1.1 이 문서의 목적은 무엇입니까?

모든 무작위 입력(내 USB 카메라 포함!)은 Xorg에서 가상 키보드의 일부로 처리됩니다. 이는 입력의 다중화 및 역다중화를 허용합니다. 예를 들어 USB 마우스나 트랙패드를 통해 마우스를 움직일 수 있으며 응용 프로그램은 그 차이를 알 필요가 없습니다.

(사실 USB 카메라는 켜고 끌 수 있는 버튼이 있기 때문에 가상 키보드의 일부입니다. 그리고 버튼이기 때문에 키보드 하위 시스템의 일부가 됩니다. 실제 비디오 입력은 에서 처리됩니다 /sys/class/video4linux.)

즉, 응용 프로그램에는 실제로 하나의 키보드와 하나의 마우스만 있습니다. 그러나 Xorg와 커널 모두 이러한 차이점을 알아야 합니다. 마지막 부분으로 이어집니다.

1.2 커널에서 X 서버로 직접 보내면 안되는 이유는 무엇입니까?

Xorg는 차이점을 알아야 하기 때문입니다.

어떤 상황에서는 유용합니다. Xorg의 키를 각 슬레이브 입력 장치에 다르게 다시 매핑할 수 있습니다. 예를 들어, 레이싱 게임에 사용될 때 각 페달에 대한 출력 ab출력을 제공하는 페달이 있는 게임 장비가 있습니다 . c그러나 프로그래밍할 때 키보드 자체의 키를 다시 매핑하지 않고 이 키를 Esc, , 로 다시 매핑합니다.CtrlAlt

또한 시스템이 Xorg를 실행할 필요는 없습니다. 예를 들어 헤드리스 서버에서는 다음과 같은 출력을 얻을 수 있습니다.

[~]$ ls -l /dev/input/
total 0
drwxr-xr-x 2 root root      80 Nov  8 02:36 by-path
crw-rw---- 1 root input 13, 64 Nov  8 02:36 event0
crw-rw---- 1 root input 13, 65 Nov  8 02:36 event1
crw-rw---- 1 root input 13, 66 Nov  8 02:36 event2

입력 장치는 키보드나 마우스가 아닌 직렬 포트(특히 이 경우)에 해당합니다.

답변2

"직접 보내기" 같은 것은 없습니다. 애플리케이션에는 데이터를 읽는 방법이 있어야 합니다. Unix에서는 이는 일반 파일을 읽는 것과 같습니다. 즉, 애플리케이션이 파일을 열고 읽을 수 있도록 일반 파일 IO 시스템 호출과 함께 작동하는 장치 노드를 생성하는 것입니다.

마우스와 키보드 외에도 다른 입력 소스가 있습니다. 각 항목을 살펴보면 무엇인지 알 수 있습니다 /sys/class/input. 여기에서 동일한 inputNN 이름으로 파일을 구체화합니다. 이는 해당 파일이 나타내는 장치를 설명하는 sysfs의 다른 노드에 대한 심볼릭 링크입니다. 다른 일반적인 소스로는 사운드 카드(플러그를 꽂거나 뺄 때 신호를 보내는)와 컴퓨터의 물리적 전원 버튼이 있습니다.

관련 정보