Ioctl - ioctl - Wikipedia

İçinde bilgi işlem, ioctl (kısaltması giriş / çıkış kontrolü) bir sistem çağrısı cihaza özel giriş çıkış normal sistem çağrılarıyla ifade edilemeyen işlemler ve diğer işlemler. Bir istek kodunu belirten bir parametre alır; bir aramanın etkisi tamamen istek koduna bağlıdır. İstek kodları genellikle cihaza özeldir. Örneğin, bir CD-ROM aygıt sürücüsü Fiziksel bir aygıta bir diski çıkarma talimatı verebilen, ioctl bunu yapmak için kod isteyin. Cihazdan bağımsız istek kodları bazen Kullanıcı alanı Yalnızca çekirdek sistem yazılımı tarafından kullanılan veya halen geliştirilmekte olan çekirdek işlevlerine erişim.

ioctl sistem çağrısı ilk olarak şurada göründü: Versiyon 7 nın-nin Unix bu isim altında. Çoğu Unix tarafından desteklenir ve Unix benzeri sistemler dahil Linux ve Mac os işletim sistemi mevcut istek kodları sistemden sisteme farklılık gösterse de. Microsoft Windows "DeviceIoControl", kendi içinde Win32 API.

Arka fon

Geleneksel işletim sistemleri iki katmana ayrılabilir, Kullanıcı alanı ve çekirdek. A gibi uygulama kodu Metin düzeltici Içinde yaşıyor Kullanıcı alanı, işletim sisteminin temelini oluşturan özellikler, örneğin ağ yığını çekirdekte bulunur. Çekirdek kodu hassas kaynakları yönetir ve uygulamalar arasında güvenlik ve güvenilirlik engellerini uygular; bu nedenle, kullanıcı modu uygulamalarının doğrudan çekirdek kaynaklarına erişmesi işletim sistemi tarafından engellenir.

Kullanıcı alanı uygulamalar tipik olarak çekirdeğe isteklerde bulunur: sistem çağrıları, kodu çekirdek katmanında yer alır. Bir sistem çağrısı genellikle, istenen sistem çağrısının bir indeks numarasıyla gösterildiği bir "sistem çağrı vektörü" şeklini alır. Örneğin, çıkış() 1 numaralı sistem çağrısı olabilir ve yazmak() 4 numara. Sistem çağrı vektörü daha sonra istek için istenen çekirdek işlevini bulmak için kullanılır. Bu şekilde, geleneksel işletim sistemleri tipik olarak kullanıcı alanına birkaç yüz sistem çağrısı sağlar.

Standart çekirdek tesislerine erişmek için uygun bir tasarım olmasına rağmen, sistem çağrıları bazen standart olmayan donanım çevre birimlerine erişmek için uygun değildir. Zorunlu olarak, çoğu donanım çevre birimi (diğer bir deyişle aygıtlar) yalnızca çekirdek içinde doğrudan adreslenebilir. Ancak kullanıcı kodunun cihazlarla doğrudan iletişim kurması gerekebilir; örneğin, bir yönetici ortam türünü bir Ethernet arayüz. Modern işletim sistemleri, birçoğu geniş bir tesis koleksiyonu sunan çeşitli cihazları destekler. Bu özelliklerin bazıları çekirdek tasarımcısı tarafından öngörülemeyebilir ve sonuç olarak bir çekirdeğin aygıtları kullanmak için sistem çağrıları sağlaması zordur.

Bu sorunu çözmek için, çekirdek genişletilebilir olacak şekilde tasarlanmıştır ve a adı verilen ekstra bir modülü kabul edebilir. aygıt sürücüsü çekirdek alanında çalışan ve doğrudan cihaza hitap edebilen. Bir ioctl arabirim, kullanıcı alanının aygıt sürücüleriyle iletişim kurabileceği tek bir sistem çağrısıdır. Bir aygıt sürücüsüyle ilgili istekler buna göre belirlenir ioctl tipik olarak cihaza bir tutamaç ve bir talep numarası ile sistem çağrısı. Böylece, temel çekirdek, kullanıcı alanının, aygıt tarafından desteklenen tesisler hakkında hiçbir şey bilmeden ve yönetilemeyecek kadar geniş bir sistem çağrıları koleksiyonuna ihtiyaç duymadan bir aygıt sürücüsüne erişmesine izin verebilir.

Kullanımlar

Donanım aygıt yapılandırması

