Autor Thema: IDT/ISR Assembler Problem  (Gelesen 7431 mal)

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 18. July 2012, 09:21 »
Ihr Manual-Nachschlageservice informiert:
Zitat
The base addresses of the GDT should be aligned on an eight-byte boundary to yield the best processor performance.
Zitat
The base addresses of the IDT should be aligned on an 8-byte boundary to maximize performance of cache line fills.
Wie so oft auf x86 ist anständiges Alignment also nur eine Optimierung, nicht zwingend notwendig.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

üäpöol

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 29. July 2012, 17:23 »
Nach einem programmierfreien Urlaub habe ich es jetzt hinbekommen. Ich habe aber noch eine Frage:
Zitat
An dem Registerdump ist auffällig, dass fast alle Register 0 sind und der Wert in ESP nicht durch 4 teilbar ist. Die Adressen von GDT und IDT sind ebenfalls krumm. Beides tut der Performance nicht unbedingt gut.
Es geht mir ESP. Bei mir ist ESP nie durch 4 teilbar, was aber auch nicht verwunderlich ist, weil ich ESP nach dem Sprung in den PMode auf 0x1FFFFF gesetzt habe. Stimmt der Wert nicht oder sollte ESP trotzdem durch 4 teilbar sein?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 29. July 2012, 17:51 »
Das solltest du fixen, Misalignment kostet Performance. Dass du ihn nicht auf 0x200000 gesetzt hast, hat vermutlich eh mit einem Denkfehler zu tun.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

üäpöol

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 08. August 2012, 20:33 »
Ich hab noch ein Problem mit dem Ressourcen verschwenden :D .
_schlafen_Anzahl dd 0

PIT_initialieren:
mov dword [_schlafen_Anzahl], 0
push ax
push dx
mov dx, 0x43
mov ax, 0x36
out dx, ax
mov ax, 1193
and ax, 0xFF
mov dx, 0x40
out dx, ax
mov ax, 1193
shr ax, 8
out dx, ax
pop dx
pop ax
IRQ_Handler_setzen 0, _schlafen_Handler
ret

_schlafen:
call PIT_initialieren
push ebp
mov ebp, esp
push eax
_schlafen_Test:
mov eax, [ebp+8]
cmp eax, [_schlafen_Anzahl]
jg _schlafen_Test
mov dword [_schlafen_Anzahl], 0
pop eax
mov esp, ebp
pop ebp
ret 4

_schlafen_Handler:
inc dword [_schlafen_Anzahl]
ret

Es ändert sich leider nichts an der Häufigkeit mit der _schlafen_Handler aufgerufen wird. Es bleibt bei der Standarthäufigkeit. Es soll aber jede Millisekunde einmal aufgerufen werden, was eigentlich PIT_initialieren erledigen sollte.

@taljeth:
Was ist denn dieser Denkfehler?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 08. August 2012, 21:26 »
Meine Vermutung ist, dass das daran liegt, dass du Word-Zugriffe (out dx, ax) und nicht Byte-Zugriffe machst (out dx, al).
Dieser Text wird unter jedem Beitrag angezeigt.

üäpöol

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 08. August 2012, 22:21 »
Du hast wie immer Recht. :)

 

Einloggen