Wie kann ich Software-Interrupt in C programmieren? Ich weiß, dass ich eine Interrupt-Wartungsroutine schreiben und dann die CPU unterbrechen muss, damit die Routine aufgerufen werden kann, aber ich weiß nicht, wie ich das in C machen soll. Außerdem weiß ich nicht, wie ich diese Routine mit Interrupt-Deskriptor registrieren soll Tabelle. Ich habe eine x86-64 CPU (AMD Turion64 X2) und ich benutze GCC-Compiler. Jede Hilfe wäre willkommen.Software-Interrupt
Antwort
Verwenden Sie sigaction
. Siehe man 2 sigaction
.
Um den Interrupt zu verursachen, verwenden Sie raise
oder kill
.
Ich denke nicht, dass dies genau das ist, was OP fragt. –
Das macht die Arbeit nicht, es macht keinen echten Interrupt. Falls ich unklar war, sollte ich die CPU unterbrechen, nicht die Anwendung. – protector
Das Betriebssystem blendet echte Interrupts von Anwendungen aus. Soweit ich weiß ist es nicht möglich, es sei denn, Sie laufen in der Kernel-Ebene (Ring 0?)
Das Konzept der Interrupts ist nicht in der C-Spezifikation enthalten (und ist auch etwas prozessorspezifisch). Bei den meisten Compilern, einschließlich GCC, können Sie Inline-Assemblercode schreiben (oder Sie können natürlich eine Datei, die in Assembly geschrieben wurde, mit Ihrem Programm verknüpfen). Das große Problem ist jedoch, dass gängige Betriebssysteme (insbesondere solche im 64-Bit-Modus) die Interrupt-Tabelle nicht ändern können. Ich denke, Ihre beste Wette ist, nach einem einfachen Open-Source-Betriebssystem zu suchen und entweder Ihren Interrupt-Handler von einem normalen Programm zu installieren (wenn das Betriebssystem es erlaubt) oder Ihren Code dem Kernel hinzuzufügen. Der Grund, warum Sie nicht einfach einen kleinen Code in einem Prozessor-Simulator (oder einer virtuellen Maschine) ausführen können, ist, dass der Prozessor einiges an Setup benötigt, um in den 64-Bit-Modus zu gelangen. Und die genauen Details darüber, wie Sie die Interrupt-Tabelle ändern, hängen von dieser Konfiguration ab.
schreiben ISR ist keine Frage der Sprache. Ja, Sie können es in C.
Es ist eine Frage des Verständnisses Ihres Betriebssystemkerns, über Routinen, die aufgerufen werden, um Ihre ISR auf einer bestimmten Interrupt-Leitung mit GIC oder anderen Interrupt-Controllern zu registrieren und einen Eintrag in Interrupt Descriptor Tabelle . Wie bei Linux auf ARM .. Seine request_irq(), um eine ISR mit IRQ-Contoller zu registrieren und einen Eintrag in IRQ_DESC Tabelle.
So wird vorschlagen, zuerst ISR-Framework Ihres jeweiligen Betriebssystems zu überprüfen.
Die Dinge, die Sie zu tun haben, sind Dinge, die Sie tun, wenn Sie ein Betriebssystem schreiben, keine Anwendung. Könntest du ein bisschen mehr darüber erzählen, was du erreichen willst? –
Eigentlich arbeite ich an einer Aufgabe für meine Fakultät, ich muss IRET-Anweisung untersuchen, deshalb brauche ich eine Interrupt-Wartungsroutine. Nachdem ich es geschrieben habe, soll ich mit dem Hex-Code der ausführbaren Datei "spielen" und den IRET ändern (lösche ihn oder so), um zu sehen, was passiert. – protector
Sie können keine ISRs in C schreiben, es erfordert (einige) Assembly. Sie können ISRs nicht auf einem Betriebssystem im geschützten Modus testen. Das Ändern des IRET wird nur den Code zum Absturz bringen. Sprechen Sie mit Ihrem Lehrer über diese Aufgabe. –