Ortak bir kullanım ioctl donanım cihazlarını kontrol etmektir.

Örneğin, Win32 sistemler ioctl aramalar ile iletişim kurabilir USB aygıtlar veya takılı depolama aygıtlarının sürücü geometrisi bilgilerini keşfedebilirler.

Açık OpenBSD ve NetBSD, ioctl tarafından kullanılır biyo (4) sözde aygıt sürücüsü ve bioctl uygulamak için yardımcı program RAID benzer birleşik bir satıcıdan bağımsız arabirimde birim yönetimi ifconfig.[1][2]

Açık NetBSD, ioctl tarafından da kullanılır sysmon çerçeve.[3]

Terminaller

Bir kullanım ioctl son kullanıcı uygulamalarına maruz kalan kodda terminal I / O'dur.

Unix işletim sistemleri geleneksel olarak komut satırı arayüzleri. Unix komut satırı arayüzü, sözde terminaller (ptys), gibi donanım metin terminallerini taklit eder VT100'ler. Bir pty, bir donanım aygıtı gibi kontrol edilir ve yapılandırılır. ioctl aramalar. Örneğin, bir pty'nin pencere boyutu, TIOCSWINSZ telefon etmek. TIOCSTI (terminal G / Ç kontrolü, terminal girişini simüle etme) ioctl işlevi, bir karakteri bir aygıt akışına itebilir.[4]

Çekirdek uzantıları

Uygulamaların çekirdeği genişletmesi gerektiğinde, örneğin ağ işlemeyi hızlandırmak için, ioctl aramalar köprü kurmak için uygun bir yol sağlar Kullanıcı alanı çekirdek uzantılarına kod. Çekirdek uzantıları dosya sisteminde ad ile açılabilen ve içinden rastgele sayıda ioctl çağrılar gönderilebilir ve uzantının işletim sistemine sistem çağrıları eklemeden programlanmasına izin verir.

sysctl alternatifi

Göre OpenBSD geliştirici ioctl ve sysctl iki sistem çağrıları çekirdeği genişletmek için sysctl muhtemelen ikisinden daha basit olanı.[5]

İçinde NetBSD, sysmon_envsys için çerçeve donanım izleme kullanır ioctl vasıtasıyla proplib; buna karşılık OpenBSD ve DragonFly BSD bunun yerine kullan sysctl onların karşılığı için hw.sensors çerçeve. Orijinal revizyonu envsys NetBSD'de ioctl önce proplib mevcuttu ve çerçevenin deneysel olduğunu ve bir sysctl (8) arayüz, geliştirilmeli,[6][7] potansiyel olarak seçimini açıklayan sysctl OpenBSD'de daha sonraki tanıtımıyla birlikte hw.sensors 2003 yılında. Ancak, envsys çerçeve 2007'de yeniden tasarlandı proplib, sistem çağrısı olarak kaldı ioctlve mesaj kaldırıldı.[8]

Uygulamalar

Unix

ioctl sistem çağrısı ilk olarak şurada göründü: Sürüm 7 Unix, yeniden adlandırılmış olarak stty.[9] Bir ioctl çağrı alır parametreleri:

  1. açık dosya tanımlayıcı
  2. bir istek kod numarası
  3. ya bir tamsayı değeri, muhtemelen işaretsiz (sürücüye gidiyor) ya da Işaretçi verilere (sürücüye gitme, sürücüden geri dönme veya her ikisi).

çekirdek genellikle bir ioctl doğrudan aygıt sürücüsünü arayın, bu sürücü talep numarasını ve verileri gerektiği şekilde yorumlayabilir. Her sürücü belgesinin yazarları, söz konusu sürücü için numara ister ve bunları şu şekilde sağlar: sabitler içinde başlık dosyası.

Dahil olmak üzere bazı Unix sistemleri Linux cihaz sürücüsüne / sürücüsünden aktarılacak verinin boyutunu, veri aktarımının yönünü ve talebi uygulayan sürücünün kimliğini talep numarası dahilinde kodlayan kurallara sahiptir. Böyle bir kurala uyulup uyulmadığına bakılmaksızın, çekirdek ve sürücü, tek tip bir hata kodu (sembolik sabit ile gösterilir) sağlamak için işbirliği yapar. ENOTTY) onu tanımayan bir sürücüye talepte bulunan bir uygulamaya.

