/ dev / input - Chính xác thì đây là gì?


12

Tôi tò mò về cách phần cứng tương tác với HĐH và tình cờ thấy bài này: Làm thế nào để nhập liệu bàn phím và đầu ra văn bản hoạt động?

Có vẻ như rất nhiều phép thuật xảy ra trong thư mục / dev / input. Tôi quyết định xem trên hệ điều hành của riêng tôi (Ubuntu 16.10) để xem những gì tôi có thể tìm ra. Tất cả các tệp này được liệt kê là 0 byte và khi sudo cat mouse0 | hexdump -Ctôi nhận được một tấn hexdata trông như thế này:

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..............|

Vì vậy, tôi có một vài câu hỏi:

  1. Mục đích của tập tin này là gì? Dường như với tôi rằng các tệp thiết bị này chỉ được sử dụng như người trung gian để chuyển scancode từ kernel sang máy chủ X. Tại sao không gửi nó trực tiếp từ kernel đến máy chủ X?

  2. Tại sao có nhiều như vậy? Tôi có hơn 20 tệp sự kiện riêng lẻ, nhưng chỉ có một bàn phím và chuột.

Câu trả lời:


17

Tôi sẽ đi với câu hỏi theo thứ tự ngược lại:

  1. Tại sao có nhiều như vậy?

Đó là những thiết bị đại diện cho hầu hết các đầu vào có trên máy (có những thiết bị khác, ví dụ như micrô sẽ không được quản lý /dev/input). Trái ngược với giả định rằng một bàn phím cộng với một con chuột sẽ cho 2 thiết bị, ngay cả bàn phím đơn giản nhất và chuột đơn giản nhất vẫn sẽ cung cấp cho 6 người trong số họ.

Tại sao 6? Bởi vì Xorg sẽ tạo ra một bàn phím đầu vào thử nghiệm và một con chuột đầu vào thử nghiệm (cả ảo) trong quá trình khởi động. Ngoài ra, nó sẽ tổng hợp bàn phím thử nghiệm với bàn phím thực tế thành một thiết bị ảo chính. tức là nó sẽ thực hiện muxing của đầu vào. Điều tương tự sẽ xảy ra với thử nghiệm và chuột thực tế.

Cộng với một máy tính thông thường (máy tính để bàn hoặc máy tính xách tay) có các nút khác ngoài bàn phím: nút nguồn, nút ngủ.

Các eventNthiết bị trong đó có các thiết bị cho những thứ mà Xorg tạo ra và cho những gì máy tính có. Xuất Nphát từ ID tuần tự và tương tự như ID trong xinput. Ví dụ trên máy của tôi, tôi có:

[~]# 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

xinputcung cấp cho tôi ID tương tự:

[~]$ 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)]

(Nhìn eventNtương ứng với id=N)

Không có Xorg

1.1 Mục đích của tập tin này là gì?

Lưu ý rằng tất cả các đầu vào ngẫu nhiên (bao gồm cả camera USB của tôi!) Được Xorg xem như một phần của bàn phím ảo. Điều này cho phép muxing và demuxing đầu vào. Ví dụ: tôi có thể di chuyển chuột qua chuột USB hoặc qua bàn di chuột của mình và một ứng dụng không cần biết sự khác biệt.

(Thực tế là camera USB là một phần của bàn phím ảo là do nó có nút bật và tắt. Và vì nó là nút nên nó trở thành một phần của hệ thống con bàn phím. Đầu vào video thực tế được xử lý /sys/class/video4linux. )

Nói cách khác, đối với một ứng dụng thực sự chỉ có một bàn phím và chỉ có một con chuột. Nhưng cả Xorg và kernel đều cần biết sự khác biệt. Và điều này dẫn đến phần cuối cùng:

1.2 Tại sao không gửi nó trực tiếp từ kernel đến máy chủ X?

Bởi vì Xorg cần biết sự khác biệt.

Và có những tình huống trong đó nó hữu ích. Bạn có thể sắp xếp lại các phím trong Xorg cho mỗi thiết bị nhập nô lệ khác nhau. Ví dụ, tôi có một bộ chơi game với bàn đạp, khi được sử dụng trong một trò chơi đua xe nó ra a, bccho mỗi bàn đạp của nó. Tuy nhiên, khi lập trình tôi remap các phím để Esc, CtrlAlt, không Remapping các phím trên bàn phím riêng của mình.

Ngoài ra, không cần thiết phải chạy máy Xorg. Ví dụ: trên máy chủ không đầu tôi có thể nhận đầu ra sau:

[~]$ 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

Trong đó các thiết bị đầu vào tương ứng với các cổng nối tiếp (đáng chú ý là trong trường hợp này chúng làm) thay vì bàn phím hoặc chuột.


3
Máy ảnh tự hỗ trợ (như trong, truy xuất video) không đi qua hệ thống con đầu vào, mà thông qua V4L2. Máy ảnh là thiết bị nhập bàn phím vì đôi khi chúng có nút và chúng hoạt động như phím ...
Stephen Kitt

@StephenKitt - Wow, vâng. Tôi chưa bao giờ can thiệp với hệ thống con camera nhưng bây giờ tôi có thể thấy / sys / class / video4linux. Có một số giao diện thú vị ở đó. Cảm ơn bạn về thông tin! (Tôi đã cập nhật asnwer và loại bỏ phần gây hiểu lầm).
hóa dầu

Xorg không tạo tập tin thiết bị: nó không phải là trình điều khiển. Nó thay vào đó mở chúng và thực hiện IO thông qua chúng. Nó thực sự trở nên rõ ràng khi bạn khởi động máy mà không có X và vẫn thấy các thiết bị này (và có thể chạy, ví dụ gpm).
Ruslan

@Ruslan tại sao tôi cần trình điều khiển để tạo tệp thiết bị? Tôi có thể tạo một thiết bị khối bằng cách sử dụng một vòng lặp chẳng hạn. Các thiết bị vẫn sẽ ở đó mà không có X nhưng các tệp thiết bị thực tế (trên các hạt nhân hiện đại) sẽ không có. X sẽ sử dụng udev ổn, nhưng quy tắc udev cho chuột chẳng hạn sẽ không được thực thi nếu khởi động mà không có X.
grochmal

Tôi vừa mới chạy Ubuntu 18.04 Live mà không khởi chạy X. Tôi vẫn có thể xem những tập tin này. Một lần nữa: chuột có thể hoạt động mà không cần X, xem ví dụ: gpmdaemon hoặc GTK2 trên bộ đệm khung.
Ruslan

2

Không có thứ gọi là "gửi trực tiếp". Các ứng dụng phải có một số phương pháp đọc dữ liệu và trong unix được thực hiện giống như cách chúng đọc các tệp thông thường bằng cách tạo một nút thiết bị hoạt động với các cuộc gọi hệ thống IO thông thường để cho phép các ứng dụng mở và đọc chúng.

Có những nguồn đầu vào khác ngoài chuột và bàn phím. Bạn có thể tìm hiểu những gì mỗi người bằng cách nhìn vào /sys/class/input. Ở đó, bạn sẽ xử lý các tệp có cùng tên đầu vào đó là các liên kết tượng trưng đến một nút khác trong các sysfs mô tả thiết bị mà chúng đại diện. Các nguồn phổ biến khác bao gồm thẻ âm thanh (báo hiệu khi mọi thứ được cắm và rút phích cắm) và nút nguồn vật lý trên máy tính.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.