Saya mencari penjelasan tentang apa yang terjadi di Linux ketika kombinasi tombol ini ditekan untuk mengubah terminal saat ini. Secara khusus, komponen perangkat lunak apa yang memotong kombinasi kunci ini dan mengubah terminal? Apakah itu kernel? Jika itu adalah kernel, dapatkah Anda memberikan lokasi file sumber yang menangani ini?
Sunting: Saya ingin memahami cara kerjanya di lingkungan berbasis grafis (X11) dan teks.
Jawaban:
Itu adalah kernel. Perlu diingat keyboard adalah perangkat keras dan semua yang terjadi di sana melewati kernel; dalam kasus VT switching, ia menangani peristiwa itu sendiri sepenuhnya dan tidak meneruskan apa pun ke userspace (namun, saya percaya ada cara terkait ioctl di mana program userspace dapat diberitahu tentang switch yang terjadi yang melibatkan mereka dan mungkin mempengaruhinya, yang X tidak diragukan lagi).
Kernel memiliki build keymap di dalamnya; ini dapat dimodifikasi saat berjalan dengan
loadkeys
, dan dilihat dengandumpkeys
:Sumber kernel berisi file keymap default yang terlihat persis seperti ini; untuk 3.12.2 itu
src/drivers/tty/vt/defkeymap.map
. Anda juga akan melihat ada file defkeymap.c yang sesuai (ini dapat dibuat denganloadkeys --mktable
). Penanganannya ada dikeyboard.c
(semua file ini berada di direktori yang sama) yang memanggilset_console()
darivt.c
:Saya mengedit beberapa hit dari daftar itu; Anda dapat melihat tanda tangan fungsi pada baris terakhir kedua.
Jadi ini adalah hal-hal yang terlibat dalam peralihan. Jika Anda melihat urutan panggilan, akhirnya Anda kembali ke
kbd_event()
dalamkeyboard.c
. Ini terdaftar sebagai pengendali acara untuk modul:(3.12.2
drivers/tty/vt/keyboard.c
baris 1473)Oleh karena itu,
kbd_event()
harus dipanggil ketika sesuatu muncul dari driver perangkat keras yang sebenarnya (mungkin sesuatu daridrivers/hid/
ataudrivers/input/
). Namun, Anda tidak akan melihatnya disebut dikbd_event
luar file itu, karena terdaftar melalui penunjuk fungsi.Beberapa sumber daya untuk meneliti kernel
printk
baris Anda sendiri ke sumber sebagai cara penelusuran sederhana (tidak semua standar C lib dapat digunakan dalam kode kernel, termasuk printf dari stdio). hal-hal printk berakhir di syslog.Wolfgang Mauerer menulis sebuah buku besar yang hebat tentang kernel 2.6, Arsitektur Linux Kernel Profesional , yang melewati banyak sumber. Greg Kroah-Hartman , salah satu pengembang prinsip untuk dekade terakhir, juga memiliki banyak hal.
sumber
keyboard.c
akan menjadi pengendali acara; "driver keyboard" itu sendiri akan menjadi level yang lebih rendah - ada banyak di antaranyadrivers/input/keyboard/
untuk hal-hal non-usb. Hal-hal usb standar sehingga hanya akan ada satu (mungkin melibatkandrivers/hid/usbhid/usbkbd.c
) Saya menduga bahwa driver keyboard adalah untuk memproduksi scancode yang dapat diserahkan ke vt / keyboard.c (lihat getkeycode () di dekat bagian atas itu).Documentation/input/input.txt
memiliki beberapa petunjuk (sangat kuno, lol).