Sorry für mein langes Delay, ich hab zur Zeit ne Menge privater Probleme.
Kein Problem, bin eh im "Urlaub" und private Probleme gehen eh vor!
Ich denke das Du selbst auf den aktuellsten PCs nicht genauer als etwa in den einstelligen Mikrosekundenbereich kommst. Und mit dem ACPI-PMT schon gar nicht, der hat doch nur 3.58 MHz.
Naja, wie gesagt ich meine damit, das ich z.B. wenn ein Event in 1µs gefeuert werden soll, das du das dann halt nicht nach 2µs sondern so nahe wie möglich an 1µs bekommst. Mir geht es im Endeffekt um die "Nachkommastellen". Das ich also schon nach 1,15µs (was dann für mich nsek-Auflösung wäre) und nicht erst nach 2µs das Event bekomme. Das du das auf älteren Systemen nicht hinbekommst ist mir klar, alleine schon weil die CPUs ja doch ne Weile brauchen um die Instruktionen abzuarbeiten.
Um es nochmal ganz genau zu sagen, mir gefällt der Gedanke nicht, das du ein Event nach 15ms haben möchtest, dieses aber frühestens nach 20ms bis zu 40ms später bekommst (wenn du nen periodischen Timer von 20ms nutzt).
Wenn mein worst-case dann mal 0,25ms daneben liegt, denke ich habe ich mein Ziel mehr oder weniger erreicht. Denn der average-case wird wesentlich genauer sein!
Ich denke das Du selbst auf den aktuellsten PCs nicht genauer als etwa in den einstelligen Mikrosekundenbereich kommst. Und mit dem ACPI-PMT schon gar nicht, der hat doch nur 3.58 MHz.
Ich glaube ich habe irgendwo µs und ms durcheinander gebracht, wenn ich auf nem PII mit nem ACPI-PMT µs-Auflösung bekomme, dann ist das doch schon verdammt gut und Welten besser als Windows
Genau das meinte ich mit unnötigem Aufwand. Wenn Du innerhalb des Kernels gar nichts umrechnest sondern immer direkt mit Ticks arbeitest sparst Du Dir erheblichen (Rechen-)Aufwand (so ein DIV-Befehl kann auf verschiedene Arten Exceptions auslösen und die könnten innerhalb Deines Kernels unangenehm sein und eventuell zu einem Tripple-Fault führen). Und wie man eine Division mit überbreiten Zahlen realisiert ist IMHO Aufgabe des Compilers (der Deine libc compiliert).
Also nochmal. Ich nutze mehrere Zeitquellen mit unterschiedlichen Ticks, also muss ich so oder so irgendwo umrechnen und um mir und dem Programmier/in das Leben etwas leichter zu machen, sage ich, dass ich gleich nsek zurückgebe.
Das mit den Exceptions dürfte nicht passieren (mir fällt da spontan eh nur die 0-Teiler-Exception ein).
Was die Division großer Zahlen betrifft, setzt du vorraus das ich ne libc habe (nutze ich nicht für meinen Loader und auch nicht für meinen Kernel). Ich habe bisher alles mehr oder weniger alleine geschrieben. Das ich nachher eine Libc für das Userland portieren werde ist klar. Obwohl ich mit der Lösung nicht so richtig glücklich bin und wahrscheinlich eher alles OS-Unabhängige "portieren" werde und den Rest mehr oder weniger neuschreiben werde.
Denn was nützt dir ein tolles OS mit neuen Ideen, wenn du dann bei der Libc schon ne Art Emulierungsschich hast.
Das, mit der PC-Serie wo die CPU mit gedrosselter Kraft vom BIOS ans OS übergeben wurde, war vor etwa 8 Jahren. Das war ein Pentium 4 System und die haben absichtlich ein möglichst schwaches Kühlungssystem verbaut (an jedem PC 5 Euronen gespart macht sich bei >= fünfstelligen Stückzahlen durchaus bemerkbar) und eben fürs Hochfahren die CPU gedrosselt bevor dann bei laufendem OS ein extra Programm den CPU-Takt je nach Last und Temperatur geregelt hat.
Also für mich eh nicht interessant, da ich auf diesen PCs keinen TSC nutze!
Wenn der Scheduler auch nur mit dem selben PIT arbeitet dann hast Du doch keinen Genauigkeitsgewinn. Den könntest Du theoretisch haben wenn Du zusätzlich zum periodischen IRQ einen weiteren PIT-Zähler (der PIT hat doch 3 Zähler oder irre ich da) als One-Shot-Timer aufziehst. Bei Verwendung des Local-APIC-Timers hast Du natürlich auch die theoretische Möglichkeit auf einen Genauigkeitsgewinn. Diesen Gewinn erkaufst Du Dir aber in jedem Fall mit einiges an Mathematik im Kernel.
Ihr versteht meine Kombinationen leider immernoch nicht
Also, entweder man hat nen alten PC ohne APIC, dann wird die RTC als periodische Quelle und der PIT für den One-Shot-Scheduler (eher sehr ungenau) genommen.
Hast du nen PC mit APIC (was SMP-Systeme mit einschließt) dann wird der PIT als periodische Quelle und der APIC für den One-Shot-Scheduler genommen.
Wenn ich dann mal soweit bin, dann wird der HPET als periodische Quelle und der APIC für den One-Shot-Scheduler genommen (wo ich dann auch die Events nicht mehr an den Scheduler weiterreichen brauche).
Wo ist der HPET langsam? Der benutzt immerhin Memory-Mapped-I/O und sollte sich daher sehr einfach und effizient benutzen lassen. Für (Performance-)Messungen sehr kurzer Zeitspannen ist der HPET auch nie gedacht gewesen.
Ich kann dir leider nicht sagen, worum es bei dem Code ging, den ich da mal gesehen hatte. Ich vermute mal um nen Counter (hochpräzise) und wenn du da jedesmal den HPET auslesen musst, dann ist der TSC einfach schneller und dein Counter somit genauer!
Mein Projekt ist auch Hobby aber bis an mein Lebensende möchte ich daran wirklich nicht arbeiten. In spätestens 5 bis 7 Jahren möchte ich auf meinem komplett selbst entwickeltem Computer das absolute Lieblings-Spiel meiner Jugend spielen können. (ich verzichte hier absichtlich auf Smilies)
Sorry, aber wer sich nicht im Klaren ist, dass ein OS nie fertig ist, der hat etwas nicht verstanden
Ich weiß jetzt schon, das ich entweder mein OS nach 64bit portiere oder aber ein neues schreibe und meine (guten) Ideen und meine Erfahrungen mitnehme.
Das dürfte etwa 100 bis 1000 Takte (bei richtig vielen CPUs und entsprechendem Cache-Kohärenz-Protokoll-Aufwand wohl noch mehr) Differenz ergeben. Naja, wenn Du meinst das sich dieser Aufwand lohnt dann nur zu.
Der Punkt geht an dich
Problem ist hier nur, dass ich das im Kernel machen muss. Wenn ich es mir gerade so recht überlege, ist das ganze aber eigentlich nicht notwendig, weil ...
Wenn ich ein altes SMP-System ohne ACPI habe, gehe ich jetzt mal frech davon aus, das die TSCs (von irgendwelchen Stromsparmaßnahmen mal abgesehen, da ich eh nicht glaube das es sowas auf solchen System gab und ich noch nichts gefunden habe, das der TSC dort Probleme macht) synchron sind und funktionieren.
Auf nem neuem System wo ICH den TSC dann wieder nutze, sind die eh synchron und funktionieren (das wird ja dort "garantiert", nach dem sich MS und "Linux" darüber beschwert hatten).
Also bräuchte ich diese Synchronisation eigentlich nicht mehr und könnte den Code auskommentieren.
Ich wusste gar nicht das die TSCs beschreibbar sind, wozu auch, die driften doch eh wieder auseinander (spätestens wenn das Powermanagement die unterschiedlichen CPUs in unterschiedliche Power-Modi schickt).
Gegenfrage, wenn die nicht schreibbar wären, wie soll die AMD dann per Treiber synchronisieren können?
Und wie oben schon geschrieben, passiert das ganz auseinanderdriften auf neueren CPUs halt nicht mehr! Ich gehe jetzt auch davon aus, das es auf Multi-Sockel-Systemen auf diesen CPUs auch alles funktioniert.
Energie kostet Geld, wenn Dein OS damit nicht verantwortungsbewusst umgehen kann hat es grundsätzlich keine echte Chance.
Ich gehe hier jetzt mal von einer privaten Nutzung aus und da macht der Standbybetrieb bei einem Desktop-Rechner für mich einfach keinen Sinn! Ich mach meinen Rechner dann einfach aus!
Zumal ich ja z.B. aus Energietechnischer Sicht keine periodische Zeitquelle mit einem Intervall von 1ms nutzen möchte
Selbst mit Gleitkommazahlen kannst Du nicht jede CPU-Takt-Frequenz exakt darstellen aber wenn Du Dich auf Pikosekunden in Integer festlegst hast Du für die heutigen CPUs nur maximal 8 signifikante Bits und das ist schon sehr knapp bemessen, dann lieber gleich Femtosekunden. Wink Außerdem haben die Gleitkommazahlen einen zusätzlichen Vorteil, man kann recht schnell mit ihnen rechnen (heutige FPUs sind ziemlich fix und besser als ne händische "64Bit / 64Bit = 64Bit" Division auf ner 32Bit-CPU ist die FPU alle mal).
Diese Division findet einmal statt und zwar in meinem Bootloader. Selbst wenn die noch so langsam ist, dürfte das wohl kaum auffallen!
Es gibt da irgendwo so ne Regel das man keine FPU im Kernel nutzt und das halte ich genauso! Macht mir nur die Arbeit schwerer und ich komme bisher ohne ganz gut klar!
Dann nimm ne andere Plattform. Windows (zumindest in aktueller Version) dürfte x86 schon recht gut ausreizen, die haben ein ganzes Team an Vollzeit-Programmierern nur allein für den Kernel. Wenn Du dieses Ziel wirklich erreichen willst dann überlege Dir mal ob Du nicht z.B. bei mir mitmachen möchtest. Wink Zumindest "genaueres Timing als Windows" dürfte ein einigermaßen realistisches Ziel in meinem Projekt sein. Und kreative Leute die nicht immer nur in aus getrampelten Bahnen denken dürften in vielen Projekten sehr willkommen sein.
Kommt drauf an welche Windows-Version du meinst
Ich weiß gar nicht ob die inzwischen auch nen One-Shot-Scheduler haben.
Ich müsste mal nachgucken, wie lange so eine Division braucht, aber so lange sollte das nun auch wieder nicht dauern!