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

Seiten: 1 ... 3 4 [5]
81
Offtopic / Re: Ist C und Unix nur ein Joke?
« am: 31. December 2006, 15:49 »
Ja, funktioniert nur mit einer Ziffer, das funktioniert halt deshalb, weil der Ascii Code von 9 um 9 höher ist als der von 0 und man das ganze als Char ausgibt und nicht als Integer.
82
Offtopic / Re: Ist C und Unix nur ein Joke?
« am: 30. December 2006, 20:40 »
Zitat
a='5';
b=7;
c=a+b;
cout << c << endl;
Sollte 60 ausgeben. (0x35 + 7)

Mit Assembler muss ich mich mit der Prozessorarchitektur auseinandersetzen. Das muss ich mit C nicht. Daher ist C oft sinnvoller als Assembler. Für Sachen, die keinen direkten Speicher/Registerzugriff erfordern, halte ich persöhnlich Bytecode Sprachen wie Java oder .NET am besten, da sie Binärkompatibel auf allen Platformen sind und sich durch die VM kontrolieren lassen.
83
Lowlevel-Coding / Re: Task-Wechsel und die FPU
« am: 29. December 2006, 19:27 »
Die Exception sollte bei jedem Zugriff ausgelöst werden. Egal ob jetzt durch SSE, FPU usw. Steht ja auch in deinem zitierten Text.
84
Lowlevel-Coding / Re: Task-Wechsel und die FPU
« am: 27. December 2006, 22:07 »
Bevor :D
Das ist kein IRQ sondern eine Exception ^^.
85
Lowlevel-Coding / Re: Task-Wechsel und die FPU
« am: 27. December 2006, 19:40 »
FXSAVE und FXRSTOR speichern auch die SSE Register mit, sie speichern also mehr Daten als FNSAVE. (und brauchen daher AFAIK auch 512 Byte) Auf älteren Prozessoren sind sie nicht verfügbar, da es damals kein SSE gab, das dürfte für dein x64 OS aber egal sein xD.
86
Offtopic / Re: Welches Betriebssystem verwendet ihr zum proggen?
« am: 27. December 2006, 19:17 »
Windows XP für Highlevel-Sachen (Java etc.).
Ubuntu für Lowlevel-Zeug. Habe einfach keine Lust GCC etc. auf Windows zu installieren.
87
Lowlevel-Coding / Re: Task-Wechsel und die FPU
« am: 27. December 2006, 19:08 »
Bei jedem Taskswitch setzt du das Bit. Wenn das Bit gesetzt ist, wird immer wenn du einen FPU Befehl nutzt die Exception (Nummer 7) ausgelöst. Wenn diese Exception ausgelöst wird, löschst du das Bit wieder. Falls ein anderer Task/Thread als der aktuelle die FPU Register zuletzt benutzt hat, musst du jetzt die FPU Register speichern und die FPU Register des aktuellen Tasks wieder laden.

Also:
Bei jedem Taskwechsel: Bit setzen
Wenn die Exception 7 ausgelöst wird: Bit löschen.
-> Wenn FPU_REGISTER_TASK != AKTUELLER_TASK
----> Aktueller Inhalt der FPU gehört zu nem anderen Task ergo: Register für den anderen Task speichern, Register für den aktuellen Task laden
----> FPU_REGISTER_TASK = AKTUELLER_TASK

EDIT: Hm, ich habe mal mein OS wieder rausgekramt und mir die Implementierung angeguckt. Ich könnte dir C Beispielcode dafür geben, eigentlich ist das aber sauleicht und das kannst du auch ohne Beispielcode schaffen denke ich :D.
88
Lowlevel-Coding / Re: Task-Wechsel und die FPU
« am: 27. December 2006, 16:51 »
Nachdem die Register gesichert sind kannst du das Bit ja einfach wieder auf 0 setzen.
89
Lowlevel-Coding / Re: Task-Wechsel und die FPU
« am: 26. December 2006, 22:59 »
Ich habe jetzt meine Implementierung nicht mehr im Kopf und gerade keinen Zugriff auf die Intel Manuals, aber im PM Mode Tutorial steht folgendes:

