Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - SuperPlus

Seiten: [1]
1
Lowlevel-Coding / Re:Disabled Interrupts im User Mode
« am: 26. July 2011, 10:44 »
Hallo,

Zitat
Ich würde es übrigens einfach so machen:
orl $0x200, 8(%esp)
Danke für den Tipp. So habe ich es nun auch gemacht. Ich habe zwei Traps erstellt, einer löscht das IF und der andere setzt es wieder.
ENTRY(cli_call)
andl $0xFFFFFDFF, 8(%esp)
INTERRUPT_RETURN
END(cli_call)

ENTRY(sti_call)
orl $0x200, 8(%esp)
INTERRUPT_RETURN
END(sti_call)

Es scheint zu funktionieren. Zwischen den beiden Aufrufen ist jedenfalls das IF gelöscht und Linux reagiert nicht mehr. Allerdings tritt ein komischer Effekt in der Konsole auf. Diese produziert eine Menge Zeilenvorschübe.

Zitat
Ansonsten würde ich dir für Performancemessungen empfehlen, den betreffenden Usermodus-Task in der Priorität zu erhöhen
Bis jetzt habe ich das auch so gemacht. Ich habe dem Prozess einfach die höchste Priorität (99) gegeben und den Scheduler auf FIFO umgestellt. Um so länger der zu testende Code, um größer ist dann aber auch die Wahrscheinlichkeit, dass ein Interrupt auftritt. Ich möchte einfach sehen, wie groß der Unterschied zwischen den beiden Messmethoden ist.

Zitat
Ich würde auch sehr gern RTFM machen, aber dazu müsste ich halt wissen, wo nachschauen. Kapitelangabe oder so wäre hilfreich.
Im Intel Manual wird auf Kapitel "17.4 PROTECTED-MODE VIRTUAL INTERRUPTS" verwiesen. Aber wie gesagt, ich glaube es ist die Aufgabe des Interrupt Handler das VIF zu überprüfen.

Dank für eure Hilfe.
2
Lowlevel-Coding / Re:Disabled Interrupts im User Mode
« am: 25. July 2011, 17:09 »
Zitat
bei einem Interrupt wird der Status des Interuptflags auf dem Stack gesichert und am Ende wiederhergestellt.

Aha. Habe gerade noch mal ins Manual geguckt. Nach dem Sprung in den Interrupt Handler sieht das Stack Layout folgendermaßen aus:
EFLAGS
CS
EIP
Error Code
Ich habe nicht sehr viel Übung in Assembler. Wenn ich nun die EFLAGS ändern möchte würde ich das folgendermaßen machen:
pop eax ; EIP
pop ebx ; CS
pop ecx ; EFLAGS
or 0x20, eax ; setze IF
push ecx
push ebx
push eax
Könnte das so funktionieren?

Ich denke ich werden den Kernel mogen kompilieren und das mal testen.

Zitat
Reicht für cli/sti nicht iopl() auf Ring 3?
Nein, dadurch wird nur das virtuelle IF gelöscht und das hat bei mir nicht funktioniert. Unter einem Echtzeitlinux wie RTAI oder Xenomai könnte das aber vielleicht funktionieren. Dies wäre mein nächster Versuch.
3
Lowlevel-Coding / Re:Disabled Interrupts im User Mode
« am: 25. July 2011, 16:36 »
Ich habe den Quellcode geändert und einen neuen Descriptor erstellt. Es ist so etwas wie ein eigener System Call.

Ich bin mir ziemlich sicher, dass der Code aufgerufen wird. Führe ich den Befehl "int 0xe7" bei einem normalen Linux aus, bekomme ich ein "Segmantaion Fault".
4
Lowlevel-Coding / Re:Disabled Interrupts im User Mode
« am: 25. July 2011, 16:22 »
Danke für die schnelle Antwort.

Wenn ich einen Software Interrupt auslöse, dann bin ich doch im Kernel Mode. Dort lösche ich das IF und springe sofort wieder zurück in den User Mode. Dann müssten doch eigentlich die Interrupts deaktiviert sein.
5
Lowlevel-Coding / Disabled Interrupts im User Mode
« am: 25. July 2011, 16:14 »
Hallo,

ich möchte Performancemessungen unter Linux im User Mode machen. Optimal wäre es, wenn während dieser Messungen die Interrupts ausgeschaltet wären. Dafür habe ich einen Trap Gate eingefügt.

ENTRY(cli_call)
     cli
     iret
END(cli_call)

Um in den Code zu springen verwende ich im User Mode den Befehl
int 0xe7

Die Interrupts sind aber immer noch aktiviert. Wird das Interrupt Flag beim Rücksprung automatisch gesetzt oder legt der Fehler in meinem Code?

Ich habe schon versucht die Interrupts mit dem VIF Flag zu deaktivieren. Dies hat aber auch nicht funktioniert. Wenn ich das Intel Manual richtig verstanden habe, ist der Interrupt Handler dafür zuständig das VIF Flag zu überprüfen und ich vermute Linux überprüft dieses Flag nicht.

Gibt es eine Möglichkeit im User Mode mit deaktivierten Interrupts zu arbeiten?

Grüße
SuperPlus
Seiten: [1]

Einloggen