क्या होता है जब Ctrl + Alt + F <Num> दबाया जाता है?


38

मैं लिनक्स में क्या होता है, जब इस कुंजी संयोजन को वर्तमान टर्मिनल को बदलने के लिए दबाया जाता है, तो इसका स्पष्टीकरण खोज रहा हूं। विशेष रूप से, कौन सा सॉफ्टवेयर घटक इस प्रमुख संयोजन को स्वीकार करता है और टर्मिनल को बदलता है? क्या यह कर्नेल है? यदि यह कर्नेल है, तो क्या आप स्रोत फ़ाइल का स्थान प्रदान कर सकते हैं जो इसे संभालती है?

संपादित करें: मैं यह समझना चाहता हूं कि यह आलेखीय (X11) और पाठ-आधारित वातावरण दोनों में कैसे काम करता है।


1
स्पष्ट करने के लिए, क्या आप इन कुंजियों को X11 (यानी ग्राफिकल सेशन) में या टेक्स्ट कंसोल पर दबा रहे हैं? उत्तर अलग है।
22

जवाबों:


36

यह कर्नेल है। ध्यान रखें कि कीबोर्ड हार्डवेयर है और वहां होने वाली हर चीज कर्नेल से गुजरती है; वीटी स्विचिंग के मामले में, यह पूरी तरह से ईवेंट को संभालता है और यूजरस्पेस पर कुछ भी पारित नहीं करता है (हालांकि, मेरा मानना ​​है कि एक 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 कर्नेल, प्रोफेशनल लिनक्स कर्नेल आर्किटेक्चर पर एक बहुत बड़ी पुस्तक लिखी , जो बहुत सारे स्रोत से गुजरती है। पिछले एक दशक से सिद्धांत देवों में से एक ग्रेग क्रोह-हार्टमैन के पास भी बहुत सारी चीजें हैं।


1
धन्यवाद, यह वही है जिसकी मुझे तलाश थी। क्या आप इस बारे में विस्तार से बता सकते हैं कि श्रृंखला में पहले क्या होता है? जब हम Ctrl + Alt + F1 दबाते हैं, तो कीबोर्ड.c में कोड को कैसे कहा जाता है? keyboard.c वास्तविक "कीबोर्ड ड्राइवर" नहीं है, क्या यह है?
user31765

1
नहीं, मुझे ऐसा नहीं लगता। यह टैटी ड्राइवर का सभी हिस्सा है, जिसके keyboard.cलिए एक इवेंट हैंडलर होगा; "कीबोर्ड ड्राइवर" अपने आप निम्न स्तर का होगा - drivers/input/keyboard/गैर-यूएसबी सामान के लिए उनमें से गुच्छे होते हैं । Usb सामान को मानकीकृत किया गया है ताकि केवल एक (संभवतः शामिल drivers/hid/usbhid/usbkbd.c) हो। मेरा अनुमान है कि यह है कि कुंजीपटल ड्राइवर एक के उत्पादन के लिए है scancode कि vt / keyboard.c को सौंप दिया जा सकता है (getkeycode () उस के शीर्ष के पास देखें)। Documentation/input/input.txtकुछ (आश्चर्यजनक प्राचीन, योग्य) संकेत हैं।
गोल्डीलॉक्स

पुनश्च। कर्नेल देवों में से कई लाइनक्स कर्नेल मेल लिस्ट (LKML) पर हैं, जो जनता के लिए खुला है, और यदि आप अपने P & Qs आदि को ध्यान में रखते हैं ( tux.org/lkml ) तो यह आपके लिए सार्थक पूछताछ है - बस यह सुनिश्चित करें कि आप अभी इसके लिए एक फ़ोल्डर सेट करें, इसमें बहुत सारे मेल शामिल हैं।
गोल्डीलॉक्स

कोड को अधिक बारीकी से निरीक्षण करने पर, keyboard.c में केवल तीन गैर-अप्रचलित कार्य हैं, जो set_console कहते हैं: fn_lastcons (), fn_dec_console (), और fn_inc_console ()। एक अंतिम कंसोल पर जाने के लिए और एक दाईं ओर या बाईं ओर जाने के लिए। इसलिए मुझे अभी भी समझ में नहीं आया है कि जब हम Ctrl + Alt + F <num> दबाते हैं तो set_console () कैसे कॉल किया जाता है। मुझे लगता है कि हमें कहीं भी set_console () के पैरामीटर के रूप में <num> पास करना होगा। मैं देख रहा हूँ कि set_console () फसलें vt_ioctl.c में भी हैं, लेकिन क्या यह केवल ioctl के लिए उपयोगकर्ता के स्थान से नहीं है, उदाहरण के लिए chvt? मेरी समझ में अभी भी कुछ छेद हैं।
user31765 3

1
ड्राइवरों / छिपने में अधिक संभावित संबंधित सामान है। Vt.c में v कंसोल_कॉलबैक () ’भी देखें, जो स्विच कर सकता है और DECLARE_WORK के माध्यम से शीर्ष पर पंजीकृत है। यह शेड्यूलर से संबंधित है: lxr.free-electrons.com/ident?i=DECLARE_WORK (यह क्रॉस-रेफरेंस टूल makelinux.net/kernel_map से फीड किया जा सकता है, जो आपको दिलचस्प लग सकता है); मुझे लगता है कि vt के लिए "मुख्य लूप" का वह कार्य प्रकार बनाता है। जाहिर है कि यहां गायब लिंक ठीक उसी तरह से है जैसे कीबोर्ड इवेंट्स के आसपास से गुजरते हैं।
गोल्डीलॉक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.