Bir program bir aygıt sürücüsü ile tam olarak nasıl konuşur?


12

Bu yüzden, programcılar olarak bilgisayardaki cihazlarla tam olarak nasıl konuştuğumuz konusunda kafam karıştı. Şimdi büyük fikirlerden bahsetmiyorum. Farklı programların bu özellikleri kullanabilmesi için donanımın üstünde oturan aygıt sürücüleri olduğunu biliyorum.

Ama genel olarak sürücülerle tam olarak kim konuşuyor? Uygulamayı yazan programcı sürücüde bir işlevi çağırmaktan sorumlu mu? Ya da programcı işletim sistemi üzerinden sürücüye yapılan çağrıyı işleyen bir fonksiyon mu çağırıyor?



1
Her ikisinden de biraz, ve işletim sistemine ve cihaz türüne göre değişir.
whatsisname

Yanıtlar:


12

Bir işletim sisteminin olduğu yerlerde, programlar en azından doğrudan değil, aygıt sürücüleri ile konuşmaz. Programlar, onlardan habersiz, sonunda bir ya da daha fazla soyutlama katmanı aracılığıyla aygıt sürücülerine konuşulan soyutlamalarla konuşurlar.

Modern işletim sistemlerinin karmaşıklığını atlayacağım ve 45 yıl önce geliştirilen bir mikrobilgisayar işletim sistemi olan CP / M'yi örnek olarak kullanacağım . CP / M, üç katmanlı bir katman kekiydi:

Programı. Üst katman, hesaplama ve I / O yaparak faydalı bir şey yapan (kelime işlemci, Space Invaders oynamak) bir programdır . Bir noktada programın kullanıcının görmesi için 'A' harfini görüntülemek istediğini varsayalım. CP / M, konsol olarak bilinen ve programla etkileşime giren kullanıcının bakması gereken bir soyutlama sağlar . Bir karakter göndermenin geleneksel yolu birkaç montaj talimatı ile:

LD C,2   ; Load 2 into register C
LD E,65  ; Load the ASCII code for 'A' into register E
CALL 5   ; Call CP/M's routine for getting things done

(Onlara aşina değilseniz, kayıtlar işlemcide yaşayan değişkenler olarak düşünülebilir.) Sihirli sayıların ne olduğunu 2ve 5bir dakika içinde ne olduğunu öğreneceğiz . Buradaki paket, tüm programın bildiği bir konsolun ve ona yazmanın bir yolu olduğudur. Bunun ötesinde hiçbir şey bilmiyor ya da umursamıyor. CP / M'nin I / O için kullandığı iki soyutlamadan ilki budur.

BDOS . 5Programın çağırdığı adres , bir sonraki katmanın, Temel Disk İşletim Sisteminin veya BDOS'un giriş noktasıdır . BDOS, bir restoran menüsünden numaraya göre sipariş vermek gibi bir dizi numaralandırılmış işlev sunar . Kaydı Cişlev numarasıyla ( 2konsol çıktısı için) ve Egönderilecek karaktere sahip kaydı yükleyerek konsol çıktısını almak istediğinizi söylersiniz . Konsol çıkışı çok basit bir işlemdir ve BDOS'un bir sonraki katmanı çağırmak dışında bununla çok fazla uğraşması gerekmez.

BIOS. BIOS veya Temel Giriş / Çıkış Sistemi , donanıma özgü tüm kodların yaşadığı katmandır. Modern sistemlerde, bu bir dizi aygıt sürücüsü olarak kabul edilir. BDOS gibi, BIOS da BDOS'un işini yapmak için kullandığı standart çok ilkel işlemler kümesi için çağrılar sağlar . Bu operasyonlardan birineCONOUTProgramın istediği karakteri üst üste iki katman yazmasını istediği karakteri elde etmeye özen gösterir. (PC'lerin aksine, o zamanlar homojen değildi. Herkesin sistemi bunu gerçekleştirmenin farklı yollarına sahipti.) Konsol çıktısı BDOS için basit bir geçiş, ancak bir diskte dosya oluşturmak gibi daha karmaşık bir şey yapmak birçok şey gerektirebilir BIOS, medyayı manipüle etmek için çağırır. Yine, BIOS'un standart, soyut bir arayüzü olduğundan, BDOS her zaman istediklerini nasıl elde edeceğini bilir ve BIOS'un nasıl yaptığını umursamaz.

