Klavye girişi ve metin çıkışı nasıl çalışır?


85

Sanırım Abir metin editöründeki tuşa basarsam ve bu karakteri abelgeye ekler ve ekranda gösterir. Editör uygulamasının donanım ile doğrudan iletişim kurmadığını biliyorum (aralarında bir çekirdek ve benzeri şeyler var), peki bilgisayarımın içinde neler oluyor?

Yanıtlar:


100

Birkaç farklı senaryo var; En yaygın olanları tarif edeceğim. Ardışık makroskopik olaylar şunlardır:

  1. Giriş: Tuşa basma olayı klavye donanımından uygulamaya iletilir.
  2. İşleme: Uygulama, tuşa Abasıldığı için karakteri göstermesi gerektiğine karar verir a.
  3. Çıktı: Uygulama ekranda görüntülenme sırasını verir a.

GUI uygulamaları

Unix sistemlerin fiili standart grafiksel kullanıcı arayüzü, X Pencere adı verilen ve genellikle X11 olarak adlandırılan X Pencere Sistemidir ; X sunucusu adı verilen bir program işletim sistemi çekirdeği ve uygulamalar arasında oturur; Ekranda pencerelerin gösterilmesi ve tuşa basmanın odağı olan pencereye iletilmesi gibi hizmetler sağlar.

Giriş

+----------+              +-------------+         +-----+
| keyboard |------------->| motherboard |-------->| CPU |
+----------+              +-------------+         +-----+
             USB, PS/2, …                 PCI, …
             key down/up

İlk önce, tuşa basma ve tuşa basma hakkında bilgiler klavyeden bilgisayara ve bilgisayarın içine iletilir. Detaylar donanımın tipine bağlıdır. Bu kısım üzerinde daha fazla durmayacağım, çünkü bilgiler zincirin bu kısmı boyunca aynı kalıyor: belli bir tuşa basılmış veya bırakılmış.

         +--------+        +----------+          +-------------+
-------->| kernel |------->| X server |--------->| application |
         +--------+        +----------+          +-------------+
interrupt          scancode             keysym
                   =keycode            +modifiers

Bir donanım olayı meydana geldiğinde, CPU , çekirdekteki bazı kodların çalışmasına neden olan bir kesmeyi tetikler . Bu kod, donanım olayının bir klavyeden gelen bir tuşa basılması veya tuşa basılması olduğunu tespit eder ve tuşu tanımlayan tarama kodunu kaydeder .

X sunucusu, giriş olaylarını bir aygıt dosyası yoluyla , örneğin /dev/input/eventNNNLinux'ta (NNN'nin bir sayı olduğu) okur . Ne zaman bir olay varsa, çekirdek o cihazdan okunacak veri olduğunu gösterir. Aygıt dosyası (çekirdek bir değere, bir klavye bağımlı değerden tarama kodu çevirmek ya da donanım tarafından iletilen değerine eşit olabilir veya olmayabilir bir tarama kodu ile kilit / aşağı olayları iletir ve Linux gelmez tarama kodlarını bilmediğini yeniden iletme ).

X, bir anahtar kod okuduğu tarama kodunu çağırır . X sunucusu, anahtar kodları anahtar kelimelere çeviren bir tablo tutar (“anahtar simgesi” için kısa). Keysyms gibi isimler, oysa anahtar kodları, sayısal olarak A, aacute, F1, KP_Add, Control_L, ... keysym (değiştirici tuşları bastırılarak bağlı olarak değişebilir Shift, Ctrl, ...).

Eşleştirmeyi anahtar kodlardan anahtarlara kadar yapılandırmak için iki mekanizma vardır:

  • xmodmap geleneksel mekanizmadır. Bu, anahtar kodları bir keysyms listesine eşleştiren basit bir tablodur (değiştirilmemiş, kaydırılmış,…).
  • XKB , diğerleri arasında, özellikle de çift dilli yapılandırma için, daha fazla değiştirici için daha iyi desteği olan daha güçlü, ancak daha karmaşık bir mekanizmadır.

