2016-04-06 6 views
-1

Int 0x80 ist ein Systemaufruf, es ist auch 128 in Hexa. Warum Kernel Int 0x80 als Interrupt verwenden und wenn ich Int x deklariere, weiß er, es ist nur eine ganze Zahl mit dem Namen x und umgekehrt.Wie Kernel kennen den Unterschied zwischen "Int 0x80" und "Int x"

+0

Sie über den Unterschied zwischen C verwirrt sind (in der 'int x;' deklariert eine ganzzahlige Variable mit dem Namen 'X' und '' int ist ein Syntaxfehler) und x86-Assembler (in denen 'int 'erzeugt Maschinencode für die INTerrupt-Anweisung und' int x; 'ist ein Syntaxfehler)? Sonst verstehe ich nicht, was du zu fragen versuchst. – zwol

+0

Lassen Sie mich versuchen, etwas klarer zu sein. Wie der Compiler (in c) den Unterschied zwischen der Definition einer Variablen x als Integer wie in einem Code "int x" und dem System_call-Interrupt "int 0x80" kennt? – Hooch

Antwort

6

Sie scheinen über den Unterschied zwischen C und Assemblersprache verwirrt zu sein. Beide sind Programmiersprachen, (heutzutage) akzeptieren beide die 0xNNNN Schreibweise für Zahlen in hexadezimal, und es gibt normalerweise eine Möglichkeit, kleine Schnipsel der Assemblersprache in ein C-Programm einzubetten, aber sie sind verschiedene Sprachen. Das Schlüsselwort int bedeutet in C etwas völlig anderes als in (x86) Assemblersprache.

Um einen C-Compiler, intimmer und nur bedeuten etwas Beteiligung eine ganze Zahl zu erklären, und es gibt keine Situation, wo Sie sofort int mit Zahlenliteral folgen können. int 0x80 (oder int 128 oder int 23 oder etwas anderes von der Art) in C. immer ein Syntaxfehler ist

Zu einem x86-Assembler, intimmer und nur bedeuten Maschinencode für den Interrupt-Befehl zu erzeugen, und ein einzelnes numerisches Literal muss sofort folgen. int x; ist immer ein Syntaxfehler in der x86-Assemblersprache.

Offensichtliche Folgefrage: Wenn ein C-Compiler int nicht als INTerrupt-Anweisung erkennt, wie macht ein C-Programm (kompiliert für x86) Systemaufrufe? Es gibt vier ergänzende Antworten auf diese Frage:

  1. Meistens führen Sie in einem C-Programm keine Systemaufrufe direkt aus. Stattdessen rufen Sie Funktionen in der C-Bibliothek auf, die das für Sie tun. Wie der C-Compiler weiß, unterscheidet sich open (zum Beispiel) bei der Verarbeitung Ihres Programms nicht von anderen externen Funktionen. So ist es nicht brauchen, um eine int Anweisung zu generieren. Es tut einfach call open.

  2. Aber die C-Bibliothek ist nur mehr C, die jemand anderes für Sie geschrieben hat, oder? Wenn Sie jedoch die Implementierung von open zerlegen, werden Sie tatsächlich eine int-Anweisung (oder vielleicht syscall oder sysenter statt) sehen. Wie haben die Leute, die die C-Bibliothek geschrieben haben, das getan? Sie schrieben, dass die Funktion in Assembler-Sprache, nicht in C. Oder sie verwendet diese Technik für Auszüge Assemblersprache in einem C-Programm einbetten, das bringt uns zu ...

  3. Wie funktioniert dass Arbeit? Bedeutet das nicht, dass der C-Compiler int als eine Assembler-Mnemonic manchmal verstehen muss? Nicht unbedingt. Lassen Sie uns montage diese an der GCC-Syntax aussehen könnte eine Implementierung von open für x86/32/Linux zum Einfügen sein:

    int open(const char *path, int flags, mode_t mode) 
    { 
        int ret; 
        asm ("int 0x80" 
         : "=a" (ret) 
         : "0" (SYS_open), "d" (path), "c" (flags), "D" (mode)); 
        if (ret >= 0) return ret; 
        return __set_errno(ret); 
    } 
    

    Sie brauchen nicht den Großteil, das zu verstehen: das Wichtigste ist für Zwecke dieser Frage ist, ja, es sagt int 0x80, aber es sagt es in einem String Literal.Der Compiler kopiert den Inhalt dieses String-Literals wörtlich in die erzeugte Assembler-Datei, die er dann dem Assembler zuführt. Es muss nicht wissen, was es bedeutet. Das ist die Aufgabe des Monteurs.

  4. Allgemein gibt es viele Wörter, die in C eine Sache und in der Assemblersprache eine ganz andere Sache bedeuten. Ein C-Compiler produziert Assemblersprache, so dass es beide Bedeutungen dieser Wörter "wissen" muss, richtig? Es tut es, aber es verwirrt sie nicht, weil sie immer in getrennten Kontexten verwendet werden. "add" ist eine Assembly-Mnemonic, die der C-Compiler zu verwenden weiß, bedeutet jedoch nicht, dass es Probleme bei der Benennung einer Variablen "add" in einem C-Programm gibt, selbst wenn die "add" -Anweisung in diesem Programm verwendet wird.