Anımsatıcı ENOTTY (geleneksel olarak kısa mesajla ilişkilendirilir "Daktilo değil "), bir ioctl sadece nerede teletype (tty) cihaz bu hatayı ortaya çıkardı. Sembolik anımsatıcı uyumluluk gereksinimleriyle sabitlenmiş olsa da, bazı modern sistemler daha yararlı bir şekilde "Uygunsuz cihaz kontrol operasyonu"(veya yerelleştirme bunların).

TCSETS bir örneği ioctl aramak seri port. Bir seri bağlantı noktasındaki normal okuma ve yazma çağrıları, veri baytlarını alır ve gönderir. Bir ioctl (fd, TCSETS, veri) çağrı, bu tür normal G / Ç'den ayrı olarak, özel işlem gibi çeşitli sürücü seçeneklerini kontrol eder. karakterler veya bağlantı noktasındaki çıkış sinyalleri (örn. DTR sinyal).

Win32

Bir Win32 DeviceIoControl parametre olarak alır:

  1. açık bir nesne tutamacı (bir dosya tanımlayıcısının Win32 eşdeğeri)
  2. bir talep kodu numarası ("kontrol kodu")
  3. giriş parametreleri için bir arabellek
  4. giriş arabelleğinin uzunluğu
  5. çıktı sonuçları için bir tampon
  6. çıktı arabelleğinin uzunluğu
  7. bir AŞIRI yapı, eğer örtüşen G / Ç kullanılıyor.

Win32 cihaz kontrol kodu, gerçekleştirilen işlemin modunu dikkate alır.

Aygıt sürücüsünün güvenliğini etkileyen 4 tanımlanmış çalışma modu vardır -

  1. METHOD_IN_DIRECT: Tampon adresinin kullanıcı modu arayanı tarafından okunabilir olduğu doğrulanır.
  2. METHOD_OUT_DIRECT: Tampon adresinin, kullanıcı modu arayıcısı tarafından yazılabilir olduğu doğrulanır.
  3. METHOD_NEITHER: Kullanıcı modu sanal adresleri, eşleme veya doğrulama olmadan sürücüye geçirilir.
  4. METHOD_BUFFERED: IO Manager kontrollü paylaşılan arabellekler, verileri kullanıcı moduna ve modundan taşımak için kullanılır.

Alternatifler

Diğer vektörlü çağrı arayüzleri

Cihazlar ve çekirdek uzantıları bağlanabilir Kullanıcı alanı ek yeni sistem çağrıları kullanmak, ancak bu yaklaşım nadiren benimsenir, çünkü işletim sistemi geliştiricileri sistem çağrısı arayüzünü odaklı ve verimli tutmaya çalışır.

Unix işletim sistemlerinde, diğer iki vektörlü çağrı arabirimi popülerdir: fcntl ("dosya kontrolü") sistem çağrısı açık dosyaları yapılandırır ve etkinleştirme gibi durumlarda kullanılır. engellemeyen G / Ç; ve setsockopt ("yuva seçeneğini ayarla") sistem çağrısı açık yapılandırır ağ soketleri yapılandırmak için kullanılan bir tesis ipfw paket güvenlik duvarı açık BSD Unix sistemleri.

Bellek eşleme

Unix
Cihaz arayüzleri ve giriş / çıkış yetenekleri bazen bellek eşlemeli dosyalar. Cihazlarla etkileşime giren uygulamalar, cihaza karşılık gelen dosya sisteminde bir konum açar. ioctl çağrı, ancak daha sonra adres alanlarının bir kısmını çekirdeğinkine bağlamak için bellek eşleme sistemi çağrılarını kullanın. Bu arayüz, bir cihaz ile bir cihaz arasında toplu veri aktarımı sağlamanın çok daha verimli bir yoludur. Kullanıcı alanı uygulama; bireysel ioctl veya okuma / yazma sistem çağrıları, bellek eşlemeli bir adres aralığına erişimin böyle bir ek yüke neden olmadığı tekrarlanan kullanıcı alanından çekirdeğe geçişler nedeniyle ek yük getirir.
Win32
Tamponlanmış IO yöntemleri veya adlandırılmış dosya eşleme nesneleri kullanılabilir; ancak, basit aygıt sürücüleri için standart DeviceIoControl METHOD_ erişim yeterlidir.

Netlink

Netlink soket benzeri bir mekanizmadır arası iletişim (IPC), daha esnek bir halef olacak şekilde tasarlanmıştır. ioctl.

Çıkarımlar

