Bagaimana cara kerja input keyboard dan output teks?

85

Misalkan saya menekan Atombol dalam editor teks dan ini memasukkan karakter adalam dokumen dan menampilkannya di layar. Saya tahu aplikasi editor tidak berkomunikasi secara langsung dengan perangkat keras (ada kernel dan hal-hal di antaranya), jadi apa yang terjadi di dalam komputer saya?

Gilles
sumber

Jawaban:

100

Ada beberapa skenario berbeda; Saya akan menjelaskan yang paling umum. Peristiwa makroskopis berturut-turut adalah:

  1. Input: acara tekan tombol ditransmisikan dari perangkat keras keyboard ke aplikasi.
  2. Memproses: aplikasi memutuskan bahwa karena tombol Aditekan, itu harus menampilkan karakter a.
  3. Output: aplikasi memberi perintah untuk ditampilkan adi layar.

Aplikasi GUI

Antarmuka pengguna grafis standar de facto sistem unix adalah X Window System , sering disebut X11 karena stabil dalam versi 11 protokol intinya antara aplikasi dan server tampilan. Suatu program yang disebut server X berada di antara kernel sistem operasi dan aplikasi; ini menyediakan layanan termasuk menampilkan jendela pada layar dan mengirimkan penekanan tombol ke jendela yang memiliki fokus.

Memasukkan

+----------+              +-------------+         +-----+
| keyboard |------------->| motherboard |-------->| CPU |
+----------+              +-------------+         +-----+
             USB, PS/2, …                 PCI, …
             key down/up

Pertama, informasi tentang penekanan tombol dan pelepasan tombol dikirimkan dari keyboard ke komputer dan di dalam komputer. Rinciannya tergantung pada jenis perangkat keras. Saya tidak akan membahas bagian ini lebih lanjut karena informasinya tetap sama sepanjang bagian rantai ini: tombol tertentu ditekan atau dilepaskan.

         +--------+        +----------+          +-------------+
-------->| kernel |------->| X server |--------->| application |
         +--------+        +----------+          +-------------+
interrupt          scancode             keysym
                   =keycode            +modifiers

Ketika peristiwa perangkat keras terjadi, CPU memicu interupsi , yang menyebabkan beberapa kode di kernel dieksekusi. Kode ini mendeteksi bahwa peristiwa perangkat keras adalah penekanan tombol atau pelepasan kunci yang berasal dari keyboard dan merekam kode pindai yang mengidentifikasi kunci.

Server X membaca peristiwa input melalui file perangkat , misalnya /dev/input/eventNNNdi Linux (di mana NNN adalah nomor). Setiap kali ada peristiwa, kernel memberi sinyal bahwa ada data untuk dibaca dari perangkat itu. File perangkat mentransmisikan peristiwa kunci naik / turun dengan kode pindai, yang mungkin atau mungkin tidak identik dengan nilai yang ditransmisikan oleh perangkat keras (kernel dapat menerjemahkan kode pindaian dari nilai yang bergantung pada keyboard ke nilai umum, dan Linux tidak dapat mengirim ulang kode pindaian yang tidak diketahui ).

X menyebut kode pindai yang dibaca kode kunci . Server X memelihara tabel yang menerjemahkan kode kunci ke dalam keysyms (kependekan dari "simbol kunci"). Keycodes adalah numerik, sedangkan Keysyms adalah nama-nama seperti A, aacute, F1, KP_Add, Control_L, ... Keysym mungkin berbeda tergantung pada tombol pengubah ditekan ( Shift, Ctrl, ...).

Ada dua mekanisme untuk mengkonfigurasi pemetaan dari kode kunci ke kode kunci:

  • xmodmap adalah mekanisme tradisional. Ini adalah tabel sederhana pemetaan kode kunci ke daftar keyyms (tidak dimodifikasi, digeser, ...).
  • XKB adalah mekanisme yang lebih kuat, tetapi lebih kompleks dengan dukungan yang lebih baik untuk lebih banyak pengubah, khususnya untuk konfigurasi dua bahasa, antara lain.

Aplikasi terhubung ke server X dan menerima pemberitahuan ketika tombol ditekan saat jendela aplikasi itu memiliki fokus. Pemberitahuan menunjukkan bahwa tombol tertentu ditekan atau dilepaskan serta pengubah apa yang saat ini ditekan. Anda dapat melihat kunci lagu dengan menjalankan program xevdari terminal. Apa yang dilakukan aplikasi dengan informasi itu terserah padanya; beberapa aplikasi memiliki ikatan kunci yang dapat dikonfigurasi.

Dalam konfigurasi tipikal, ketika Anda menekan tombol berlabel Atanpa pengubah, ini mengirim kunci ake aplikasi; jika aplikasi berada dalam mode di mana Anda mengetik teks, ini memasukkan karakter a.

Hubungan tata letak keyboard dan xmodmap lebih detail pada input keyboard. Bagaimana cara kerja acara mouse di linux? memberikan gambaran tentang input mouse di tingkat bawah.

Keluaran

