यह कर्नेल है। ध्यान रखें कि कीबोर्ड हार्डवेयर है और वहां होने वाली हर चीज कर्नेल से गुजरती है; वीटी स्विचिंग के मामले में, यह पूरी तरह से ईवेंट को संभालता है और यूजरस्पेस पर कुछ भी पारित नहीं करता है (हालांकि, मेरा मानना है कि एक ioctl संबंधित साधन है जिसके द्वारा यूज़र्सस्पेस प्रोग्राम को स्विच करने के बारे में सूचित किया जा सकता है, जिसमें वे शामिल होते हैं और शायद इसे प्रभावित करते हैं। जो 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
[...]
कर्नेल स्रोत में एक डिफ़ॉल्ट कीमैप फ़ाइल होती है जो बिल्कुल इस तरह दिखती है; 3.12.2 के लिए src/drivers/tty/vt/defkeymap.map
। आप यह भी देखेंगे कि एक समान डीफ़ेकेमैप। सी। फ़ाइल है (यह के साथ उत्पन्न किया जा सकता है 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
उस फ़ाइल के बाहर के रूप में संदर्भित नहीं करेंगे , क्योंकि यह एक फ़ंक्शन पॉइंटर के माध्यम से पंजीकृत है।
कर्नेल की जांच के लिए कुछ संसाधन
- लिनक्स क्रॉस संदर्भ पहचानकर्ता खोजें एक महान उपकरण है।
- इंटरएक्टिव लिनक्स कर्नेल मानचित्र पार संदर्भ उपकरण के लिए एक दिलचस्प चित्रमय सामने अंत है।
- बड़े पैमाने पर लिनक्स कर्नेल मेलिंग लिस्ट (LKML) के कुछ ऐतिहासिक अभिलेखागार हैं, जो कम से कम 1995 तक वापस चला जाता है; उनमें से कुछ को बनाए नहीं रखा गया है और खोज सुविधाओं को तोड़ दिया है, लेकिन गैमन एक बहुत अच्छी तरह से काम करता है। लोगों ने मेल सूची पर बहुत सारे सवाल पूछे हैं और यह डेवलपर्स के बीच संचार का एक प्राथमिक साधन है।
- आप अपनी खुद की
printk
लाइनों को स्रोत में अनुरेखण के एक साधारण साधन के रूप में इंजेक्ट कर सकते हैं (सभी मानक सी लिबास कर्नेल कोड में उपयोग नहीं किए जा सकते हैं, जिसमें stdio से प्रिंट भी शामिल है)। syslog में printk सामान समाप्त होता है।
वोल्फगैंग मौएर ने 2.6 कर्नेल, प्रोफेशनल लिनक्स कर्नेल आर्किटेक्चर पर एक बहुत बड़ी पुस्तक लिखी , जो बहुत सारे स्रोत से गुजरती है। पिछले एक दशक से सिद्धांत देवों में से एक ग्रेग क्रोह-हार्टमैन के पास भी बहुत सारी चीजें हैं।