Ctrl + Alt + F <Sayı> tuşlarına basıldığında ne olur?


38

Şu anki terminali değiştirmek için bu tuş birleşimine basıldığında Linux'ta neler olduğuna dair bir açıklama arıyorum. Özellikle, hangi yazılım bileşeni bu tuş birleşimine müdahale eder ve terminali değiştirir? Çekirdek mi? Çekirdek ise, bunu yapan kaynak dosyanın yerini belirtebilir misiniz?

Düzenleme: Bunun hem grafiksel (X11) hem de metin tabanlı bir ortamda nasıl çalıştığını anlamak istiyorum.


1
Netleştirmek için, bu tuşlara X11'deyken (yani grafiksel bir oturum) veya metin konsolunda mısınız? Cevap farklı.
derobert

Yanıtlar:


36

Bu çekirdek. Klavyenin donanım olduğunu ve orada olan her şeyin çekirdekten geçtiğini unutmayın; VT geçişi söz konusu olduğunda, olayı tamamen kendisi idare eder ve kullanıcı alanına hiçbir şey aktarmaz (ancak, kullanıcı alanı programlarının onları içeren bir anahtardan haberdar edilebileceği ve belki de etkileyebileceği konusunda ioctl ile ilgili bir araç olduğuna inanıyorum, ki X hiç şüphe yok).

Çekirdeğin içinde bir anahtar haritası vardır ; Bu, çalıştırırken değiştirilebilir loadkeysve şunlarla görüntülenebilir 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
[...]   

Çekirdek kaynağı tam olarak buna benzeyen bir varsayılan anahtar haritası dosyası içerir; 3.12.2 için src/drivers/tty/vt/defkeymap.map. Ayrıca karşılık gelen bir defkeymap.c dosyası olduğunu göreceksiniz (bu ile oluşturulabilir loadkeys --mktable). Elleçleme olduğunu keyboard.cçağıran (tüm bu dosyaların aynı dizinde bulunan) set_console()denvt.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);

Bu listeden bazı isabetler çıkardım; İşlev imzasını ikinci satırda görebilirsiniz.

Yani bunlar değişime dahil olan şeyler. Eğer aramaların dizisi bakarsak, eninde sonunda geri gelmek kbd_event()içinde keyboard.c. Bu modül için bir olay işleyicisi olarak kaydedilir:

(3.12.2 drivers/tty/vt/keyboard.csatır 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);           

Bu nedenle, kbd_event()asıl donanım sürücüsünden bir şey kabardığında (muhtemelen drivers/hid/veya bir şey drivers/input/) çağrılmalıdır . Ancak, kbd_eventbir işlev işaretçisiyle kaydedildiğinden, o dosyanın dışında olarak adlandırıldığını görmezsiniz.

Çekirdeği incelemek için bazı kaynaklar

  • Linux Çapraz Referans Tanımlayıcı Arama harika bir araçtır.
  • Etkileşimli Linux Kernel Haritası çapraz başvuru aracı için ilginç bir grafik ön sonudur.
  • En azından 1995 yılına kadar uzanan devasa Linux Çekirdek Posta Listesinin (LKML) birkaç tarihi arşivi var; Bazıları korunmaz ve arama özellikleri bozulur, ancak gmane çok iyi çalışıyor gibi görünüyor. İnsanlar posta listesinde birçok soru sordular ve geliştiriciler arasında da birincil bir iletişim aracı.
  • Kendi printksatırlarınızı kaynağa basit bir izleme aracı olarak enjekte edebilirsiniz (standart C lib dosyasının tümü stdio'dan printf dahil olmak üzere çekirdek kodunda kullanılamaz). Printk şeyler syslog içinde sona erer.

Wolfgang Mauerer , kaynağın çoğundan geçen 2.6 çekirdekli, Profesyonel Linux Çekirdek Mimarisi üzerine büyük bir kitap yazdı . Son on yılın en önemli geliştiricilerinden biri olan Greg Kroah-Hartman'ın aynı zamanda tekmeleyen şeyleri de var.


1
Sağol, tam olarak aradığım şey buydu. Zincirde daha önce olanlar hakkında ayrıntılı bilgi verebilir misiniz? Ctrl + Alt + F1 tuşlarına bastığımızda keyboard.c'deki kod nasıl çağrılır? keyboard.c gerçek "klavye sürücüsü" değil, değil mi?
user31765

1
Hayır, sanmıyorum. Bunların hepsi keyboard.cbir olay işleyicisi olan tty sürücüsünün bir parçası ; "klavye sürücüsü" daha düşük seviyedeydi - drivers/input/keyboard/usb dışı şeyler için bunlardan bir sürü var. Usb malzeme standardize edilmiştir, sadece bir tane olacaktır (muhtemelen dahil drivers/hid/usbhid/usbkbd.c). Ben klavye sürücüsü üretmek için olduğunu tahmin ediyorum scancode vt / keyboard.c teslim edilebilir (yani üst kısmına yakın getkeycode () bakınız). Documentation/input/input.txtbazı (harika antik, lol) ipuçlarına sahiptir.
goldilocks

PS. Çekirdek Devs çoğu halka açık ve size P & Qs mind eğer vb (linux çekirdeği posta listesinde (LKML) üzerinde Hangi tux.org/lkml ) onu değerli olduğunu orada soran ... sadece emin olmak hemen bir klasör oluşturmak için, bir sürü posta var.
goldilock

Kodu daha yakından incelendikten sonra, keyboard.c'de set_console: fn_lastcons (), fn_dec_console () ve fn_inc_console () olarak adlandırılan eski üç işlev vardır. Biri son konsola, diğeri sağa veya sola gitmek için. Ctrl + Alt + F <num> tuşlarına bastığımızda set_console () işlevinin nasıl çağrıldığını hala anlamadım. Bir yere set_console () parametresi olarak <num> parametresini geçirmemiz gerektiğini düşünüyorum. Set_console () 'nin vt_ioctl.c içinde de çoğaldığını görüyorum, ancak bu sadece ioctl'ler için kullanıcı alanından değil, örneğin chvt'den mi? Benim anlayışımda hala bazı delikler var.
user31765

1
Şoför / saklanacak potansiyel olarak daha fazla şey var. Ayrıca vt.c'deki 'console_callback ()' i de işaretleyiniz, bu da anahtarı yapıp DECLARE_WORK aracılığıyla en üste kayıtlıdır. Bu, programlayıcıya ilişkindir: lxr.free-electrons.com/ident?i=DECLARE_WORK (bu çapraz referans aracı makelinux.net/kernel_map adresinden ilginç bulabileceğiniz beslenebilir ); Bu işlevi vt için bir "ana döngü" yapar. Açıkçası buradaki eksik bağlantı, klavye olaylarının tam olarak nasıl geçtiği.
goldilock
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.