Uygulamalar X sunucusuna bağlanır ve bu uygulamanın bir penceresi odaklanırken bir tuşa basıldığında bir bildirim alır. Bildirim, hangi değiştiricilerin şu anda basıldığının yanı sıra belirli bir tuş takımının basıldığını veya serbest bırakıldığını gösterir. xevBir terminalden programı çalıştırarak keysyms görebilirsiniz . Uygulamanın bilgiyle yaptığı şey ona kalmış; Bazı uygulamalarda yapılandırılabilir anahtar bağlantıları vardır.

Tipik bir konfigürasyonda, Adeğiştiricisiz etiketli tuşa bastığınızda , bu tuş atakımını uygulamaya gönderir ; Uygulama, metni yazdığınız bir moddaysa, bu karakteri ekler a.

Klavye düzeniyle xmodmap arasındaki ilişki klavye girişinde daha fazla ayrıntıya giriyor. Fare olayları Linux'ta nasıl çalışır? alt seviyelerde fare girişi genel bir bakış sunar.

Çıktı

+-------------+        +----------+          +-----+         +---------+
| application |------->| X server |---····-->| GPU |-------->| monitor |
+-------------+        +----------+          +-----+         +---------+
               text or              varies          VGA, DVI,
               image                                HDMI, …

Karakter göstermenin iki yolu vardır.

Bkz . Farklı türlerdeki XWindows fontlarının amaçları nelerdir? X11’in altında müşteri tarafı ve sunucu tarafı metin oluşturmanın tartışılması için.

X sunucusu ve Grafik İşleme Birimi (ekran kartındaki işlemci) arasında ne olduğu çok donanıma bağlıdır. Basit sistemler, X sunucusunun , GPU'nun görüntülenmesi için seçtiği bir çerçeve oluşturucu adı verilen bir bellek bölgesinde çizmesini sağlar . Herhangi bir 21. yüzyıl bilgisayarında veya akıllı telefonunda bulunanlar gibi gelişmiş sistemler GPU'nun daha iyi performans için bazı işlemleri doğrudan gerçekleştirmesini sağlar. Sonuçta, GPU ekran içeriği pikselini bir saniyenin her bir kısmını monitöre piksel kadar iletir.

Terminalde çalışan metin modu uygulaması

Metin editörünüz bir terminalde çalışan bir metin modu uygulamasıysa, o zaman yukarıdaki bölümün amacı için uygulama olan terminaldir. Bu bölümde, metin modu uygulaması ile terminal arasındaki arayüzü açıklarım. Öncelikle, X11'in altında çalışan bir terminal emülatörü durumunu anlatıyorum . Bir 'terminal', 'shell', 'tty' ve 'konsol' arasındaki tam fark nedir? Burada yararlı arka plan olabilir. Bunu okuduktan sonra, çok daha detaylı okumak isteyebilirsiniz Her bir Sözde Terminal (PTY) bileşeninin (yazılım, ana taraf, ikincil taraf) sorumlulukları nelerdir?

Giriş

      +-------------------+               +-------------+
----->| terminal emulator |-------------->| application |
      +-------------------+               +-------------+
keysym                     character or
                           escape sequence

Terminal emülatörü, “ Leftbasılıyken basıldı ” gibi olayları alır Shift. Terminal emülatörü ve metin modu uygulaması arasındaki arayüz , bayt ileten bir karakter aygıtı olan sözde bir terminaldir (pty) . Terminal emülatörü bir tuşa basma olayı aldığında, bunu uygulamanın pty cihazından okuyacağı bir veya daha fazla bayta dönüştürür.

