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 - Jidder

Seiten: [1] 2 3 ... 81
1
Lowlevel-Coding / Antw:Ein Spiel im Boot-Sektor
« am: 10. June 2021, 07:48 »
Was Svenska geschrieben hat, ist korrekt, aber ich will trotzdem meinen Senf dazu geben, der Spekulation meinerseits ist. In den 80ern war denen Ingenieuren vermutlich egal, was in CS oder IP steht. Hauptsache MS DOS läuft. Der Bootsektor muss an die Adresse 0x07C00 geladen werden und DOS macht den Rest. Die Entwickler diverser PC-Klone haben beim Klonen des BIOS von IBM vielleicht gemerkt, dass es egal ist, was in CS oder IP steht, solange die Rechnung, die Svenska beschrieben hat, aufgeht, weil DOS damit klar kommt. Vielleicht haben die auch eine Münze geworfen oder Option 2 gewählt, um behaupten zu können: "Wir haben andere Werte in CS oder IP als IBM. Verklagt uns nicht.". Oder auch nicht.

Meine Behauptung ist also, dass es keine Dokumentation gibt, weil es keinen Masterplan gibt.
2
Das Wiki / Antw:Links im Wiki
« am: 26. February 2021, 18:44 »
Willkommen Yaya!

Du meinst den Crosscompiler für Windows, oder? Beim letzten Serverumzug habe ich diese Daten nicht mitgenommen. Es gibt leider auch keine Backups.

Ich kann nur empfehlen selbst einen Crosscompiler zu bauen. Wir haben dazu eine Anleitung im Wiki. Inzwischen gibt es auch neben Cygwin und MinGW noch die Option das Linux-Subsystem für Windows (WSL) zu nutzen, was das ganze nochmal einfacher machen sollte, weil man dann im Prinzip ein Ubuntu hat. Anleitung für die Installation von WSL gibt es im zuhauf im Internet.

Edit (02.04.2022): Ich habe ein Backup gefunden und hochgeladen. Der Link sollte wieder funktioneren.
3
Lowlevel-Coding / Antw:Bochs-Timing
« am: 13. March 2019, 00:30 »
Du kannst mal versuchen bei clock verschiedene Dinge einzustellen. clock: sync=realtime klingt so als ob es dir helfen könnte
4
Softwareentwicklung / Re: Quadratwurzel schnell berechnen
« am: 18. February 2017, 21:55 »
Ich hätte da auch noch einen Vorschlag (für Fehler < 10%):

if (x >= 2875143395) return 58982;
if (x >= 1924682769) return 48258;
if (x >= 1288424002) return 39484;
if (x >= 862498712) return 32305;
if (x >= 577375171) return 26431;
if (x >= 386507345) return 21625;
if (x >= 258736322) return 17693;
if (x >= 173203653) return 14476;
if (x >= 115946247) return 11844;
if (x >= 77616909) return 9691;
if (x >= 51958427) return 7929;
if (x >= 34782087) return 6487;
if (x >= 23283876) return 5307;
if (x >= 15586727) return 4342;
if (x >= 10434090) return 3553;
if (x >= 6984804) return 2907;
if (x >= 4675778) return 2378;
if (x >= 3130066) return 1946;
if (x >= 2095333) return 1592;
if (x >= 1402661) return 1302;
if (x >= 938971) return 1065;
if (x >= 628567) return 872;
if (x >= 420776) return 713;
if (x >= 281677) return 583;
if (x >= 188560) return 477;
if (x >= 126226) return 390;
if (x >= 84498) return 319;
if (x >= 56565) return 261;
if (x >= 37866) return 214;
if (x >= 25348) return 175;
if (x >= 16968) return 143;
if (x >= 11359) return 117;
if (x >= 7604) return 95;
if (x >= 5090) return 78;
if (x >= 3407) return 64;
if (x >= 2281) return 52;
if (x >= 1527) return 42;
if (x >= 1022) return 35;
if (x >= 684) return 28;
if (x >= 458) return 23;
if (x >= 306) return 19;
if (x >= 205) return 15;
if (x >= 137) return 12;
if (x >= 91) return 10;
if (x >= 61) return 8;
if (x >= 41) return 7;
if (x >= 27) return 5;
if (x >= 18) return 4;
if (x >= 12) return 3;
if (x >= 8) return 3;
if (x >= 5) return 2;
if (x >= 3) return 2;
if (x >= 2) return 1;
if (x >= 1) return 1;
if (x >= 1) return 1;
if (x >= 0) return 0;

