Was bedeutet "int 0x80" im Assemblercode?
Kann mir jemand erklären, was der folgende Assembler-code macht?
int 0x80
Kommentar zu dem Problem
Siehe auch The Definitive Guide to Linux System Calls (auf x86). und auch stackoverflow.com/tags/x86/info.
InformationsquelleAutor der Frage Josh Curren | 2009-11-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Er übergibt die Kontrolle an interrupt vector 0x80
Sehen http://en.wikipedia.org/wiki/Interrupt_vector
Unter Linux, haben Sie einen Blick auf diese: es wurde verwendet, um zu behandeln
system_call
. Natürlich auf einem anderen OS könnte dies bedeuten etwas ganz anderes.InformationsquelleAutor der Antwort jldupont
int
bedeutet unterbrechen, und die Anzahl0x80
ist die interrupt-Nummer.Ein interrupt überträgt das Programm fließen zu lassen, wem ist das handling, interrupt, der interrupt
0x80
in diesem Fall.In Linux
0x80
interrupt-handler wird der kernel, und wird verwendet, um system-calls an den kernel, die von anderen Programmen.Dem kernel mitgeteilt wird, über die das call-system das Programm will zu machen, indem Sie untersuchen den Wert in das register
%eax
(gas-syntax, und EAX in Intel-syntax). Jedes system nennen, haben unterschiedliche Anforderungen über die Verwendung von anderen Registern. Zum Beispiel, ein Wert von1
im%eax
bedeutet, dass ein system call vonexit()
, und der Wert in%ebx
hält der Wert der status-code fürexit()
.InformationsquelleAutor der Antwort Polat Tuzla
Beachten Sie, dass 0x80 = 80h = 128
Können Sie sehen,hier, dass INT ist nur eine von vielen Anweisungen (eigentlich ist die Assembler-Darstellung (oder sollte ich sagen 'Eselsbrücke')), die es in der x86-Befehlssatz. Dort finden Sie auch weitere Informationen zu dieser Instruktion im Intel-eigenen Handbuch gefunden hier.
Zusammenzufassen, die aus der PDF-Datei:
Wie Sie sehen können 0x80 ist die Ziel-operand in deiner Frage. An diesem Punkt ist die CPU weiß, dass es ausgeführt werden soll code, der sich in den Kernel, aber welchen code? Das ist bestimmt durch den Interrupt-Vektor in Linux.
Eines der nützlichsten DOS software-interrupts wurde-interrupt 0x21. Durch Aufruf mit verschiedenen Parametern in den Registern (meistens ah und al), könnten Sie den Zugriff auf verschiedene IO-Operationen, string-Ausgabe und mehr.
Den meisten Unix-Systemen und Derivaten verwenden Sie keine software-interrupts, mit Ausnahme der interrupt 0x80, verwendet, um system-Aufrufe. Dies wird erreicht durch die Eingabe einer 32-bit-Wert entsprechend zu einer kernel-Funktion in das EAX-register des Prozessors und dann ausführen INT 0x80.
Werfen Sie einen Blick auf diese wo bitte andere verfügbare Werte in der interrupt-handler-Tabellen werden angezeigt:
Wie kann man die Tabelle sehen, die Punkte, auf die die CPU zur Ausführung eines Systemaufrufs. Sie finden die Linux System Call table hier.
Indem Sie den Wert 0 x 1, EAX-register und Aufruf des INT 0x80 in Ihrem Programm, können Sie den Prozess der Ausführung von code im Kernel, der stop (exit) - der aktuell laufende Prozess (auf Linux x86 Intel CPU).
Einen hardware-interrupt darf nicht verwechselt werden mit einem software-interrupt. Hier ist eine sehr gute Antwort auf diese Bezug.
Diese ist auch eine gute Quelle.
Können Sie sehen, int 80h in Aktion hier.
InformationsquelleAutor der Antwort Koray Tugay
http://www.linfo.org/int_0x80.html
InformationsquelleAutor der Antwort Tom
Minimales 16-bit-Beispiel
Erst einmal lernen, wie zum erstellen einer minimalen bootloader, OS und führen Sie es auf QEMU und die Reale hardware habe ich hier erklärt: https://stackoverflow.com/a/32483545/895245
Nun kann man in 16-bit-real-Modus:
Dies tun würde in der Reihenfolge:
Do 0.
Do 1.
hlt
: stop ausführenBeachten Sie, wie der Prozessor sucht nach dem ersten handler an Adresse
0
, und die zweite in4
: das ist eine Tabelle der Prozeduren genannt IVT, und jeder Eintrag ist 4 Byte.Minimal-Beispiel, hat einige IO zu machen-Handler sichtbar.
Minimale protected-Modus
Moderne Betriebssysteme laufen in sogenannten geschützten Modus.
Den Umgang mit mehr-Optionen in diesem Modus, so ist es komplizierter, aber der Geist ist der gleiche.
Der entscheidende Schritt ist mit der LGDT und LIDT Anweisungen, die die Adresse einer in-memory-Daten-Struktur (Interrupt Descriptor Table) beschreibt, dass die Handler.
Minimal-Beispiel
Linux-Nutzung 0x80
Linux legt die interrupt-handler für
0x80
solche, die es implementiert system fordert, ein Weg für userland-Programme mit dem kernel zu kommunizieren.Können Sie nicht setzen Sie Ihre eigenen Handler direkt von userland, weil Sie nur ring 3 und Linux verhindert, dass Sie tun.
Hallo Welt " - Beispiel:
Kompilieren und ausführen mit:
Bessere alternativen
int 0x80
wurde abgelöst durch bessere alternativen:: erste
sysenter
, dann VDSO.x86_64 hat
syscall
.Siehe auch: Was ist besser "int 0x80" oder "syscall"?
InformationsquelleAutor der Antwort Ciro Santilli 包子露宪 六四事件 法轮功
Wie bereits erwähnt, es bewirkt, dass die Kontrolle, um zu springen, um interrupt-Vektor-0x80. In der Praxis, was das bedeutet (zumindest unter Linux) ist, dass ein system-call aufgerufen wird; die genaue system-Aufruf und Argumente definiert sind, durch den Inhalt der Register. Zum Beispiel, exit() kann aufgerufen werden, indem Sie Einstellung, %eax um 1, gefolgt von 'int 0x80'.
InformationsquelleAutor der Antwort Steve Smith
Den "int" - Befehl einen interrupt auslöst.
Was ist ein interrupt?
Einfache Antwort: Ein interrupt ist, einfach ausgedrückt, ist ein Ereignis, das unterbricht die CPU, und sagt, um eine Besondere Aufgabe.
Ausführliche Antwort:
Die CPU hat eine Tabelle der Interrupt-Service-Routinen (oder ISRs) werden im Speicher abgelegt. Real (16-bit) - Modus, dieser ist gespeichert, wie der IVT, oder ichnterrupt Vector Tkönnen. Die IVT liegt typischerweise bei
0x0000:0x0000
(physikalische Adresse0x00000
), und es ist eine Reihe von segment-offset-Adressen, die auf die ISRs. Das OS kann, ersetzen Sie die bereits vorhandenen IVT-Einträge mit eigenen ISRs.(Hinweis: Die IVT-Größe ist fest auf 1024 (0 x 400) bytes.
In der Geschützten (32-bit) - Modus, der die CPU nutzt einen IDT. Die IDT ist eine Struktur variabler Länge, die aus Deskriptoren (andernfalls bekannt als gates), die sagen die CPU über den interrupt-Handler. Der Aufbau dieser Deskriptoren ist viel komplexer als die IVT-ist einfach-segment-offset-Einträge; hier ist es:
*Der IDT werden können von variabler Größe sein, aber es muss fortlaufend sein, d.h. wenn Sie erklären IDT von 0x00, 0x50, müssen Sie haben jeder interrupt aus 0x00, 0x50. Der OS nicht unbedingt verwenden alle von Ihnen, so die Gegenwart bit erlaubt es der CPU, um richtig zu behandeln, bricht das OS nicht wollen, um zu behandeln.
Wenn ein interrupt Auftritt (entweder durch einen externen trigger (z.B. ein hardware-Gerät) in einen IRQ, oder durch die
int
Anweisung aus einem Programm), die CPU schiebt die EFLAGS, dann CS und dann EIP. (Diese werden automatisch wiederhergestelltiret
die interrupt return-Anweisung.) Das OS in der Regel speichert mehr Daten über den Zustand der Maschine, verarbeitet den interrupt ein, stellt die Maschine Stand, und fährt weiter.In vielen *NIX-Betriebssystemen (einschließlich Linux), system-calls sind-interrupt-basiert. Das Programm stellt die Argumente des Systemaufrufs in die Register (EAX, EBX, ECX, EDX, etc..), und fordert einen interrupt 0x80. Der kernel hat bereits die IDT enthalten einen interrupt-handler auf 0x80, die aufgerufen wird, wenn es erhält interrupt 0x80. Der kernel liest dann die Argumente und ruft eine Funktion im kernel entsprechend. Kann es speichern eine Rückkehr in EAX/EBX. System-Aufrufe sind weitgehend ersetzt worden durch die
sysenter
undsysexit
(odersyscall
undsysret
auf AMD -) Anleitungen, die es ermöglichen, schneller Einstieg in ring 0.Diese zu unterbrechen, könnte eine andere Bedeutung in einem anderen OS. Werden Sie sicher, überprüfen Sie deren Dokumentation.
InformationsquelleAutor der Antwort Adrian Zhang
Erzählt es die cpu zu aktivieren interrupt-Vektor 0x80, die auf Linux-Betriebssysteme ist die system-call-interrupt, verwendet zum aufrufen von Systemfunktionen wie
open()
für Dateien, et cetera.InformationsquelleAutor der Antwort Amber