Karmaşıklık

ioctl çağrılar, çekirdeğin sistem çağrısı arabiriminin karmaşıklığını en aza indirir. Bununla birlikte, geliştiricilere çekirdek programlama arabirimlerinin bitlerini ve parçalarını "saklamaları" için bir yer sağlayarak, ioctl çağrılar, kullanıcıdan çekirdeğe genel API'yi karmaşıklaştırır. Birkaç yüz sistem çağrısı sağlayan bir çekirdek, birkaç bin ioctl çağrısı sağlayabilir.

Arayüzü olmasına rağmen ioctl Çağrılar, geleneksel sistem çağrılarından biraz farklı görünür, pratikte bir çağrı arasında çok az fark vardır. ioctl çağrı ve bir sistem çağrısı; bir ioctl çağrı, farklı bir gönderme mekanizmasına sahip bir sistem çağrısıdır. Çekirdek sistem çağrısı arayüzünün genişletilmesine karşı argümanların çoğu bu nedenle uygulanabilir. ioctl arayüzler.

Uygulama geliştiricileri için, sistem çağrıları uygulama alt yordamlarından farklı görünmüyor; bunlar, bağımsız değişkenleri alan ve değerleri döndüren işlev çağrılarıdır. Çalışma süresi İşletim sistemi kitaplıkları, sistem çağrılarını çağırmanın karmaşıklığını maskeler. Maalesef çalışma zamanı kitaplıkları, ioctl şeffaf olarak çağırır. Keşfetmek gibi basit işlemler IP adresleri bir makine için genellikle karışıklık gerektirir ioctl her biri gerektirir sihirli sayılar ve argüman yapıları.[kaynak belirtilmeli ]

Libpcap ve libdnet karmaşıklığı maskelemek için tasarlanmış üçüncü taraf sarmalayıcı Unix kitaplıklarının iki örneğidir. ioctl sırasıyla paket yakalama ve paket G / Ç için arayüzler.

Güvenlik

Genel işletim sistemlerinin kullanıcıdan çekirdeğe arayüzleri, piyasaya sürülmeden önce genellikle kod kusurları ve güvenlik açıkları açısından yoğun bir şekilde denetlenir. Bu denetimler tipik olarak iyi belgelenmiş sistem çağrı arayüzlerine odaklanır; Örneğin, denetçiler, kullanıcı kimliklerinin değiştirilmesi gibi hassas güvenlik çağrılarının yalnızca yönetici kullanıcılar tarafından kullanılabilmesini sağlayabilir.

ioctl arayüzler daha karmaşık, daha çeşitli ve bu nedenle sistem çağrılarına göre denetlenmesi daha zordur. Ayrıca, çünkü ioctl çağrılar, genellikle çekirdek işletim sistemi piyasaya sürüldükten sonra üçüncü taraf geliştiriciler tarafından sağlanabilir, ioctl çağrı uygulamaları daha az inceleme alabilir ve dolayısıyla daha fazla güvenlik açığı barındırabilir. Sonunda birçok ioctl aramalar, özellikle üçüncü taraf aygıt sürücüleri için belgelenmemiş.

Çünkü bir için işleyici ioctl çağrı doğrudan çekirdek modunda bulunur, giriş Kullanıcı alanı dikkatlice doğrulanmalıdır. Aygıt sürücülerindeki güvenlik açıkları, yerel kullanıcılar tarafından geçersiz arabelleklerin ioctl aramalar.

Win32 ve Unix işletim sistemleri bir Kullanıcı alanı cihaz adı, cihaza uygulanan özel erişim kontrollerine sahip uygulamaların erişiminden. Aygıt sürücüsü geliştiricileri uygun erişim kontrollerini uygulamadıklarında güvenlik sorunları ortaya çıkabilir. Kullanıcı alanı erişilebilir nesne.

Bazı modern işletim sistemleri, çekirdeği düşmanlardan korur Kullanıcı alanı kod (örneğin, arabellek taşması istismarlar) kullanarak sistem çağrısı sarmalayıcıları. Sistem çağrısı sarmalayıcıları uygular rol tabanlı erişim denetimi hangi sistem çağrılarının hangi uygulamalar tarafından çağrılabileceğini belirleyerek; Örneğin sarmalayıcılar, bir posta programının diğer programları çalıştırma hakkını "iptal etmek" için kullanılabilir. ioctl arabirimler sistem çağrısı sarmalayıcılarını karmaşıklaştırır çünkü çok sayıda vardır, her biri farklı argümanlar alır ve bazıları normal programlar için gerekli olabilir.

