Spinlock
-
[quote="net"]
spinne schrieb:
welcher interrupt ist das denn?
einer von dem eingebauten timer chip.
[quote="spinne"]kann ich den wirklich disablen in einem asm programm!? kommt mir ja recht unsicher vor!! wenn ja finde nicht wirklich viele infos welcher irq das ist...
-
spinne schrieb:
kann ich den wirklich disablen in einem asm programm!? kommt mir ja recht unsicher vor!! wenn ja finde nicht wirklich viele infos welcher irq das ist...
guckst du: http://users.skynet.be/lpjjl/pgm/fichiers/docasm/RTC.txt
die richtigen bits in den richtigen registern setzen/löschen und schon ist der scheduler eingefroren
-
net schrieb:
spinne schrieb:
kann ich den wirklich disablen in einem asm programm!? kommt mir ja recht unsicher vor!! wenn ja finde nicht wirklich viele infos welcher irq das ist...
guckst du: http://users.skynet.be/lpjjl/pgm/fichiers/docasm/RTC.txt
die richtigen bits in den richtigen registern setzen/löschen und schon ist der scheduler eingefroren
oh danke!
ich dachte in kann ueber windows nicht direkt hardware ansteuern...hm
ist das so ein standardchip der auf jedem motherboard zu finden ist?
-
spinne schrieb:
ich dachte in kann ueber windows nicht direkt hardware ansteuern...hm
mit tricks: http://www.osronline.com/showThread.cfm?link=1014
spinne schrieb:
ist das so ein standardchip der auf jedem motherboard zu finden ist?
eigentlich schon...
-
oh danke!
ich dachte in kann ueber windows nicht direkt hardware ansteuern...hm
ist das so ein standardchip der auf jedem motherboard zu finden ist?Du dachtest richtig. Versuch das, und unter NT/XP/... wird bloss dein Programm mit einem Fehler beendet werden. In einem Treiber kannst du das machen, bzw. wenn die entsprechenden Flags in der IO permission bitmap gesetzt sind. Bloss... ich würde mich nicht darauf verlassen dass diese Chips immer gleich zu programmieren sind - zumindest nichtmehr ab dem Zeitpunkt wo Windows läuft. Gerade die neuen ACPI Kernels (XP, 2003 Server) programmieren da einiges um, und dazu muss man die ACPI BIOS "Funktionen" verwenden - und dazu wiederum ne ACPI-VM implementieren.
--
Ich kenne nur eine Möglichkeit den Scheduler "anzuhalten" (also zumindest den aktiven Thread auf einer CPU/einem Core zu "schützen" -- auf den anderen CPUs/Cores läuft der Scheduler nach wie vor), und das ist den IRQL auf >= DISPATCH_LEVEL zu schalten. Das macht z.B. jede kernel-mode spinlock. Bzw. händisch mit KeRaiseIrql(). Kannst du aber auch nur im kernel-mode verwenden, z.B. in einem Treiber.
Für normale Usermode Programme sollte es aber ausreichen den Prozess auf REALTIME_PRIORITY_CLASS zu setzen - damit wirst du effektiv von kaum irgendwasmehr unterbrochen. Von Interrupts natürlich immer noch, aber nichtmehr von anderen Programmen, es sei denn die laufen auch auf REALTIME_PRIORITY_CLASS und verwenden ne höhere (nicht gleiche!) Thread Priorität.
welcher interrupt ist das denn?
Ich würde mich nicht darauf verlassen dass es ein bestimmter Interrupt ist.
naja wenn ich das fuer eine ganz kurze zeit mache, paar asm zeilen!?
...es gibt ja 2 scheduler: einen auf user ebene und einen auf kernel ebene? damit meine ich den scheduler der zwischen den processen umschaltet und den der zwischen den threads in einem process umschaltet...oder gibt es global nur threads und einen scheduler?Es gibt bloss einen Scheduler.
----
Wozu willst du das denn überhaupt?
-
ziel ist es einen zeitkritischen code moeglichst in realtime auszufuehren!
ich will windows ist da nicht gerade ein real time system:)
und wie du ja weisst kann mein zeitkritischer teil ja von einem anderen thread unterbrochen werden, und dann kann man keine aussage mehr treffen wie lange die ausfuehrungszeit des zeitkritischen codes ist....
deshalb war die idee da den scheduler fuer eine kurze zeit zu blocken...
-
Naja, ohne weiter zu wissen um *was* für eine Art Code es dabei geht, und daher ohne abschätzen zu können wie zeitkritisch der nun wirklich ist, sehe ich 3 Möglichkeiten:
- Nicht Windows nehmen
- Das ganze in einen Treiber packen, und KeRaiseIrql(SYNCH_LEVEL) (oder HIGH_LEVEL) + KeLowerIrql() drumrum packen
- Einfach im Usermode REALTIME_PRIORITY_CLASS + höchste Thread Priorität verwenden und hoffen dass es reicht
Und nochwas: den SMI kannst du sowieso nicht ausschalten - bzw. nicht auf "hardware unabhängigen" Weg. Und solltest du auch nicht, sonst kanns sein dass irgendwas auf einmal nichtmehr so geht wie es sollte

