2016-11-10 19 views
8

Bazı özel donanımları denetlemek için bir sürücü yazıyorum.Linux sürücüsü: ioctl veya sysfs?

Eski günlerde (yani 15 yıl önce) bunu ioctls ile yapıyordum, ancak şimdi olası bir alternatif olarak sysfs'a giriyorum.

  • Anladığım kadarıyla

    , ıoctl'ler tamamen kaldırılmış değildir, ancak sysfs Bir sysfs girişi aracılığıyla aynı anda yani değerlerin/yazma setleri okumaya gerek (?)
  • tercih edilir. Bunun ideal olmadığını okudum, ancak eğer gerekliyse (?)
  • Sürücüde 'mutex' koruması olması gerekir, böylece bir seferde sadece bir uygulama yazılabilir. (Ben her zaman erişilebilir tutmak için tercih edeceğim bazı salt okunur 'bilgi' girdiler var).

Yukarıdakiler göz önüne alındığında, ilerlemenin en iyi yolu ne olurdu? Ioctl veya sysfs?

Eğer sysfs ise, o zaman özel erişimi nasıl uygularım?

Eğer sysfs ise, eğer sürücüde okuma/yazma/ioctl fops yoksa, açık/serbest bırakılması gerekir mi ?!

(Bu 'özel' sürücü, bu yüzden kitlesel umurumda değil;)!, Ancak yeni yollar daha uygulanabilir olup olmadığını o zaman ben de onlarla vâkıf düşündüm)

teşekkürler.

cevap

8

Sorunuzu en azından kısmen yanıtlamaya çalışacağım. genişletmek için bana sormaya yorum yapmaktan çekinmeyin (veya küçültmek!) insanların çözmek tüm sorunlara daha iyi çözümler bulamadı olarak tüm

  • Birincisi, bugünlerde ıoctl'ler, artık kaldırılmış kabul edilir. İnsanların, ioctl arayüzlerini tanımlarken daha disiplinli olmaları ve eğer mümkün olursa, şifreleyici sayılar içinde okuyacakları ve yazacaklarını doğru bir şekilde ifade etmeleri beklenir. ioctls ve sysfs farklı güçlüdür.
  • sysfs, özellikle aygıtın belirli niteliklerini kullanıcı alanına, özellikle de konsoldaki bir kullanıcıya veya bir kabuk komut dosyasına maruz bırakmak ve bu özniteliklerin veya aygıt yapılandırmasının değiştirilmesine izin vermek için kullanışlıdır. Tek bir sysfs dosyası genellikle tek bir öznitelikle eşleşir ve genellikle basit bir metin dizesi olarak okunabilir (ve/veya yazılabilir). Örneğin, bir cihazın geçerli güç yönetimi durumunu (ör. "Kapalı") gösterebilir ve "kedi" kabuk komutunu kullanarak yeni bir tane yazmanıza izin verebilir.
  • sysfs gerçekten bir açık/bırakma oturumuna bağlı değildir (ve bunları kullanmak için bunları uygulamak zorunda kalmamalısınız), bu yüzden muhtemelen küresel öznitelikleri için gerçekten uygundur. Kullanıcının tek seferde cihaz üzerinde tek bir işlem gerçekleştirmesi beklenirse bir sorun olmamalı, ancak hepsini aynı anda kodlamadığınız sürece, "eşzamanlı olarak veri kümeleriniz için ideal olmayabilir". bir dize). Ve evet, sysfs işleyicilerinizden erişeceğiniz herhangi bir sürücü verisini mutekslerle, muhtemelen mantıksal veri kümesi başına bir muteks (ya da birkaç mantıksal set için) ile korumak istiyorsunuz.
  • ioctl, kullanıcı-alanı ile sürücü arasındaki ikili bilgileri geçmeye daha uygundur ve bir C programına veya buna benzer bir programa gereksinim duyar. Özel ioctls, çekirdekte en az bir sürücü yazma ve mantıksal bir kullanıcı alanı programına koyma için çok uygundur. Sysfs'den farklı olarak, metin dizelerini yorumlamak için ekstra bir mantığa ihtiyaç duymaz - veriyi kullanıcı işlem belleğinden okuyabilir ve yazabilir - bu da daha az gereksiz kod anlamına gelir, aynı zamanda güvenlik açısından verileri daha fazla kontrol etmemek için daha fazla fırsat sunar.
+0

Görünümler için teşekkürler Michael. Bence, hisseleri algılayışımın sahip olduğum duyguyla örtüştüğünü düşünüyorum, – ColH

+0

Belki de cevabını "kabul edersin" diye düşünmüşsün. Teşekkürler. – michaeljt

İlgili konular