daha fazla okuma

  • W. Richard Stevens, UNIX Ortamında Gelişmiş Programlama (Addison-Wesley, 1992, ISBN  0-201-56317-7), bölüm 3.14.
  • Genel G / Ç Kontrol işlemleri çevrimiçi kılavuzda GNU C Kitaplığı
  • ioctl (2) – Sürüm 7 Unix Programcı Manuel
  • ioctl (2) – Linux Programcı Manuel - Sistem Çağrıları
  • ioctl (2) – FreeBSD Sistem Çağrıları Manuel
  • ioctl (2) – OpenBSD Sistem Çağrıları Manuel
  • ioctl (2) – Solaris 10 Sistem Çağrıları Referansı Manuel
  • "DeviceIoControl Belgeleri -de Microsoft Geliştirici Ağı

Referanslar

  1. ^ Niklas Hallqvist (2002); Marco Peereboom (2006). "bio (4) - G / Ç ioctl tüneli sözde aygıtını engelle". BSD Çapraz Referansı. OpenBSD. Lay özeti.
  2. ^ Marco Peereboom (2005). "bioctl (8) - RAID yönetim arayüzü". BSD Çapraz Referansı. OpenBSD. Lay özeti.
  3. ^ "sysmon (4) - sistem izleme ve güç yönetimi arayüzü". NetBSD. / Dev / sysmon aracılığıyla kullanılabilen bir ioctl (2) arabirimi.
  4. ^ Christiansen, Tom; Torkington Nathan (1998). "12: Paketler, Kitaplıklar ve Modüller". Perl Yemek Kitabı: Perl Programcıları için Çözümler ve Örnekler (2 ed.). Sebastopol, California: O'Reilly Media, Inc. (2003'te yayınlandı). s. 482. ISBN  9780596554965. Alındı 2016-11-15. [...] TIOCSTI [...], 'terminal G / Ç kontrolü, terminal girişini simüle et' anlamına gelir. Bu işlevi uygulayan sistemlerde, aygıt akışınıza bir karakter iter, böylece herhangi bir işlem o aygıttan bir sonraki okunduğunda, oraya koyduğunuz karakteri alır.
  5. ^ Federico Biancuzzi (2004-10-28). "OpenBSD 3.6 Live". ONLamp. O'Reilly Media. Alındı 2019-03-20. Çekirdeğe işlevsellik eklemek için (başka bir sistem çağrısı eklemeden) kullanılabilecek iki sistem çağrısı vardır: ioctl (2) ve sysctl (3). İkincisi, yeni özelliği uygulamak çok basit olduğu için seçildi.
  6. ^ Tim Rightnour; Bill Squier (2007-12-19). "envsys - Environmental Systems API". NetBSD 4.0. Bu API deneyseldir ve herhangi bir zamanda kullanımdan kaldırılabilir… Bu API'nin tamamı, eğer geliştirilecekse, bir sysctl (8) arayüzü veya bir çekirdek olay mekanizması ile değiştirilmelidir.
  7. ^ Constantine A. Murenin (2007-04-17). "3.5. NetBSD'nin sysmon (4)". Mikroişlemci Sistem Donanım Monitörleriyle Genelleştirilmiş Arayüz. 2007 IEEE Uluslararası Ağ Oluşturma, Algılama ve Kontrol Konferansı Bildirileri, 15–17 Nisan 2007. Londra, Birleşik Krallık: IEEE. s. 901–906. doi:10.1109 / ICNSC.2007.372901. ISBN  978-1-4244-1076-7. IEEE ICNSC 2007, s. 901—906.
  8. ^ Constantine A. Murenin (2010-05-21). "6.1. Çerçeve zaman çizelgesi; 7.1. NetBSD envsys / sysmon". OpenBSD Donanım Sensörleri - Ortam İzleme ve Fan Kontrolü (MMath tez). Waterloo Üniversitesi: UWSpace. hdl:10012/5234. Belge Kimliği: ab71498b6b1a60 ff817 b29d56997a418.
  9. ^ McIlroy, M. D. (1987). Bir Araştırma Unix okuyucusu: Programcı El Kitabı, 1971–1986'dan açıklamalı alıntılar (PDF) (Teknik rapor). CSTR. Bell Laboratuvarları. 139.