ASCII aralığının dışındaki yazdırılabilir karakterler, karakter ve kodlamaya bağlı olarak bir veya daha fazla byte olarak iletilir . Örneğin , Unicode karakter kümesinin UTF-8 kodlamasında , ASCII aralığındaki karakterler tek bayt olarak kodlanırken, bu aralığın dışındaki karakterler çoklu bayt olarak kodlanır.

Bir işlev tuşu veya gibi değiştiriciler ile yazdırılabilir karaktere karşılık gelen anahtar presler Ctrlveya Altbir şekilde gönderilir çıkış sırası . Kaçış dizileri tipik olarak karakter kaçışından (bayt değeri 27 = 0x1B = \033, bazen ^[veya ile temsil edilir \e) ve ardından bir veya daha fazla yazdırılabilir karakterden oluşur. Birkaç tuş veya tuş kombinasyonu, ASCII tabanlı kodlamalarda (Unicode dahil günümüzde neredeyse tümü olan) bunlara karşılık gelen bir kontrol karakterine sahiptir : Ctrl+ letter1–26 aralığında bir karakter değeri verir Esc, kaçış karakteridir yukarıda görüldüğü ve ayrıca aynı Ctrl+ [, Tabaynıdır Ctrl+ I,ReturnCtrl+ M, vb ile aynıdır

Farklı terminaller verilen bir tuş veya tuş kombinasyonu için farklı kaçış dizileri gönderir. Neyse ki, konuşma doğru değil: bir sekans verildiğinde, pratikte kodladığı en fazla bir tuş kombinasyonu var. Bunun tek istisnası 127 = 0x7f = karakteridir \0177, bu genellikle Backspaceama bazendir Delete.

Bir terminalde, önce Ctrl+ Vsonra bir tuş kombinasyonunu yazarsanız , bu, kaçış dizisinin ilk baytını tuş kombinasyonundan tam anlamıyla ekler. Kaçış dizileri normalde yalnızca birinciden sonra yazdırılabilir karakterlerden oluştuğundan, bu, tüm kaçış dizisini tam anlamıyla ekler. Anahtar ciltleri tablosuna bakınız ? Bu bağlamda zsh tartışması için.

Terminal bazı değiştirici kombinasyonları için aynı kaçış sırasını iletebilir (örneğin, birçok terminal hem Spaceve Shift+ için bir boşluk karakteri iletir Space; xterm değiştirici kombinasyonlarını ayırt etmek için bir moda sahiptir, fakat popüler kitap kütüphanesine dayanan terminaller yoktur ). Birkaç tuş hiç aktarılmaz, örneğin terminal emülatörünün bağlanmasını tetikleyen değiştirici tuşlar veya tuşlar (örneğin bir kopyala veya yapıştır komutu).

Arzu ederse, kaçış dizilerini sembolik anahtar isimlere çevirmek uygulamaya bağlıdır.

Çıktı

+-------------+               +-------------------+
| application |-------------->| terminal emulator |--->
+-------------+               +-------------------+
               character or
               escape sequence

Çıktı, girişten daha basittir. Uygulama pty aygıt dosyasına bir karakter çıkarırsa, terminal emülatörü geçerli imleç konumunda görüntüler. (Terminal emülatörü bir imleç konumunu korur ve imlecin ekranın altına düşüp düşmeyeceğini kaydırır.) Uygulama , terminale imleci hareket ettirmek gibi eylemler gerçekleştirmesini söylemek için kaçış dizileri (çoğunlukla ^[veya ile başlayan ^]) verebilir, Metin niteliklerini değiştirme (renk, kalın,…) veya ekranın bir bölümünü silme.

Terminal emülatörü tarafından desteklenen kaçış dizileri, termcap veya terminfo veritabanında tarif edilmiştir . Günümüzde çoğu terminal emülatörü, xterm ile oldukça uyumludur . LESS_TERMCAP_ * değişkenlerine ilişkin dökümanlara bakınız ? Terminal olanak bilgi veritabanlarının daha uzun tartışma için ve nasıl yanıp imleci durdurmak ve ben içindeki ssha makinenin olanlar kullanmak benim yerel makinenin terminali renklerini ayarlayabilir miyim? bazı kullanım örnekleri için.

Metin konsolunda çalışan uygulama

Uygulama doğrudan bir metin konsolunda, yani bir terminal emülatör uygulamasından ziyade çekirdek tarafından sağlanan bir terminalde çalışıyorsa, aynı prensipler geçerlidir. Terminal ve uygulama arasındaki arayüz, karakterleri ileten bir bayt akımıdır, özel tuşlar ve kaçış dizileri olarak kodlanmış komutlar içerir.

Ağ üzerinden erişilen uzak uygulama

Uzaktan metin uygulaması

Uzak bir makinede, örneğin SSH üzerinden bir program çalıştırıyorsanız , ağ iletişim protokolü verileri pty düzeyinde aktarır.

+-------------+           +------+           +-----+           +----------+
| application |<--------->| sshd |<--------->| ssh |<--------->| terminal |
+-------------+           +------+           +-----+           +----------+
               byte stream        byte stream       byte stream
               (char/seq)         over TCP/…        (char/seq)

Bu, genellikle uzak terminal veritabanının yerel terminalin tüm özelliklerini bilmeyebilmesi dışında, çoğunlukla şeffaftır.

Remote X11 uygulaması

Uygulamalar ve bir sunucu arasındaki iletişim protokolünün kendisi SSH gibi bir ağ protokolü üzerinden gönderilebilen bir bayt akışıdır.

+-------------+            +------+        +-----+            +----------+
| application |<---------->| sshd |<------>| ssh |<---------->| X server |
+-------------+            +------+        +-----+            +----------+
               X11 protocol        X11 over       X11 protocol
                                   TCP/…

Bu, uygulama ve ekran arasında doğrudan iletişim gerektiren film kod çözme ve 3B oluşturma gibi bazı hızlandırma özelliklerinin bulunmaması dışında, çoğunlukla şeffaftır.


Cevap genellikle diyor parçası "Uygulama bir metin konsolda çalışan" acaba oldukça detaylı olduğu için tamamen emin değil, ama gibi şeyler oradaki özelliği olmayabilir man 5 keymapstercüme için kullanılan keycodesiçin scancodes. İlke olarak belirtildiği gibi, yine de tamamen farklı bir dizi araç / programdır ve bu belki biraz daha fazla öngörü gerektirecektir. Bunun yanında cevap +1 ve gömülü ilgili sorulardan dolayı harika.
humanityANDpeace

Tty1'de buldum PgUpve Ctrl+PgUpayırt edilemiyorum (TERM = linux). Keysym -> kontrol dizisi eşlemesi konfigüre edilebilir mi?
stewbasic

@stewbasic Evet, tarafından yüklenen bir tuş eşlemeli loadkeys. Sorular etiketli ara linux konsol klavye-düzen .
Gilles,

@Gilles teşekkürler! Loadkey'lerin hem eşlemelerin keycode -> keysym hem de keysym -> escape dizisini değiştirdiğini fark etmek önemlidir (bu başlangıçta bana açık değildi).
stewbasic

1
Vay canına, bu Stackexchange'te gördüğüm en iyi cevaplardan biri olmalı - iyi organize edilmiş, soruya cevap veriyor, ilgili bağlamı sağlıyor, diğer faydalı cevapları çapraz referanslıyor ve hatta güzel ASCII sanatına sahip!
Johntron

4

Bunu, anlaşılabilir olacak kadar küçük bir Unix sisteminde görmek istiyorsanız, Xv6'ya dalın . John Lion'ın ünlü yorumunun temeli haline gelen , uzun süredir samizdat olarak bilinen efsanevi Unix 6th Edition . Kodu ANSI C altında derlenmek ve çoklu işlemciler gibi modern gelişmeleri dikkate almak için elden geçirildi.

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.