+-------------+        +----------+          +-----+         +---------+
| application |------->| X server |---····-->| GPU |-------->| monitor |
+-------------+        +----------+          +-----+         +---------+
               text or              varies          VGA, DVI,
               image                                HDMI, …

Ada dua cara untuk menampilkan karakter.

Lihat Apa tujuan dari berbagai jenis font XWindows? untuk diskusi rendering teks sisi klien dan sisi server di bawah X11.

Apa yang terjadi antara server X dan Unit Pemrosesan Grafik (prosesor pada kartu video) sangat bergantung pada perangkat keras. Sistem sederhana memiliki server X menggambar di wilayah memori yang disebut framebuffer , yang dipilih GPU untuk ditampilkan. Sistem canggih seperti yang ditemukan pada PC atau ponsel cerdas abad ke-21 memungkinkan GPU untuk melakukan beberapa operasi secara langsung untuk kinerja yang lebih baik. Pada akhirnya, GPU mentransmisikan piksel konten layar demi piksel setiap fraksi detik ke monitor.

Aplikasi mode teks, berjalan di terminal

Jika editor teks Anda adalah aplikasi mode teks yang berjalan di terminal, maka itu adalah terminal yang merupakan aplikasi untuk keperluan bagian di atas. Di bagian ini, saya menjelaskan antarmuka antara aplikasi mode teks dan terminal. Pertama saya menjelaskan kasus emulator terminal yang berjalan di bawah X11. Apa perbedaan yang tepat antara 'terminal', 'shell', 'tty' dan 'konsol'? semoga bermanfaat latar belakang di sini. Setelah membaca ini, Anda mungkin ingin membaca yang jauh lebih terperinci. Apa tanggung jawab masing-masing komponen Pseudo-Terminal (PTY) (perangkat lunak, sisi master, sisi budak)?

Memasukkan

      +-------------------+               +-------------+
----->| terminal emulator |-------------->| application |
      +-------------------+               +-------------+
keysym                     character or
                           escape sequence

Emulator terminal menerima peristiwa seperti " Leftditekan saat Shiftdimatikan". Antarmuka antara emulator terminal dan aplikasi mode teks adalah pseudo-terminal (pty) , perangkat karakter yang mentransmisikan byte. Ketika emulator terminal menerima peristiwa tekan tombol, itu mengubah ini menjadi satu atau lebih byte yang dapat dibaca aplikasi dari perangkat pty.

Karakter yang dapat dicetak di luar rentang ASCII ditransmisikan sebagai satu atau lebih byte tergantung pada karakter dan pengkodean . Misalnya, dalam pengkodean UTF-8 dari rangkaian karakter Unicode , karakter dalam rentang ASCII dikodekan sebagai satu byte tunggal, sementara karakter di luar rentang itu dikodekan sebagai beberapa byte.

