2012-03-30 3 views
3

Ich möchte meine eigene libc-Bibliothek für x86 Linux zu Lernzwecken schreiben. Dazu müsste ich den Linux-Systemaufruf in der Sprache der Assembly-Ebene aufrufen. Ich weiß, wie man einen Systemaufruf in Assembly unter Linux macht. Ich benötige jedoch die vollständigen Informationen zu Linux Systemaufrufen.auf der Suche nach einem detaillierten Dokument über Linux Systemaufrufe

Ich bin auf der Suche nach einem detaillierten Dokument über Linux-System-Aufruf wie Eingaben und Ausgaben für jeden Systemaufruf. Kann mir bitte jemand URL/PDF für Linux-Systemanruf geben.

Zum Beispiel für den Aufruf 'sys_socketcall', registrieren Sie AX = 102, BX sollte eine Call-Nummer für eine Methode wie create/bind enthalten und CX sollte einen Zeiger auf 'unsigned long' enthalten. Hier brauche ich mehr Informationen zum dritten Parameter (CX).

+1

'libc' auf 8086? Du hast mich ohnmächtig gemacht! Wie auch immer Sie können hier beginnen - http: //stackoverflow.com/questions/9506353/how-to-invoke-a-system-call-via-sysester-in-inline-assembly-x86-amd64-linux –

+0

https://stackoverflow.com/questions/3614995/linux-system-call-table-or-cheetsheet-in-assembly-language –

Antwort

1

Die beste Quelle für Informationen zu Linux-Kernel ist überraschenderweise seine Quelle: https://github.com/torvalds/linux/blob/master/include/linux/syscalls.h die benötigte Aufruf Definition enthalten sollte.

Die Quelle des Anrufs selbst: http://lxr.free-electrons.com/source/net/socket.c#L2366, hier können Sie sehen, wie die Parameter behandelt werden.

Um Linux-Quelle im Netz schnell grep, können Sie LXR verwenden: http://lxr.free-electrons.com/ident?i=sys_socketcall.

+0

Danke, noch bin ich nicht sicher über jede Eingabe in "long sys_socket (int, int, int);" API. Durch Linux-Code-Analyse konnte ich verstehen, was jeder Input hier bedeutet. Es wird jedoch Zeit benötigen und ich kann etwas missverstehen. Daher suche ich nach detaillierten Informationen zum Linux System Aufruf. –

+0

Kurz gesagt, der Aufruf kann eine unterschiedliche Anzahl von Argumenten haben, abhängig von dem Argumentwert 'call'. Und wenn Sie libc wirklich zum Lernen neu implementieren wollen, sollten Sie besser eine moderne Plattform wie ARM wählen. Die Kernel-Version, die auf 8086 laufen würde, ist selbst ein Problem. – vissi2

+0

Schauen Sie sich Zeile 2349 an, sie enthält ein Array von Argumentzählungen, abhängig vom 'Call'-Wert (den Sie im BX-Register speichern). – vissi2

1

Der Systemaufruf socketcall ist ein Sonderfall, also verlassen Sie sich nicht auf dieses, um das allgemeine Format zu lernen. Darüber hinaus existieren sie nur auf x86-32, und andere Plattformen verwenden separate Systemaufrufe für jede Funktion/Prozedur der Socket-Operationen (bei diesen Plattformen gibt es keine socketcall, sondern socket, bind usw.).

Für den speziellen Fall, die socketcall ist: es erwartet __NR_socketcalleax in der Teilfunktion (ex SYS_SOCKET, SYS_BIND, etc) Zahl in ebx und die Adresse der anderen Argumente in ecx. Sie müssen ein Array von 3 Wörtern für den Socket-Vorgang speichern (Erstellen eines Sockets), speichern Sie die Familie in my_array[0], geben Sie den Typ in my_array[1], und das Protokoll (in der Regel 0) in my_array[2], übergeben Sie die Adresse von my_array zu ecx (Sie übergeben die Nummer des Elements in my_array in keiner expliziten Weise, es wird von der Socket-Unterfunktion impliziert, die Sie aufrufen).

Sie können diese Dokumente erhalten:

nun für andere Systemaufrufe, die nicht die socketcall Ausnahme, müssen Sie nur die Referenz der correspoding POSIX-Funktion erhalten (siehe reference) oder der entsprechenden Beschreibung der Funktion von man(2) (man(2) ist ein Abschnitt der Handbuchseiten, der den Systemaufrufen gewidmet ist), die Sie hier als Beispiel finden können: man-pages section 2. Dann müssen Sie die Reihenfolge der Argumente notieren.Sie werden das System Rufnummer in eax, dann alle anderen Argumente in der gleichen Reihenfolge passieren, wie entweder durch man(2) oder POSIX beschrieben, auf, um, ebx, ecx, edx, esi, edi, ebp (bis zu sechs Argumente). Der Status/das Ergebnis wird in eax zurückgegeben.

Beachten Sie, dass das obige nur für Linux auf Intel-Architektur gilt (Sie vermuten, dass andere Prozessoren andere Register haben), und beachten Sie auch, dass die Systemrufnummern sich zwischen x86-32 und x86-64 unterscheiden.