Sourcecode Fortschritt
-
Revision 300:
- BS wird nun vor der restlichen Ausgabe angezeigt, damit man diese vollständig sieht.
- BS in Funktion ausgelagert
-
Rev. 301:
paging.c: 0x400000 bis 0x600000 wird nicht mehr für User frei gegeben
ehci.c: beschleunigte Ausgabe
os.h/start.asm: USER-Stack 0x1420000
-
Revision 302:
* Leichte optische Anpassungen bei einem Systemfehler, dient der besseren Übersicht
Leider verweigert mein SVN-Client grundsätzlich das Hochladen des Diskettenimages. Ich bitte diesbezüglich um Verständnis.
-
Version 0.0.0.302 läuft auf VMWare, VBox, VPC, Qemu, Bochs
Bitte beachten, dass alte elf-Dateien, die mit esp 0x500000 oder 0x600000 in start.asm compiliert wurden, jetzt nicht mehr laufen.
-
Rev. 303:
task.c: nun den user-esp richtig übergeben in create_task
if (privilege == 3) { // general information: Intel 3A Chapter 5.12 *(--kernel_stack) = new_task->ss = 0x23; // ss *(--kernel_stack) = USER_STACK; // esp code_segment = 0x1B; // 0x18|0x3=0x1B }
start.asm: kein setzen des esp mehr notwendig, damit mehr Freiheit im OS
_start: ; mov esp, 0x1420000 ; stackpointer <--- nicht mehr notwendig call _main call _exit
-
Revision 304:
* Neue Startmelodie
// Melody // C Es F G F Es // C E F G F E C // http://www.flutepage.de/deutsch/goodies/frequenz.shtml (German) // http://www.flutepage.de/englisch/goodies/frequenz.shtml (English) beep(523,200); // C beep(622,200); // Es beep(689,200); // F beep(784,200); // G beep(689,200); // F beep(622,200); // Es beep(523,200); // C beep(659,200); // E beep(689,200); // F beep(784,200); // G beep(689,200); // F beep(659,200); // E beep(523,1000); // C
* Makefile verändert: Es werden jetzt FloppyImage.bin und FloppyImage.img erstellt => Kompatibilität verbessert und KERNEL.BIN wird beim clean gelöscht, weil der ab und zu noch das alte verwendet hat^^
* const char* version = "0.0.0.303"; wurde zu const char* version = "0.0.0.304";Leider läuft diese Version (bzw. die vorherigen) auf keinem meiner PCs.. einmal PF nach starten der Shell, einman GPF nach laden des Kernels (direkt GPF als erste Ausgabe)...
-
Rev. 305:
- Korrekturen in console.c (Hinweis +gjm+) integriert
- flush.asm (Kommentar verbessert)Ein PC stürzt noch bei der Eingabe einer gültigen Zahl in TTT ab. Das könnte aber auch am User-Programm liegen.
-
Rev. 306:
initEHCIflag auf false initialisiert (Dank an Cuervo für den Hinweis!)
-
Rev. 307:
TTT: atoi aus userlib verwendet, geringe Veränderungen bei Eingabe (auf einem PC stürzt das Programm allerdings immer noch nach Eingabe einer gültigen Ziffer ab, auf einem anderen läuft es).
-
Rev. 308:
TTT 0.54 (hello.c): Globale Variablen beseitigt --> Kein Absturz mehr bei Eingabe valider Daten!
Wieso können auf manchen PCs keine globalen Variablen verwendet werden im User-Programm? Wo liegt das genaue Problem?
-
Erhard Henkes schrieb:
Wieso können auf manchen PCs keine globalen Variablen verwendet werden im User-Programm? Wo liegt das genaue Problem?
Die Funktionen sind nicht mehr reentrant
-
Probleme mit globalen Variablen haben manchmal mit einem kaputten ELF-Loader zu tun.
-
Probleme mit globalen Variablen haben manchmal mit einem kaputten ELF-Loader zu tun.
Code und Stack arbeitet gut, nun müssen wir uns im User-Bereich noch um die saubere Verarbeitung des Data-Bereiches kümmern.
Bei Interesse: elf-Loader
https://prettyos.svn.sourceforge.net/svnroot/prettyos/trunk/Source/kernel/elf.c
-
Rev. 309:
elf.c: set bss to zero http://en.wikipedia.org/wiki/.bss
TTT (hello.c): memset((void*)tictactoe, 0, 18); // tictactoe has two bytes!Dank an XanClic, der beide Probleme auf Anhieb gefunden hat!
-
Erhard Henkes schrieb:
elf.c: set bss to zero http://en.wikipedia.org/wiki/.bss
Jepp, das war mein Verdacht.
-
Revision 310:
* Bootscreen verbessert und verschoben nach util.c
-
Jepp, das war mein Verdacht.
Wir hatten das sogar schon mal irgendwo drinnen, ist aber wieder verschwunden.
@Cuervo: Großes Lob!
-
Rev. 311:
FPU-Sicherung Experimenteller Zwischenschritt
#NM kommt noch zu oftHier mal die Doku der neuen Schritte:
os.h
struct oda { //... uintptr_t curTask; // Address of currentTask //... }__attribute__((packed));
ckernel.c:
void setup_x87_fpu() { //... // set TS in cr0 uint32_t cr0; __asm__ volatile("mov %%cr0, %0": "=r"(cr0)); // read cr0 cr0 |= 0x8; // set the TS bit (no. 3) in CR0 to enable #NM (exception no. 7) __asm__ volatile("mov %0, %%cr0":: "r"(cr0)); // write cr0 } //... while (true) // kernel idle loop { /// FPU-TEST float number1 = 2.5; float number2 = 2.5; float number3 = number1 * number2; char str[40]; float2string(number3,3,str); printf("float result: %s\n",str); /// TEST
irq.c:
task_t* pCurrentTask = (task_t*)(pODA->curTask); if ( (r->int_no < 32) && (r->int_no == 7) ) //exception #NM (number 7) { settextcolor(12,0); printf("#NM: FPU is used\n"); settextcolor(15,0); // current task uses FPU pCurrentTask->FPU_flag = true; // save FPU ... // ... // restore FPU ... // ... // set TS in cr0 to zero uint32_t cr0; __asm__ volatile("mov %%cr0, %0": "=r"(cr0)); // read cr0 cr0 &= ~0x8; // reset the TS bit (no. 3) in CR0 to disable #NM __asm__ volatile("mov %0, %%cr0":: "r"(cr0)); // write cr0 }
task.c:
void tasking_install() { //... pODA->curTask = (uintptr_t)current_task; current_task->FPU_flag = false; //... } task_t* create_task(page_directory_t* directory, void* entry, uint8_t privilege, const char* programName) { //... pODA->curTask = (uintptr_t)new_task; new_task->FPU_flag = false; } uint32_t task_switch (uint32_t esp) { //... // write active task struct address to ODA pODA->curTask = (uintptr_t)current_task; //... // set TS in cr0, if the task has not used the FPU before if (current_task->FPU_flag == false); { uint32_t cr0; __asm__ volatile("mov %%cr0, %0": "=r"(cr0)); // read cr0 cr0 |= 0x8; // set the TS bit (no. 3) in CR0 to enable #NM (exception no. 7) __asm__ volatile("mov %0, %%cr0":: "r"(cr0)); // write cr0 }
-
Rev. 312:
Rahmen für FPU-Nutzung bezüglich TS-Bit und #NM stehen, jetzt fehlt noch save und restore (Dank an Tobiking für das Mitdenken!)
in task_switch:
// set TS if (pODA->curTask == pODA->TaskFPU) { uint32_t cr0; __asm__ volatile("mov %%cr0, %0": "=r"(cr0)); // read cr0 cr0 &= ~0x8; // reset the TS bit (no. 3) in CR0 to disable #NM (exception no. 7) __asm__ volatile("mov %0, %%cr0":: "r"(cr0)); // write cr0 } else { uint32_t cr0; __asm__ volatile("mov %%cr0, %0": "=r"(cr0)); // read cr0 cr0 |= 0x8; // set the TS bit (no. 3) in CR0 to enable #NM (exception no. 7) __asm__ volatile("mov %0, %%cr0":: "r"(cr0)); // write cr0 }
kernel:
/// FPU-TEST if ((CurrentSeconds%5)==0) { float number1 = 2.5; float number2 = 2.5; float number3 = number1 * number2; char str[40]; float2string(number3,3,str); printf("float result: %s\n",str); } /// TEST
TTT (hello.c) als Test:
void Zug(uint16_t Player, char* str, uint16_t* tictactoe, bool ende) { memset((void*)str, 0, 80); for (; ; gets(str)) { /// FLOAT-TEST float number1 = 2.5; float number2 = 2.5; float number3 = number1 * number2; char floatStr[40]; float2string(number3,3,floatStr); /// TEST
-
Rev. 313:
FPU: fnsave / frstor eingebaut (Danke an Tobiking und taljeth für die Unterstützung)
In den einzelnen Konsolen erkennt man jetzt sehr schön die bei den einzelnen Tasks anfallenden #NM beim Verwenden einer FPU-Operation.
Hier der Part im irq-handler für #NM:
if ( r->int_no == 7 ) //exception #NM (number 7) { // set TS in cr0 to zero uint32_t cr0; __asm__ volatile("mov %%cr0, %0": "=r"(cr0)); // read cr0 cr0 &= ~0x8; // reset the TS bit (no. 3) in CR0 to disable #NM __asm__ volatile("mov %0, %%cr0":: "r"(cr0)); // write cr0 settextcolor(12,0); printf("#NM: FPU is used. pCurrentTask: %X\n",pCurrentTask); settextcolor(15,0); // current task uses FPU pCurrentTask->FPU_flag = true; // save FPU data ... if(pODA->TaskFPU) { // fsave or fnsave to pODA->TaskFPU->FPU_ptr __asm__ volatile("fnsave %0" :: "m" (*(char*)(((task_t*)pODA->TaskFPU)->FPU_ptr))); } // store the last task using FPU pODA->TaskFPU = (uintptr_t)pCurrentTask; // restore FPU data ... if(pCurrentTask->FPU_ptr) { // frstor from pCurrentTask->FPU_ptr __asm__ volatile("frstor %0" :: "m" (*(char*)(pCurrentTask->FPU_ptr))); } else { // allocate memory to pCurrentTask->FPU_ptr pCurrentTask->FPU_ptr = (uintptr_t)malloc(108,4); } }