2012-04-14 6 views
1

Ich bin ein Anfänger der Kernel-Programmierung. Ich brauche nur etwas Inspiration. Ich weiß, dass ich einige Funktionen in der Kernel-Quelle schreiben, den Kernel neu aufbauen und neu starten kann. Die Codes könnten ein Hardwaretreiber sein, der die Hardware steuert. Aber wie kann unser Benutzerraumprogramm diese Funktionen nutzen? Ich weiß durch syscall das Userspace-Programm kann mit Kernel-Space kommunizieren, und das ladbare Kernel-Modul kann auch die im Kernel-Quellcode definierten Funktionen verwenden. Aber wie kann unser Anwenderprogramm dies erreichen?In Linux, wie kann ein Benutzer-Space-Programm die Kernel-Funktion verwenden? Ich brauche wirklich etwas Inspiration

PS: Jetzt lerne ich qemu-kvm. Ich weiß, Qemu ist ein Benutzer-Space-Programm und KVM ist Kernel. Ich möchte nur herausfinden, wie qemu Programm kvm verwendet.

Ich weiß, das ist ein sehr einfaches Linux Kernel Programmierungsproblem, aber es verwirrt mich für eine lange Zeit. Kann mir jemand einen Hinweis geben? :>

+0

Mittel kernel/User-Space Kommunikation abgesehen von syscalls sind die '/ proc' Dateisystem und Gerätedateien in'/dev'. –

+0

Ich denke, dass qemu-kvm netlink Kernel <=> Benutzerraum zu kommunizieren. – strkol

+0

@strkol: Was ist Netlink? –

Antwort

2

Sie sollten keinen neuen Syscall einfügen, wenn Sie einen Treiber programmieren. Neue syscalls sind normalerweise eine schlechte Idee, Sie sollten einen sehr guten Grund haben, es zu tun, und ein Hardware-Treiber ist nicht gut. Sie müssen Ihren Treiber als Zeichengerät, Blockgerät oder Netzwerkgerät registrieren. Ich empfehle Ihnen das Buch "Linux Device Driver" (das legal im Internet verfügbar ist), um Beispiele für verschiedene Arten von Treibern zu sehen.

Und über Ihre Frage, wie Sie eine Funktion im Kernel von Userspace aufrufen können ... es gibt keine direkte Möglichkeit, es zu tun, Sie können Userspace-Code nicht mit dem Kernel wie mit einer Bibliothek verknüpfen. Zuerst müssen Sie Ihre Funktion als syscall registrieren und dann den syscall mit der Funktion syscall() aufrufen.

ist hier ein gutes Howto erklärt es: http://www.tldp.org/HOWTO/html_single/Implement-Sys-Call-Linux-2.6-i386/