มันเป็นเคอร์เนล โปรดทราบว่าคีย์บอร์ดคือฮาร์ดแวร์และทุกสิ่งที่เกิดขึ้นที่นั่นผ่านเคอร์เนล ในกรณีของการสลับ VT มันจัดการกับเหตุการณ์ได้อย่างสมบูรณ์และไม่ผ่านสิ่งใด ๆ ไปยัง userspace (แต่ฉันเชื่อว่ามี ioctl ที่เกี่ยวข้องกับวิธีการซึ่งโปรแกรม userspace สามารถได้รับการแจ้งเตือนของสวิทช์ที่เกี่ยวข้องกับพวกเขาและอาจส่งผลกระทบต่อ ซึ่ง X ไม่ต้องสงสัยเลย)
เคอร์เนลมีคีย์แมปที่สร้างไว้ สิ่งนี้สามารถแก้ไขได้ในขณะที่ทำงานด้วยloadkeys
และดูด้วยdumpkeys
:
[...]
keycode 59 = F1 F13 Console_13 F25
alt keycode 59 = Console_1
control alt keycode 59 = Console_1
keycode 60 = F2 F14 Console_14 F26
alt keycode 60 = Console_2
control alt keycode 60 = Console_2
keycode 61 = F3 F15 Console_15 F27
alt keycode 61 = Console_3
control alt keycode 61 = Console_3
[...]
เคอร์เนลแหล่งที่มาประกอบด้วยไฟล์ keymap เริ่มต้นซึ่งมีลักษณะเช่นนี้; สำหรับ 3.12.2 src/drivers/tty/vt/defkeymap.map
มัน คุณจะสังเกตเห็นว่ามีไฟล์defkeymap.c ที่เกี่ยวข้อง(ซึ่งสามารถสร้างได้ด้วยloadkeys --mktable
) การจัดการอยู่ในkeyboard.c
(ไฟล์ทั้งหมดเหล่านี้อยู่ในไดเรกทอรีเดียวกัน) ซึ่งเรียกset_console()
จากvt.c
:
» grep set_console *.c
keyboard.c: set_console(last_console);
keyboard.c: set_console(i);
keyboard.c: set_console(i);
keyboard.c: set_console(value);
vt.c:int set_console(int nr)
vt_ioctl.c: set_console(arg);
ฉันแก้ไขความนิยมบางส่วนจากรายการนั้น คุณสามารถเห็นลายเซ็นของฟังก์ชั่นในบรรทัดสุดท้ายที่สอง
ดังนั้นสิ่งเหล่านี้เกี่ยวข้องกับการสับเปลี่ยน ถ้าคุณดูที่ลำดับของการโทรในที่สุดคุณกลับมาในkbd_event()
keyboard.c
นี่ถูกลงทะเบียนเป็นตัวจัดการเหตุการณ์สำหรับโมดูล:
(3.12.2 drivers/tty/vt/keyboard.c
บรรทัด 1473)
MODULE_DEVICE_TABLE(input, kbd_ids);
static struct input_handler kbd_handler = {
.event = kbd_event, <--- function pointer HERE
.match = kbd_match,
.connect = kbd_connect,
.disconnect = kbd_disconnect,
.start = kbd_start,
.name = "kbd",
.id_table = kbd_ids,
};
int __init kbd_init(void)
{
[...]
error = input_register_handler(&kbd_handler);
ดังนั้นkbd_event()
ควรเรียกใช้เมื่อมีบางสิ่งเกิดขึ้นจากไดรเวอร์ฮาร์ดแวร์จริง (อาจเป็นบางสิ่งบางอย่างจากdrivers/hid/
หรือdrivers/input/
) อย่างไรก็ตามคุณจะไม่เห็นมันถูกอ้างถึงว่าkbd_event
อยู่นอกไฟล์นั้นเนื่องจากไฟล์นั้นถูกลงทะเบียนผ่านตัวชี้ฟังก์ชั่น
ทรัพยากรบางอย่างสำหรับกลั่นกรองเคอร์เนล
- การค้นหาตัวระบุการอ้างอิงไขว้ของ Linuxเป็นเครื่องมือที่ยอดเยี่ยม
- อินเตอร์แอคที Linux Kernel แผนที่เป็นปลายด้านหน้าที่น่าสนใจกราฟิกเครื่องมืออ้างอิงข้าม
- มีจดหมายเหตุทางประวัติศาสตร์บางส่วนของ Linux Kernel Mailing List (LKML) ขนาดใหญ่ซึ่งกลับไปอย่างน้อยปี 1995; บางคนไม่ได้รับการบำรุงรักษาและมีฟีเจอร์การค้นหาที่ใช้งานไม่ได้ แต่gmaneนั้นทำงานได้ดีมาก ผู้คนได้ถามคำถามมากมายในรายการจดหมายและเป็นวิธีการสื่อสารหลักระหว่างนักพัฒนาเช่นกัน
- คุณสามารถฉีด
printk
บรรทัดของคุณเองลงในซอร์สเป็นวิธีการติดตามอย่างง่าย (ไม่สามารถใช้ C C มาตรฐานทั้งหมดในเคอร์เนลโค้ดรวมถึง printf จาก stdio) สิ่ง printk สิ้นสุดใน syslog
Wolfgang Mauerer เขียนหนังสือเล่มใหญ่เกี่ยวกับเคอร์เนลProfessional Linux Kernel Architecture 2.6 ซึ่งผ่านแหล่งข้อมูลมากมาย Greg Kroah-Hartmanหนึ่งในผู้พัฒนาหลักการสำหรับทศวรรษที่ผ่านมามีสิ่งต่าง ๆ มากมายที่เตะไปรอบ ๆ