2016-04-04 19 views
0

Ich habe gelesen, Treiber als Kernel-Module implementiert und bin verwirrt über die CMD-Argument für den Systemaufruf. Es scheint, dass das CMD-Argument für den Systemaufruf neben anderen Informationen die Hauptnummer des Geräts codiert. Warum das? Sind diese Informationen unbedingt notwendig?Kernel-Module und Major-Nummern

Angenommen, ich schreibe auf mein Gerät als "echo 5>/dev/mytestdevice". Ich gebe die Major-Nummer nicht an, daher glaube ich, dass der Kernel bereits eine Möglichkeit hat, das Gerät seinem Kernel-Modul zuzuordnen. Wenn das der Fall ist, warum muss ich diese Information in einem ioctl Anruf dem Gerät zur Verfügung stellen (wie ich das dem Gerät als das erste Argument übergebe)?

zusammenfassend meine Fragen sind: -

  1. Wenn ich ein "echo 5>/dev/mytestdevice", wie findet der Kernel die Treiber zu diesem Gerät entspricht?
  2. Warum wird die Major-Nummer als Argument für einen ioctl-Aufruf übergeben?

Antwort

1
  1. Als ich ein tun "echo 5>/dev/mytestdevice", wie findet der Kernel die Treiber zu diesem Gerät entspricht?

Inode für Gerätedatei /dev/mytestdevice ist eine besondere: Statt mit einigen Datei Inhalt zugeordnet werden, es ist nur enthält größere und kleinere Zahlen. Wenn Sie versuchen, eine Operation mit einer solchen Datei durchzuführen, durchsucht der Kernel zuerst das registrierte Gerät mit diesen Identifikatoren und leitet dann die Operation für das gefundene Gerät um.

  1. Warum wird die Major-Nummer als Argument für einen ioctl-Aufruf übergeben?

Es ist kein echtes: cmd Argument für ioctl Aufruf keine größere Zahl enthält.

1

ich gehe davon aus, dass Sie hier nur über den Systemaufruf ioctl sprechen. Denken Sie daran, dass es viele weitere Systemaufrufe gibt und viele von ihnen überhaupt nicht auf Geräten arbeiten.

Warum denkst du, dass das cmd Argument (das dritte) muss die Hauptnummer darin codiert haben? Der Satz von ioctl-Befehlen für einen spezifischen Treiber tendiert dazu, einen beliebigen Wert auszuwählen und diesen in seinen Bits zu codieren. Dies ist so, dass es leicht durch andere Tools decodiert werden kann. aber dieser Wert ist nicht (oder ist nicht erforderlich) die Hauptnummer.

die offene/gültig fd auf Routendatei basiert syscalls wie read und write und ioctl verwendet.

möchten Sie vielleicht die ioctl Dokumentation wie Documentation/ioctl/ioctl-number.txt und Documentation/ioctl/ioctl-decoding.txt betrachten.