Zitat
TS = Task Switched
Dieses Bit wird von Prozessor automatisch bei jedem Taskwechsel gesetzt. Dadurch soll ermöglich werden,
das MMX- und SSE-Register erst dann gesichert werden müssen, sofern der neue Task auch Befehle benutzt, die
diese Register verändert. Sobald ein solcher Befehl ausgeführt wird, prüft der Prozessor ob das Bit gesetzt ist.
Wenn das der Fall ist, wird eine Exception ausgelöst, die es dem Betriebssystem dann ermöglicht die Register zu
sichern.
Demnach musst du das Bit beim Taskswitch setzen (ich gehe davon aus, dass du Software Tasking benutzt, beim Hardware Tasking sollte das automatisch passieren) und dann im Interrupt Handler #16 die Register mit fsave bzw. fxsave sichern.
90
Lowlevel-Coding / Re: Task-Wechsel und die FPU
« am: 25. December 2006, 16:07 »
Das ist aber extrem langsam da nur sehr wenige Threads/Tasks gleichzeitig FPU Befehle nutzen. Setzen des Bits und Sichern im Interrupt Handler ist wesentlich schneller.
91
Lowlevel-Coding / Re: Task-Wechsel und die FPU
« am: 24. December 2006, 20:27 »
Jo, gibt nen Bit, dass die CPU dazu veranlasst, einen Interrupt bei der nächsten Benutzung eines FPU/MMX oder was auch immer die Register nutzt auszuführen. Da kannst du dann die Register speichern.
92
OS-Design / Re: "Kleine" Frage zu API
« am: 22. December 2006, 11:47 »
Der Kompiler generiert ASM Code (Oder direkt Objektdateien, ist egal). Der enthällt natürlich keine Addressen, sondern Labels/Symbole etc. Wenn jetzt 2 oder mehr Methoden den gleichen Namen haben: (z.B. int add(int, int); und double add(double, double);) dann werden diese Namen auf eine bestimmte Weise codiert, weil sie ja sonst vom Assembler und Linker nicht zu unterscheiden wären (die wissen ja nichts von den Parametern etc.). Der Linker nimmt den Objektcode, fügt ihn zusammen und trägt die Adressen ein. Dazu ist in der Objektcode Datei eine Tabelle, in der steht, an welche Stelle innerhalb des Text-Segments die Addresse von welchem Symbol kommt. Der Linker geht diese Tabelle/Liste einfach durch und ersetzt dann die entsprechenden Stellen im Code durch die Addressen der Symbole.
93
OS-Design / Re: "Kleine" Frage zu API
« am: 21. December 2006, 18:28 »
Der Kompiler codiert die Methodennamen ganz einfach auf diese Weise. Das Nicht-Statische Methoden einer Klasse indirekt gecallt werden ist klar, ich sagte ja, das hat nur wenig mit dem Aufruf zu tun.

Angenommen ich habe zwei Funktionen:
int add(int a, int b);
double add(double a, double b);
Dann dient diese Codierung dazu, das der Compiler und der Assembler diese Methoden unterscheiden können, da der Namen von beiden ja gleich ist.

EDIT:
Zitat
Solche namen kommen mehr eher aus libs bekant vor bzw dlls. da mus das system ja anhand der Namen die passende funktionsadresse ermitteln können.
Ja, das gleiche muss der Assembler und der Linker aber auch bei nicht-lib Funktionen machen ;) Dazu dient diese Codierung ja.

@RedEagle
Wenn deine Anwendung im Kernel-Mode läuft, kannst du einfach normale Calls benutzen, indem du deine Funktionen in der API als extern deklarierst und dann die Symbole beim Laden relocatest. Wie das geht sollte in deiner Beschreibung zu deinem Executableformat stehen. (Wie es bei ELF geht ist z.B. sehr gut in der Dokumentation zu ELF beschrieben.)
94
OS-Design / Re: "Kleine" Frage zu API
« am: 21. December 2006, 17:13 »
Das was du da beschrieben hast, ist nur ein Verfahren, die Funktionsnamen zu codieren, so dass Überladen von Methoden möglich wird, z.B. in C++ oder Java. Dies dient aber lediglich dazu, die Methoden beim Kompilieren und für den Assembler auseinanderzuhalten. Mit dem späteren Aufruf hat das nicht sehr viel zu tun.

Um Kernelfunktionen aufzurufen, musst du Interrupts oder ähnliches verwenden, du musst ja schließlich von Ring3 in Ring0 switchen und das ist durch einfache Calls nicht möglich.
Seiten: 1 ... 3 4 [5]

Einloggen