Der Fehler für x unter 1000 ist zwar teilweise größer als 10% und da sind redundante if-Abfragen drin. Das liegt vermutlich am Algorithmus, mit dem ich den Code generiert habe. Allerdings sind das auch weniger als 0,00001% des Definitionsbereichs [0, 2^31-1].

Mit diesem Programm habe ich den Code erzeugt:
static void Main(string[] args)
        {
            double U = 0xffffffff;
            double L = 0;
            double root;
            double p = 0.10;

            while (U > 1)
            {
                root = Math.Sqrt(U) * (1 - p);
                L = U * ((1 - p) * (1 - p)) / ((1 + p) * (1 + p));
                //Console.WriteLine("{0} - {1} = {2}", L, U - 1, root);
                Console.WriteLine("if (x >= {0}) return {2};", (uint)L, (uint)U - 1, (uint)root);
                U = L;
            }
           
            Console.ReadKey();
        }

5
Das erste was mir auffällt, ist dass du die Interrupts nirgendwo aktivierst. Bevor du in kmain in die Endlosschleife gehst, solltest du das mit asm volatile("sti"); tun.
6
Eine Frage: Wie schaffe ich es, dass qemu sich nicht schließt nachdem er crashed?
Das sollte gehen, wenn du beim Aufruf in der Kommandozeile -no-reboot -no-shutdown übergibst.
7
Softwareentwicklung / Re: GCC für OS compilieren
« am: 11. July 2015, 04:46 »
Die Änderungen, die du am GCC vorgenommen hast, um Unterstützung für dein OS einzubauen, sind sicherlich ein Faktor. Hast du zufällig ein git-Repository oder ähnliches, wo jemand mit Ahnung davon (=nicht ich) deine Änderungen einsehen könnte?
8
Eins vorweg: Ich habe nie was mit ARM/Raspberry PI am Hut gehabt.

Ein Betriebssystem steigert nie die Leistungsfähigkeit (bezüglich der Nettoleistung des Systems), sondern im Gegenteil verringert diese. Warum? Weil das Betriebssystem (jetzt mal ganz weit gefasst) zwei Aufgaben hat: Verwaltung von Ressourcen und Zuteilung von Ressourcen an Anwendungen. Ressourcen sind CPU-Zeit, Arbeitsspeicher, Festplattenspeicher, Netzwerkkapazität, Anzeigeplatz auf dem Bildschirm, etc... Der damit verbundene Aufwand verringert die theoretisch mögliche Leistung des Systems um X Prozent, bezüglich Anteil der CPU-Instruktionen, die tatsächlich Daten verarbeiten und nicht nur verwalten, bezüglich Arbeitsspeicher oder Festplattenspeicher, in dem tatsächlich Daten und nicht nur Verwaltungsinformationen stehen, usw.

Warum haben wir also Betriebssysteme? Die Verwaltung der Ressourcen muss irgendwo erfolgen, ansonsten herrscht Chaos im Computer. In vielen Betriebssystemkonzepten ist es selbstverständlich, dass der Kernel (oder ein privilegiertes Modul) zum Beispiel das Dateisystem verwaltet. Würden das die Anwendungen machen, hast du das Problem, dass diese den Zugriff auf das Dateisystem nicht koordinieren und eventuell gegenseitig Daten überschreiben. Das Betriebssystem dient deswegen als Anlaufstelle für alle Anwendungen, und sorgt dafür, dass Dateioperationen nach einem bestimmten Schema durchgeführt werden. Dieses ist für alle Anwendungen gleich und garantiert denen, dass diese Operationen wie erwartet durchgeführt werden oder bei Konflikten entsprechend Rückmeldung gegeben wird.

Das Problem, was ein Betriebssystem also löst, ist eine Balance zu finden zwischen der Umsetzung der Anforderungen mehrerer Anwendung an (ich nenn es mal) Stabilität/Vorhersagbarkeit und dem Verwaltungsaufwand den das Betriebssystem dadurch verursacht.