Muhtemelen neden sadece biri yerine iki soyutlama olduğunu (programdan BDOS'a ve BDOS'dan BIOS'a) merak ediyorsunuzdur. Cevap, CP / M ve BDOS'un bilgisayar üreticilerine ikili formda sağlanabilmeleri, donanımları için aygıt sürücülerine sahip özel bir BIOS yazmaları, ikisini birbirine cıvatalaması ve sistemleri için OS olarak göndermeleri. Bu çok önemli bir şeydi, çünkü BDOS bir kuruluş tarafından korunuyordu ve bu nedenle her zaman kullanıcı programları tarafından bilinen bir miktardı ve aynı uygulamaları çok çeşitli (zaman) donanımda çalıştırmayı mümkün kıldı. Bu yüzden işletim sistemleri mevcuttur ve biz sadece donanımı doğrudan büken programlar yazmıyoruz .

Burada tarif ettiğim her şey modern işletim sistemleri için de geçerlidir. Örneğin Unix, her şeyi dosya olarak özetler. Bu programlar sistem çağrıları aynı seti (verir open(), write(), close()bir disk sürücüsü veya seri port olsun iletişim, vs.). Kararlar ve soyutlamalar kümesi çok daha karmaşıktır, ancak yine de işlemin gerçekleşmesi için alt katmandaki hangi aygıt sürücüsü kodunun çalıştırılması gerektiğini seçmek için kaynar.


Daha önce CP / M koduna gerçekten bakmadım ( zamanımdan biraz önce ... CP / M bilgisayarları kullandım ama onlar için hiç kod yazmadım), ama call 5burada kullanımından oldukça şaşırdım . Olmaz rst 8(o hedef adresinde bellek 3 bayt feda ederim ama 2 denir her zaman ... save) çok daha etkili olmuştur?
Jules

@Jules: CP80, 8080 için geliştirildi; bu, kesme cihazlarının RSTveri yoluna tek baytlık bir komut (genellikle a ) koyacağı tek bir kesme moduna sahipti . Kesin olarak söyleyemem, ancak tüm cihazların artı DDT (kesme noktalarının gerçekleşmesi için bunları kullandı) ve BDOS'a girmek için bir tane kullanarak tüm ihtiyaçları karşılamak için yeterli yuva olmayabilirdi. .
Blrfl

Ah. Bu mantıklı, evet. 8-bit geliştirme deneyimim sadece tek bir kesme kaynağına sahip makinelerle sınırlıdır, bu yüzden bu tür şeyler hakkında çok fazla endişelenmek zorunda kalmadı ... :)
Jules

Hızlı soru, bu işlem Windows işletim sistemi ve Windows çekirdeği ile nasıl daha fazla ilişkilidir? Yoksa bunun için yeni bir soru sormalıyım.
Jason

@Jason: Wikipedia'da mimariyi tanımlayan ve cevabı veren bir sayfa var . Microsoft'un 1993'ten beri ürettiği her şey bu mimariyi kullanıyor. Aynı şey, sadece pastanın içinde daha fazla katman var.
Blrfl

0

Bir sürü farklı olasılık var:

  • Sık kullanılan aygıtlar için, işletim sistemi genellikle sürücülerin uyguladığı ve dilinizin standart kitaplığının uyarladığı bir API içerir. Tipik örnekler: dosya sistemleri, yazıcılar, ağ, MIDI aygıtları.
  • Daha egzotik cihazlar için, cihaz üreticisi sürücüler sağlamak zorundadır ve bazen popüler diller için dil bağlamaları da içerir. En azından C bağları olacak ve hemen hemen tüm dillerin C kitaplıklarını çağırmanın bir yolu var.
  • Bu iki durum arasında bir şekilde, basit cihazlar sadece bir seri port gibi genel amaçlı bir bağlantı kullanabilir ve üretici sadece daha sonra genel seri port sürücüsü aracılığıyla kullanabileceğiniz protokolü yayınlar.
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.