2013-04-05 7 views
7

Manchmal, wenn wir den Systemaufruf im Kernel-System aufrufen müssen, rufen wir dessen Hilfs- oder verwandte Kernel-Funktionen auf, stattdessen 'syscall'. Ich frage mich immer noch, ob wir Systemaufruf im Kernelraum aufrufen können? Wenn nicht, was hält uns davon ab?Können wir Systemaufruf im Kernelraum aufrufen?

Meine Frage ist ein bisschen komisch.

+0

Nein, du kannst nicht. Ein Systemaufruf ist definitionsgemäß die Schnittstelle zwischen Kernel und Userland –

+0

, die ich kannte. Was wir tun, nennt man den Helfer oder andere Funktionen. Ich bin nur neugierig, können wir es schaffen oder nicht. – liuyruc

+0

Und ein Systemaufruf ist wahrscheinlich auch ein Zeitplan; Sie möchten also seine Funktion nicht an einem beliebigen Punkt im Kernel aufrufen. Im Allgemeinen ist die Kernel-Codierung sehr schwierig. Sie sollten viel mehr erklären, was und warum Sie das tun wollen ... –

Antwort

9

Eigentlich entgegen der landläufigen Meinung (und einige Antworten hier), ist die Antwort, ja, können Sie, aber je nachdem, welches Betriebssystem:

  • Unter Linux können Sie fast alle Systemaufruf ruft, wenn Sie können ihren Kernel-Export finden (für ein Beispiel "cat/proc/kallsysms | grep sys_"). Es gibt einen kleinen "Trick", um einen Schutz in den meisten Systemaufrufen (die einen Benutzermodus * akzeptieren) zu umgehen, indem Sie das Datensegment (KERNEL_DS) einstellen. Es wird nicht genau empfohlen, macht aber Sinn, wenn Sie auf Dateien aus dem Kernel zugreifen müssen (z. B. SELinux).

  • In Windows sind die meisten Nt * Aufrufe im Kernel auch als Zw * Aufrufe verfügbar - machen Sie "dumpbin/exportiert C: \ windows \ system32 \ ntoskrnl.exe | findstr Zw (oder Nt)" für ein Beispiel.

  • In Mac OS X sollte es technisch nicht erlaubt sein, obwohl es clevere Hacks gibt, um es zu umgehen.

Obwohl Systemaufrufe sind in der Tat die Schnittstelle zwischen Benutzermodus und den Kernel gibt es überraschend nicht wenige Fälle, in denen sogar die Produktion würdigen Code tut so - aber durch sorgfältige Beachtung der Einschränkungen.

+1

Allerdings klagt es "Unbekanntes Symbol sys_socket" wenn ich insmod. –

+0

Das könnte daran liegen, dass das Symbol nur GPL ist. Linux ist irgendwann so. Probieren Sie die Katze/Grep von oben, und wenn Sie sehen, das Symbol exportiert (T), und immer noch nicht mit ihm verknüpfen kann, dann ist es wahrscheinlich, dass. Nicht alle Syscalls werden notwendigerweise exportiert. Gerade bei Sockets gibt es auch andere Probleme, aber lassen Sie uns das nicht erschweren - versuchen Sie es zuerst – Technologeeks