Der Ansatz der sich daraus ergibt, ist dann natürlich, wenn man weniger Overhead haben will, die Dienstleistungen, die das Betriebssystem gegenüber den Anwendungen bereitstellt, zurückzuschrauben, damit mehr CPU-Zeit, Arbeitsspeicher, etc. für die Anwendung zur Verfügung steht.

Die Frage ist jetzt: Wieviel Prozent kann man da rausholen? Wenn ich in Windows den Ressourcenmonitor anwerfe, sehe ich genau, wieviel CPU-Zeit und Arbeitsspeicher das Betriebssystem und seine Dienste verbrauchen. Im Leerlauf (= 2% CPU-Last durch Firefox während ich das hier Tippe und Musik höre -.-) verbraucht der Kernel 0,2-0.3% CPU-Zeit, der Fenstermanager 0,1% und ein Dienst, den ich nicht zuordnen kann, 0,1%. Der Rest steht den Anwendungen zur Verfügung. Weniger als 0,5% wäre in meinem Fall dann der maximale Gewinn, den du gegenüber Windows erreichen könntest, wenn du den Kernel durch einen Superduperkernel ersetzt und auch den ganzen anderen Mist rauswirfst (Overhead durch Treiber ist da auf beiden Seiten natürlich nicht korrekt einberechnet).

Eine ähnliche Rechnung kannst du auf dem Respberry Pi anstellen. Unter Linux gibt es ja auch entsprechende Tools, die Ressourcenverbrauch bezüglich Anwendung und Betriebssystem aufschlüsseln. Da kannst du dann sogar deine Anwendungsfälle laufen lassen und schauen, wieviel CPU-Auslastung der Prozess erreicht, und wieviel RAM er maximal zugeteilt bekommt.

Also mein Rat ist: Mache Messungen auf dem Pi, und schau dir an, wieviel Leistung ungenutzt bleibt.

Wenn du dann sagst, das ist zu viel, dann wäre das Extrem gar kein Betriebssystem zu schreiben, sondern die Anwendung direkt auf der Hardware laufen zu lassen. Die Anwendung müsste dann entsprechende Hardwaretreiber beinhalten. Hat natürlich den Nachteil, das nichts anderes auf dem System laufen kann. Du kannst natürlich auch den Mittelweg gehen und den ganzen Overhead wie Scheduler, Speicherverwaltung und Dateisystem nach deinen Vorstellungen implementieren. Ob du dir dann genauso soviel Overhead wie andere Betriebssysteme einfängst oder mehr oder weniger, ist von deinen Anforderungen und Fähigkeiten abhängig.

Dein ursprünglicher Post klang für mich danach, als ob du Bitcoins oder so darauf berechnen willst. Ich glaube nicht, dass da ein neues Betriebssystem etwas ausmacht. Es gibt sicherlich schon "die optimale Bitcoin-Distribution" für Raspberry PI.
9
Hallo und Willkommen an Board!

Welches Problem willst du denn lösen? Kannst du die Begriffe Effizenz und Schnelligkeit in dem Kontext konkretisieren?
10
Offtopic / Re: Ratschläge um sich auf s Studium vorzubereiten
« am: 24. January 2015, 23:09 »
Viele Fakultäten bieten kurz vor Semesterbeginn einen mehrtägigen Vorkurs für Mathematik an. Wenn es sowas bei dir auch gibt, würde ich das auf jeden Fall in Anspruch nehmen. Ich hab mal wenig rumgegoogelt und z. B. die RWTH Aachen hat das Programm (wobei 4 Wochen nur Mathe schon heftig sind ...) inklusive Materialien online gestellt. (Online das Material zu lesen ersetzt nicht den Besuch eines Vorkurses.)
11
Ah ich verstehe. Das sieht man auch nicht so oft.
12
Moin!

jmp [es:b32]


[Bits 32]
b32:
mov ax,dataseg

Das mov ax,dataseg wird zu irgendwas assembliert, das mit den Bytes 0x66, 0xB8, ... beginnt. Der Sprung jmp [es:b32] ist ein indirekter Sprung, das heißt er liest den Speicher an Adresse b32 aus, anstatt nach b32 zu springen. Dort steht die eben genannte Instruktion, die als Adresse interpretiert wird, wodurch die CPU bei 0xB866 landet. (x86 ist Little Endian, deswegen sind die vertauscht.)