Penekanan tombol yang terkait dengan tombol fungsi atau karakter yang dapat dicetak dengan pengubah seperti Ctrlatau Altdikirim sebagai urutan pelarian . Escape sequence biasanya terdiri dari escape karakter (nilai byte 27 = 0x1B = \033, kadang-kadang direpresentasikan sebagai ^[atau \e) diikuti oleh satu atau lebih karakter yang dapat dicetak. Beberapa kunci atau kombinasi tombol memiliki karakter kontrol yang sesuai dengan mereka dalam pengkodean berbasis ASCII (yang hampir semuanya digunakan saat ini, termasuk Unicode): Ctrl+ lettermenghasilkan nilai karakter dalam kisaran 1–26, Escadalah karakter pelarian terlihat di atas dan juga sama dengan Ctrl+ [, Tabsama dengan Ctrl+ I,Returnsama dengan Ctrl+ M, dll.

Terminal yang berbeda mengirimkan urutan pelarian yang berbeda untuk kunci yang diberikan atau kombinasi tombol. Untungnya, kebalikannya tidak benar: diberikan urutan, dalam praktiknya paling banyak satu kombinasi kunci yang dikodekan. Satu-satunya pengecualian adalah karakter 127 = 0x7f = \0177yang sering Backspacetetapi kadang-kadang Delete.

Di terminal, jika Anda mengetik Ctrl+ Vdiikuti dengan kombinasi tombol, ini memasukkan byte pertama dari urutan escape dari kombinasi tombol secara harfiah. Karena urutan pelarian biasanya hanya terdiri dari karakter yang dapat dicetak setelah yang pertama, ini menyisipkan seluruh urutan pelarian secara harfiah. Lihat tabel ikatan utama? untuk diskusi tentang zsh dalam konteks ini.

Terminal dapat mentransmisikan urutan escape yang sama untuk beberapa kombinasi pengubah (mis. Banyak terminal mentransmisikan karakter spasi untuk keduanya Spacedan Shift+ Space; xterm memiliki mode untuk membedakan kombinasi pengubah tetapi terminal yang berdasarkan pada perpustakaan vte populer tidak ). Beberapa kunci tidak ditransmisikan sama sekali, misalnya kunci pengubah atau kunci yang memicu pengikatan terminal emulator (mis. Perintah salin atau tempel).

Terserah aplikasi untuk menerjemahkan urutan melarikan diri menjadi nama kunci simbolis jika diinginkan.

Keluaran

+-------------+               +-------------------+
| application |-------------->| terminal emulator |--->
+-------------+               +-------------------+
               character or
               escape sequence

Output lebih sederhana daripada input. Jika aplikasi mengeluarkan karakter ke file perangkat pty, emulator terminal akan menampilkannya pada posisi kursor saat ini. (Emulator terminal mempertahankan posisi kursor, dan menggulir jika kursor akan jatuh di bawah bagian bawah layar.) Aplikasi juga dapat menampilkan urutan pelarian (kebanyakan dimulai dengan ^[atau ^]) untuk memberi tahu terminal untuk melakukan tindakan seperti memindahkan kursor, mengubah atribut teks (warna, cetak tebal, ...), atau menghapus bagian layar.

Urutan melarikan diri yang didukung oleh emulator terminal dijelaskan dalam termcap atau database terminfo . Sebagian besar terminal emulator saat ini cukup selaras dengan xterm . Lihat Dokumentasi tentang variabel LESS_TERMCAP_ *? untuk diskusi yang lebih lama tentang basis data informasi kemampuan terminal, dan Bagaimana cara menghentikan kursor agar tidak berkedip dan Dapatkah saya mengatur warna terminal mesin lokal saya untuk menggunakan warna-warna dari mesin tempat saya ssh? untuk beberapa contoh penggunaan.

Aplikasi berjalan di konsol teks

Jika aplikasi berjalan langsung di konsol teks, yaitu terminal yang disediakan oleh kernel daripada oleh aplikasi emulator terminal, prinsip yang sama berlaku. Antarmuka antara terminal dan aplikasi masih berupa byte stream yang mentransmisikan karakter, dengan kunci dan perintah khusus yang disandikan sebagai escape sequence.

Aplikasi jarak jauh, diakses melalui jaringan

Aplikasi teks jarak jauh

Jika Anda menjalankan program pada mesin jarak jauh, mis. Melalui SSH , maka protokol komunikasi jaringan menyampaikan data pada level pty.

+-------------+           +------+           +-----+           +----------+
| application |<--------->| sshd |<--------->| ssh |<--------->| terminal |
+-------------+           +------+           +-----+           +----------+
               byte stream        byte stream       byte stream
               (char/seq)         over TCP/…        (char/seq)

Ini sebagian besar transparan, kecuali bahwa kadang-kadang database terminal jarak jauh mungkin tidak mengetahui semua kemampuan terminal lokal.

Aplikasi X11 jarak jauh

Protokol komunikasi antara aplikasi dan server itu sendiri merupakan byte stream yang dapat dikirim melalui protokol jaringan seperti SSH.

+-------------+            +------+        +-----+            +----------+
| application |<---------->| sshd |<------>| ssh |<---------->| X server |
+-------------+            +------+        +-----+            +----------+
               X11 protocol        X11 over       X11 protocol
                                   TCP/…

Ini sebagian besar transparan, kecuali bahwa beberapa fitur akselerasi seperti decoding film dan rendering 3D yang memerlukan komunikasi langsung antara aplikasi dan tampilan tidak tersedia.

Gilles
sumber
Tidak sepenuhnya yakin, tetapi karena jawabannya umumnya agak terperinci, saya ingin tahu apakah bagian yang mengatakan "Aplikasi berjalan di konsol teks" mungkin tidak menampilkan bahwa ada hal-hal seperti man 5 keymapsdigunakan untuk menerjemahkan keycodeske scancodes. Meskipun seperti yang disebutkan pada prinsipnya serupa namun merupakan seperangkat alat / program yang berbeda dan ini mungkin perlu wawasan lebih lanjut. Di samping itu jawabannya adalah +1 dan hebat karena pertanyaan terkait yang tertanam.
humanityANDpeace
Saya menemukan PgUpdan Ctrl+PgUptidak bisa dibedakan dalam tty1 (TERM = linux). Bisakah keysym -> control sequence mapping dikonfigurasikan?
stewbasic
@stewbasic Ya, dengan keymap dimuat oleh loadkeys. Cari pertanyaan yang ditandai dengan tata letak keyboard konsol linux .
Gilles
@Gilles terima kasih! Perlu dicatat bahwa loadkey mengubah kedua pemetaan kode kunci -> keysym dan keysym -> escape sequence (ini awalnya tidak jelas bagi saya).
stewbasic
1
Wow, ini harus menjadi salah satu jawaban terbaik yang pernah saya lihat di Stackexchange - terorganisir dengan baik, menjawab pertanyaan, memberikan konteks yang relevan, referensi silang jawaban berguna lainnya, dan bahkan memiliki seni ASCII yang bagus!
Johntron
4

Jika Anda ingin melihat ini dalam sistem Unix yang cukup kecil untuk dapat dimengerti, gali Xv6 . Ini kurang lebih adalah mitos Edisi ke-6 Unix yang menjadi dasar komentar terkenal John Lion , yang lama beredar sebagai samizdat. Kodenya dikerjakan ulang untuk dikompilasi di bawah ANSI C dan mempertimbangkan perkembangan modern, seperti multiprosesor, ke dalam akun.

vonbrand
sumber