2017-02-15 6 views
0

Ich spielte mit ioctl und diese Frage fiel mir auf.Warum ist die Anzahl der Systemaufrufe sehr begrenzt?

Hintergrund

  1. Mir wurde gesagt, dass die primäre Motivation für Systemaufrufe ist, dass die Anzahl der Interrupt-Handler sehr eingeschränkt erlaubt ist. So viele Betriebssysteme implementieren die Abstraktion von Systemaufrufen (a.k.a. traps), die nur eine Unterbrechungsnummer (0x80 im Falle von Linux) belegen, aber zusätzliche Argumente akzeptieren, um unterschiedliche Funktionen auf Anforderung zu liefern.
  2. this thread schlägt vor, dass die Anzahl der Systemaufrufe tatsächlich auch sehr begrenzt ist, so dass die gleiche Argumentation erneut angewendet wird, um ioctl zu erfinden.

Daher meine Frage. Warum bieten Betriebssysteme nicht einfach genug Systemaufrufe und werden ioctl los? (Oder ist es einfach, eine hierarchische Struktur zu erstellen, um bessere Skalierbarkeit zu bieten?)

Antwort

1

Meine Meinung darüber ist, dass Systemaufrufe als eine Reihe von Diensten von Betriebssystemkern für Benutzeranwendungen angezeigt werden können, während ioctl ist Nur einer dieser Dienste ermöglicht es Ihnen, einen benutzerdefinierten Befehl an ein bestimmtes Gerät (oder einen bestimmten Treiber) zu senden.

Bei der Entwicklung eines Treibers können Sie einen Handler für ankommende ioctl Anfragen schreiben. Verwalten der gleichen Sache mit dem eigenen System Anrufe Umsetzung hat mehrere Nachteile:

  • Ihre Implementierung ist spezifisch für Ihre Fahrer, andere Komponenten wahrscheinlich wird es nicht verwenden,
  • das Hinzufügen neuer Systemaufrufe ist nicht so einfach - auf WIndows , ist es praktisch unmöglich wegen Patchguard (Kernel Patch Protection),
  • unter Windows kann der Kernel Ihnen bei der "Validierung" von I/O-Puffer für eine IOCTL-Anfrage helfen, müssen Sie alle die Arbeit selbst bei der Implementierung Ihrer eigene Systemaufrufe.

Sie können für read und writeioctl als Verallgemeinerung anzuzeigen. Es können sowohl Eingabe- als auch Ausgabepuffer bereitgestellt werden, zusammen mit einem Steuercode, der die vom Ziel angeforderte Aktion definiert (normalerweise ein Kernel-Treiber).

+0

Ich denke, Ihre Antwort macht mehr Sinn als die oben genannten Post. Nur um zu bestätigen, Systemaufrufe sind wie eine anpassbare Handler für das Betriebssystem mit der CPU zu interagieren, während "ioctl" innerhalb des Betriebssystems ist ein anpassbarer Handler für die Interaktion zwischen User-Space-Anwendungen und dem Kernel? – wlnirvana

+0

System-Call-Handler werden vom OS-Kernel als Kommunikationsmechanismus zwischen usermode und kernelmode definiert (die CPU kann durch spezielle Anweisungen helfen, die den Wechsel zwischen Benutzer- und Kernel-Modus einfacher und kostengünstiger machen). Sie sind mehr oder weniger fest im Betriebssystemkernel codiert als eine feste Reihe von Routinen, die einzelne Systemaufrufe implementieren). Anforderungen, die im Auftrag von ioctl generiert werden, und einige andere Systemaufrufe werden normalerweise an einen Treiber gesendet, der für das ioctl-Ziel verantwortlich ist, so dass das ioctl vom Entwickler (in einer dokumentierten Weise) (teilweise) angepasst werden kann. –

Verwandte Themen