Bei einem far-jump kannst du kein Segmentregister angeben. Entweder du kodierst die Adresse hart, vermutlich sowas wie jmp 0x08:(0x7c00 + b32), falls der Assembler das schluckt Oder du machst das über den Stack:
push es
push b32 + 0x7c00
retf

Das 0x7c00 musst du vermutlich addieren, weil du annimmst, dass der Bootloader an Offset 0 (in Segment 0x7c0), geladen wird (statt 0x7c00 in Segment 0). (Das erkenne ich daran, dass du die ORG-Instruktion weggelassen hast, wodurch ORG 0 impliziert ist.) Übrigens heißt das auch, dass du beispielsweise die Variable bootdrive bei "load:" nicht korrekt ausliest, nachdem du ds auf 0 gesetzt hast. Vermutlich wird dadurch auch der restliche Code nicht funktionieren. Ich kann natürlich eine ewige Ausführung über Speicheradressierung im Real Mode schreiben, falls du das benötigst, aber ich würde vorschlagen du schlägst erstmal im NASM-Handbuch die ORG-Instruktion nach, und machst dir dann Gedanken, ob 1. du, 2. der Assembler, 3. die CPU alle dieselbe Vorstellung von dem Inhalt der Segmentregister haben, und ob diese korrekt ist.
13
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 12. December 2014, 20:04 »
Ja, in der Berechnung tritt der Overflow auf. Die bereits genannten Alternativen vermeiden das.

Übrigens du verfehlst regelmäßig den Edit-Knopf ;)
14
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 12. December 2014, 19:54 »
Ja, 32-Bit Speicheradressen passen in ein 32-Bit Integer. Die Zahl 2^32 (= 4 GB) passt aber nicht in ein 32-Bit vorzeichenloses Integer, weil dort eben das Maximum 2^32-1 ist.
15
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 12. December 2014, 19:28 »
So ist es. 1024 * 1024 * 4096 = 2^32 -> passt nicht mal mehr in ein unsigned int.

Alternative Methoden die Adresse der letzten Page zu berechen:

(1024 * 1024 - 1) * PAGE_SIZE
oder
((1023 * 1024) + 1023) * PAGE_SIZE
oder verallgemeinert:
((PD_INDEX * 1024) + PT_INDEX) * PAGE_SIZE
16
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 12. December 2014, 18:48 »
Wie kommst du auf 1023 * 1024 + 1023 * PAGE_SIZE und die anderen Formeln? Das Ergebnis ist eher in der Region von 5000000 aber nicht 0xFFFFF000.
17
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 12. December 2014, 01:04 »
Sobald du Paging aktiviert hast, musst du alles, was du mittels pmm_alloc() allokierst, mappen bevor du darauf zugreifen kannst. Also technisch gesehen freie Einträge in einer Page Table suchen und dort die eintragen. Das bereits vorgeschlagene Vorgehen einfach in den Page Tables nach einem unbelegten Eintrag herumzusuchen erfüllt diesen Zweck. Wenn du einen unbenutzen Eintrag findest, trägst du die physische Seite (= das Ergebnis von pmm_alloc) sowie die passenden Flags da ein und anhand der Stelle wo du es in der Page Table eingetragen hast, weißt du, was die dazugehörige virtuelle Adresse ist. Diese nutzt du anschließend um dadrauf zuzugreifen.

Es wäre aber vermutlich besser eine Speicher*verwaltung* zu schreiben, die den ganzen Kram abstrahiert. Zum Beispiel, willst du nicht einen x-beliebigen Eintrag nutzen. Du willst eventuell Einträge nur temporär nutzen bzw. mehrfach nutzen. Kompliziert ... (Igitt! Softwareentwicklung, geh weg, ich mach hier Lowlevel!)
18
Du hast ja einen Pointer auf den aktuellen Task, oder nicht? Den könntest du auch für die Suche nehmen.
19
Da musst du einen Exit-Syscall implementieren, den jedes Programm am Ende aufrufen muss.
20
Hast Recht. Ist Selektor 0x2000. Hab da wohl durch 8 dividiert, weil ich an Indizies gedacht habe.
Seiten: [1] 2 3 ... 81

Einloggen