-
kann man einen treiber aus einer normalen win32 applikation starten?
was heisst KeRaiseIrql(SYNCH_LEVEL) (oder HIGH_LEVEL) + KeLowerIrql drumrum packen?
-
Nochmals zur ursprünglichen Fragen:
Ein Spinlock in Win32 (User-Mode) wird mit InitializeCriticalSectionAndSpinCount erstellt.
Und ja: Es ist eine Critical-Section die wartet ohne den Prozessor abzugeben... macht somit auch nur auf Multi-Prozessor-Systemen Sinn.
-
wie waere es mit sowas:
In contrast to RTX, INtime from TenAsys runs both the real-time applications
and the non real-time applications in user-mode. There is still the
possibility to write a real-time application as a driver, which will run in
kernel-mode[16, 28]. Running applications in user-mode protects the system
from crashing because of programming errors such as null pointers, and page
faults. However, applications still have the ability to gain direct access to
physical memory if that is deemed necessary by the developer[28].
INtime installs a number of components in Windows. The most important
includes a Windows kernel driver and a Windows service. The kernel
driver manages communication between the INtime and the Windows environment.
The service handles the actual loading of the INtime kernel into
the system. A context switch then occurs to make the system go into the
INtime kernel. In this state all real-time activity is handled before any Windows
activity. XP eectively becomes the idle-task of the INtime kernel.
When running in the INtime kernel, all Windows interrupts are masked. A
real-time interrupt (both software and hardware) is handled directly. Thanks
to monitoring of the HAL, Windows kernel is unable to mask real-time interrupts.
This means that even badly designed device drivers, masking interrupts
running in the Windows kernel, cannot aect the performance of
the real-time kernel[28]quelle: http://www.idt.mdh.se/utbildning/exjobb/files/TR0470.pdf
zahlt sich aber nicht wirklich aus einen eigenen realtime kernel zu entwickeln:)
-
spinne schrieb:
kann man einen treiber aus einer normalen win32 applikation starten?
was heisst KeRaiseIrql(SYNCH_LEVEL) (oder HIGH_LEVEL) + KeLowerIrql drumrum packen?
-
Du kannst einen Treiber aus einer normalen Win32 Applikation Installieren, starten und ansprechen (DeviceIoControl, ReadFile, WriteFile, ...). Zum Installieren braucht man aber auf jeden Fall Admin Rechte.
-
Das heisst:
KIRQL oldIrql; KeRaiseIrql(SYNCH_LEVEL, &oldIrql); MachWas(); KeLowerIrql(oldIrql);Geht aber wie gesagt nur in einem Treiber. Der "IRQL" ist im Übrigen der "Interrupt Request Level" -- kein Interrupt der nicht einen höheren als den aktuellen IRQL hat kann auf dem aktuellen Prozessor (Hardware Thread) ausgeführt werden. Setzt mal also den IRQL hoch verbietet man quasi Interrupts.
-
-
Ich rate dringend von ab, denke aber sowieso, dass das nur auf Kernel-Ebene möglich ist. Das heißt, du musst einen Treiber schreiben und laden... vielleicht solltest du lieber ein Echtzeitsystem benutzen, anstatt Windows zu verpfuschen. :xmas1:
-
ich hab' mal vor langer zeit zum spass den timer beschleunigt. windowz schien rein gefühlsmässig etwas schneller zu laufen (was natürlich nicht so ist - je mehr rechenzeit der scheduler kriegt, desto weniger bleibt für die threads), das caret blinkte mit der doppelten frequenz, das fenstersystem lief flüssiger usw. hätt' ich das mal als ultimativen win beschleuniger aus fernost verkaufen sollen (mit toller verpackung und so). die ganzen great game coder und ähnliche windows-fans hätten mich reich gemacht

-
@net: willst du uns deinen trick nicht zeigen?
-
spinne schrieb:
@net: willst du uns deinen trick nicht zeigen?
na, hab's doch schon beschrieben wie's geht.
den timer in der RTC manipulieren, so dass der schneller läuft...
-
Wenn Du das Scheduling schneller machen willst musst Du nur "timeBeginPeriod(1)" aufrufen.
Wenn Du die Uhrzeit schneller/langsamer laufen lassen willst musst Du nur "SetSystemTimeAdjustment" aufrufen.
-
wie viele timer hat eigentlich ein motherboard?