Frage

Ich schreibe eine Client / Server in Linux-Kernel (Ja. Im Innern des Kernels. Sein Design Entscheidung getroffen und abgeschlossen. Die mich nicht ändern)

Der Server liest eingehende Pakete von einem Raw-Socket. Das Transportprotokoll für diese Pakete (auf die der Raw-Socket lauscht) ist kundenspezifische und UDP dergleichen. Kurz gesagt muss ich nicht für eingehende Verbindungen hören und dann ein Gewinde Gabel, um diese Verbindung zu behandeln.

Ich muß nur jeden IP-Datagramm verarbeiten auf diesem Raw-Socket kommen. Ich werde für Pakete in einer Endlosschleife auf dem Raw-Socket lesen Sie weiter. In der Benutzerebene gleichwertiges Programm hätte ich einen eigenen Thread und gehalten hören für eingehende Pakete erstellt.

Jetzt für Kernel-Level-Server, ich habe Zweifel, ob ich es in einem separaten Thread ausgeführt werden soll oder nicht, weil:

  1. Ich denke, read () ist eine I / O-Operation. Also irgendwo in der read (), Kernel muss Aufruf schedule () Funktion, um die Steuerung des Prozessors zu verzichten. So liest nach dem Aufruf von () auf Raw-Socket, der aktuell aktive Kernel-Kontext wird in den Warteschleife setzen (in einem Schlaf Warteschlange gestellt vielleicht?), Bis die Pakete zur Verfügung stehen. Wie und wann Pakete ankommen, wird der Kernel Interrupt-Kontext signalisieren, dass der Lesekontext, der in der Warteschlange schläft, ist wieder einsatzbereit. Ich verwende ‚Kontext‘ hier absichtlich statt ‚Faden‘. So sollte ich keinen separaten Kernel-Thread benötigen.

  2. Auf der anderen Seite, wenn read () verzichtet nicht die Kontrolle dann wird gesamter Kernel blockiert werden.

Kann ich jemand Tipps geben, wie soll ich meinen Server entwerfen? Was ist der Irrtum des Arguments in Punkt 1 dargestellt?

War es hilfreich?

Lösung

Ich bin mir nicht sicher, ob Sie einen Raw-Socket an alle im Kernel benötigen. Im Inneren des Kernels können Sie einen Netfilter Hook hinzufügen oder etwas anderes registrieren (???), die alle Pakete empfangen wird; Dies könnte das sein, was Sie wollen.

Wenn Sie DID einen Raw-Socket im Kernel, dann würden Sie wahrscheinlich einen Kernel-Thread haben müssen (das heißt Gestartet von kernel_thread) nennen lesen () auf sich. Aber es muss nicht ein Kernel-Thread sein, es könnte ein User-Space-Thread sein, die nur eine spezielle syscall oder Geräte callte den gewünschten Kernelmodus-Routine aufzurufen.

Wenn Sie einen Haken registriert haben, der Kontext es in genannt wird ist wahrscheinlich etwas, das nicht zu viel Verarbeitung tun sollte; Ich weiß nicht genau, was das ist wahrscheinlich zu sein, kann es eine „untere Hälfte Handler“ oder „Tasklet“ sein, was auch immer die Are (diese Art von Kontrollstrukturen von einer Version zum anderen halten zu ändern). Ich hoffe, es ist nicht wirklich eine Interrupt-Service-Routine.


In Antwort auf Ihre ursprüngliche Frage:

  1. Ja, sys_read wird der aufrufende Thread blockieren, sei es ein Kernel-Thread oder ein User-Space ist ein. Das System wird nicht hängen. Wenn jedoch der aufrufende Thread nicht in einem Zustand befindet, in dem blockierenden Sinn macht, wird Panik die Kernel (Terminierung in Interrupt oder etwas)

Ja, Sie müssen diese in einem separaten Thread tun, nein, es wird das System nicht hängen. Allerdings System Telefonieren im Kernel-Modus sehr fraglich ist, obwohl es funktioniert (Art).

Aber wenn Sie irgendeine Art von Haken stattdessen installiert, würden Sie nicht irgendetwas davon benötigen zu tun.

Andere Tipps

Ich denke, die beste Wahl, die Art und Weise Treiber geschrieben emulieren könnte sein, denken Sie an Ihrem Server als virtuelles Gerät oben auf diejenigen sitzen, die die Anfragen kommen aus. Beispiel: a. Maustreiber akzeptiert kontinuierliche Eingabe, aber das System nicht gesperrt werden, wenn richtig programmiert, und ein Netzwerkadapter ist wahrscheinlich ähnlich zu Ihrem Fall

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top