2012-04-01 7 views
1

Ich erinnere mich, dieses Konzept irgendwo zu lesen. Ich weiß nicht mehr wo. Ich habe eine Datei sagen file.c, die zusammen mit anderen Dateien zusammen mit einigen anderen Dateien als eine Bibliothek für die Verwendung von Anwendungen kompilieren.Datei in beiden KLM und User-Space

Nun nehme ich an, ich kompiliere die gleiche Datei und baue sie mit einem Kernel-Modul. Daher befindet sich das gleiche Dateiobjekt sowohl im Benutzer- als auch im Kernel-Bereich und erlaubt mir den Zugriff auf Kernel-Datenstrukturen, ohne einen Systemaufruf aufzurufen. Ich meine, ich kann APIs in der Bibliothek haben, über die Anwendungen auf Kernel-Datenstrukturen zugreifen können, ohne dass Systemaufrufe erforderlich sind. Ich bin mir nicht sicher, ob ich etwas in den Kernel schreiben kann (was meiner Meinung nach auf diese Weise unmöglich ist), aber das Lesen einiger Datenstrukturen aus dem Kernel wäre in Ordnung?

Kann mir jemand mehr Details über diesen Ansatz geben. Ich konnte in Google diesbezüglich nichts finden.

Antwort

0

Es gibt zwei Möglichkeiten, dies zu tun, wobei das gebräuchlichste ein sogenanntes Zeichengerät ist und das andere ein Blockgerät ist (d.h. etwas "scheibenähnliches").

Here's a guide zum Erstellen von Treibern, die Chardevs registrieren.

1

Ich glaube, das ist ein konzeptuell fehlerhafter Ansatz, es sei denn, ich missverstehe, wovon du sprichst.

Wenn ich Sie richtig verstehe, wollen Sie die gleiche Datei nehmen und sie zweimal kompilieren: einmal als Modul und einmal als Benutzerprogramm. Dann möchten Sie beide ausführen, damit sie Speicher freigeben können.

Also das offensichtliche Problem damit ist, dass obwohl die Programme aus dem gleichen Quellcode stammen, sie immer noch als separate ausführbare Dateien existieren. Das Modul wird kein eigener Prozess sein: es würde nur aufgerufen werden, wenn der Kernel läuft (d.h. Systemaufrufe). Sie können sich also dem System-Call-Nonsense nicht entziehen.

Eine bessere Lösung hängt davon ab, was Ihr Ziel ist: Möchten Sie einfach auf Kernel-Datenstrukturen zugreifen, weil Sie etwas brauchen, das Sie normalerweise nicht bekommen können? Oder sind Sie um die Leistung besorgt und möchten schneller auf diese Strukturen zugreifen als ein Systemaufruf?

Für (1) können Sie ein Zeichengerät oder eine procfs-Datei erstellen. Beides ermöglicht Ihren Userspace-Programmen, ihre schmutzigen kleinen Finger in den Kernel zu bekommen.

Für (2), Sie sind in einer schwierigen Lage, und das Problem wird viel fieser (und noch interessanter). Um das Geschwindigkeitsproblem zu lösen, kommt es sehr darauf an, welche genauen Daten Sie extrahieren möchten.

Hilft das?

+0

Hey, es war der Overhead des Kontextwechsel zu lösen. Während ich deine Antwort lese, sehe ich jetzt deutlich, was in meinem Denken falsch war. Procfs ist der Weg yo gehen, wenn ich die Daten lesen muss. Für alles andere muss ich den Soft-Interrupt durchlaufen, ich meine syscall. – Pkp

+0

Für das Overhead-Problem hängt es sehr stark davon ab, welche Daten Sie suchen. Wie oft ändern sich die Daten, nach denen Sie fragen? –

Verwandte Themen