Yanıtlar:
Birkaç farklı senaryo var; En yaygın olanları tarif edeceğim. Ardışık makroskopik olaylar şunlardır:
a
.a
.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.
+----------+ +-------------+ +-----+
| 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/eventNNN
Linux'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:
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. xev
Bir 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ş a
takı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.
+-------------+ +----------+ +-----+ +---------+
| 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.
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?
+-------------------+ +-------------+
----->| terminal emulator |-------------->| application |
+-------------------+ +-------------+
keysym character or
escape sequence
Terminal emülatörü, “ Left
bası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.
+-------------+ +-------------------+
| 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.
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.
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.
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.
PgUp
ve Ctrl+PgUp
ayırt edilemiyorum (TERM = linux). Keysym -> kontrol dizisi eşlemesi konfigüre edilebilir mi?
loadkeys
. Sorular etiketli ara linux konsol klavye-düzen .
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.
man 5 keymaps
tercüme için kullanılankeycodes
içinscancodes
. İ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.