2016-11-10 23 views
8

Piszę sterownik, aby kontrolować niestandardowy sprzęt.Sterownik dla systemu Linux: ioctl lub sysfs?

W dawnych czasach (tj. 15 lat temu) robiłem to z ioctls, ale teraz kopie w sysfs jako możliwą alternatywę.

  • Jak rozumiem, Ioctl nie są całkowicie przestarzałe, ale preferowane jest sysfs (?)
  • muszę czytać zestawy/zapisu wartości jednocześnie to znaczy za pomocą jednego wpisu sysfs. Czytałem, że nie jest to idealne, ale jest do przyjęcia, jeśli jest to konieczne (?)
  • Musi być "mutex" ochrona sterownika, aby tylko jedna aplikacja mogła do niej pisać na raz. (Mam kilka wpisów "tylko do odczytu", które wolałbym zawsze mieć dostęp do wszystkich).

Biorąc pod uwagę powyższe, jaki byłby najlepszy sposób postępowania - ioctl lub sysfs?

Jeśli masz sysfs, jak mogę wprowadzić wyłączny dostęp?

Jeśli sysfs, to czy sterownik nie ma fpsów do odczytu/zapisu/ioctl, czy potrzebuje otworzyć/wydać ?!

(Jest to sterownik „prywatne”, więc nie dbam masowo;)!, Ale zorientowali czy nowe sposoby są stosowane wtedy równie dobrze mogę uporać się z nimi)

Dzięki.

Odpowiedz

8

Spróbuję przynajmniej częściowo odpowiedzieć na twoje pytanie. Zapraszam do komentowania zapytać mnie, aby rozwinąć (lub kurczyć!)

  • Przede wszystkim, w tych dniach Ioctl już uważane są przestarzałe, ponieważ ludzie nie znalazłem lepsze rozwiązania wszystkich problemów, jakie rozwiązania. Oczekuje się, że ludzie będą bardziej zdyscyplinowani, definiując interfejsy ioctl, i zgodnie z prawdą wyrażać to, co będą czytać i pisać w kodowaniu liczb ioctl, jeśli to w ogóle możliwe. ioctls i sysfs mają różne mocne strony.
  • sysfs służy głównie do ujawniania określonych atrybutów urządzeń przestrzeni użytkownika, w szczególności użytkownikowi na konsoli lub skrypcie powłoki, oraz pozwalaniu na zmianę tych atrybutów lub konfiguracji urządzenia. Pojedynczy plik sysfs zwykle odwzorowuje pojedynczy atrybut i jest zwykle czytelny (i/lub zapisywalny) jako prosty ciąg tekstowy. Na przykład może ujawnić bieżący stan zarządzania energią urządzenia (na przykład "Wył.") I umożliwić napisanie nowego przy użyciu polecenia "cat".
  • sysfs rzeczywiście nie jest związany z sesją open/release (i nie powinieneś jej implementować), więc prawdopodobnie jest odpowiedni tylko dla atrybutów globalnych. Nie powinien stanowić problemu, jeśli oczekuje się, że użytkownik będzie wykonywał tylko jedną operację na urządzeniu naraz, ale utrudnia jej egzekwowanie (prawdopodobnie nie jest to idealne ustawienie dla "zestawów danych jednocześnie", chyba że wszystkie zostaną zakodowane jeden ciąg). I tak, chcesz zabezpieczyć wszelkie dane sterowników, do których uzyskasz dostęp z twoich sterowników sysfs z muteksami, prawdopodobnie jeden mutex na logiczny zestaw danych (lub jeden dla kilku zestawów logicznych).
  • ioctl lepiej nadaje się do przekazywania informacji binarnych między przestrzenią użytkownika a sterownikiem i potrzebuje programu C lub podobnego do używania go. Niestandardowe ioctle są dobrze dostosowane do pisania minimalnego sterownika w jądrze i umieszczania logiki w dopasowanym programie przestrzeni użytkownika. W przeciwieństwie do sysfs, nie potrzebuje dodatkowej logiki do interpretowania ciągów tekstowych - może odczytywać i zapisywać dane bezpośrednio z pamięci procesu użytkownika - co oznacza mniej niepotrzebny kod, ale także więcej możliwości niezwiązanych z bezpieczeństwem w dokładnym sprawdzaniu danych.
+0

Dzięki za opinie Michael. Myślę, że twoje postrzeganie kompromisów pasuje do tego, co miałem, – ColH

+0

Być może mógłbyś "zaakceptować" odpowiedź, jeśli wydaje ci się to rozsądne? Dzięki. – michaeljt

Powiązane problemy