Ich lerne asm unter Linux (noobuntu 10.04) Ich habe den folgenden Code von Ссылка
erhalten %Vor%Es ist eine einfache Hallo Welt. Läuft unter Linux + ruft den Kernel (scheinbar) direkt auf. Kann mir bitte jemand erklären, was hier wirklich vorgeht? Ich denke, es liest die ganzen Zahlen in der eax & amp; ebx Prozessorregister & amp; ecx, edx data und definiert den Systemaufruf beim Aufruf des Kernels. Wenn ja, definieren verschiedene Ganzzahlkombinationen verschiedene Systemaufrufe, wenn int 0x80 aufgerufen wird?
Ich bin nicht gut mit man-Seiten, aber habe alle verwandten gelesen, die ich finden kann, sagt mir irgendeine man-Seite, welche Kombinationen definieren was syscalls?
JEDE Hilfe wird geschätzt. Eine Zeile für Zeile Erklärung wäre erstaunlich ... -Danke im Voraus Jeremy
Wenn Sie int 0x80
aufrufen, prüft der Kernel den Wert des Registers eax
, um die Funktion zu bestimmen, die Sie aufrufen möchten (dies ist die "syscall number"). Abhängig von dieser Zahl werden die restlichen Register als spezifische Dinge interpretiert. Der Aufruf sys_write
erwartet, dass die Register wie folgt eingerichtet werden:
eax
enthält 4 ebx
enthält den Dateideskriptor ecx
enthält die Adresse der zu schreibenden Daten edx
enthält die Anzahl der Bytes Weitere ausführliche Informationen finden Sie unter Linux-Systemaufrufe .
Dies ist nur Header-Material, der "Text" -Abschnitt eines Assembly-Programms ist nur die Maschinenanweisungen (gegenüber den Daten, schreibgeschützten Daten und BSS-Abschnitten). Die global
-Zeile entspricht der Aussage, dass die Funktion _start
"public" ist.
Aus den Kommentaren wissen wir, dass wir uns die Funktion sys_write
ansehen, so dass wir man 2 write
erhalten können, um die Details zu erhalten. Der C-Prototyp enthält die folgenden Parameter: fd
, *buf
und count
. Beginnend mit% ebx sehen wir, dass diese übereinstimmen (% ebx = fd,% ecx = zu schreibende Zeichenfolge und% edx = Länge der Zeichenfolge). Da wir ein Benutzerprozess sind, müssen wir den Kernel bitten, die Ausgabe durchzuführen. Dies geschieht über die SYSCALL-Schnittstelle und die write()
-Funktion erhält (anscheinend) die Zahl 4. INT 0x80
ist ein Software-Interrupt, der die SYSCALL-Routine des Linux-Kernels aufruft.
Sie können die tatsächlichen Nummern aller syscalls in den Linux-Header-Dateien finden (vorausgesetzt, Sie haben sie installiert). Auf meinem System habe ich /usr/include/sys/syscall.h
zu /usr/include/asm/unistd.h
und dann zu /usr/include/asm-i386/unistd.h
überprüft. Wo (ich sehe), #define __NR_write 4
.
Wie bei den letzten beiden Zeilen des vorherigen Segments wird nur die syscall-ID geladen und die Software wird unterbrochen, um das Programm zu beenden (Speicherzuordnung und Bereinigung entfernen).
%Vor%Dies ist der Datenabschnitt, er beschreibt nur Variablen, die wir in unserem Programm verwendet haben.
Es gibt zu viele Systemaufrufe, um für jede eine andere Anweisung in der Assemblersprache zu haben.
Stattdessen rufen Sie die TRAP-Anweisung auf. Der Wert von eax bestimmt, welcher Systemaufruf aufgerufen wird. Die anderen Register sind die Argumente für den Systemaufruf.
Die Systemaufrufe sind im Kernel aufgelistet.
Tags und Links assembly x86 linux-kernel system-calls