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 loadkeys
ve ş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.c
satı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_event
bir 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
printk
satı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.