Sourcecode Fortschritt
-
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); } }
-
Rev. 314:
CLTS implementiert:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-260731-and-postdays-is-0-and-postorder-is-asc-and-start-is-129.html
-
Rev. 315:
- fsave anstelle fnsave (FPU context)
- FPU_flag entfernt (nicht benötigt)
-
Rev. 316:
gdt.c: "speaking values" as parameters of gdt_set_gate(...)
PrettyOS [Version 0.0.0.316] Console 0: HELLO .ELF -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- Mr.X TicTacToe 3x3 v0.56 -------------------------------------------------------------------------------- ************* | 0 | 1 | 2 | ************* | 3 | 4 | 5 | ************* | 6 | 7 | 8 | ************* ************* | | | X | ************* | O | X | O | ************* | X | | | ************* Please type in a number betwen 0 and 8. FPU is used. pCurrentTask: C0000180h #NM: FPU is used. pCurrentTask: C0000180h Player X wins
-
Rev. 317:
Funktion "screenshot" aus ckernel.c ausgelagert nach console.c:
ckernel.c:
if (CurrentSeconds%120==3) { char timeStr[10]; sprintf(timeStr, "TIME%s", timeBuffer); screenshot(timeStr); }
console.c:
int32_t screenshot(char* name) { // buffer for video screen uint8_t videoscreen[4000+100]; // only signs, no attributes, 50 times CR LF (0xD 0xA) at line end int32_t NewLine = 0; for (uint16_t i=0; i<4000;i++) { uint16_t j=i+2*NewLine; videoscreen[j] = *(uint8_t*)(0xB8000 + 2*i); // only signs, no attributes if ((i%80) == 79) { // CR LF (0xD 0xA) videoscreen[j+1]= 0xD; videoscreen[j+2]= 0xA; NewLine++; } } return flpydsk_write(name, "TXT", (void*)videoscreen, 4100); }
PrettyOS [Version 0.0.0.317] Shell -------------------------------------------------------------------------------- ## ## Copyright (c) 2010 The PrettyOS Team This bootscreen has been created by Cuervo, member of the PrettyOS team Memory size: 128 MiB / 134 MB (134217728 Bytes) #0 0:0.0 dev:1237h vend:8086h IRQ:0 #1 0:1.0 dev:7000h vend:8086h IRQ:0 #2 0:1.1 dev:7010h vend:8086h IRQ:0 #3 0:1.2 dev:24CDh vend:8086h IRQ:11 USB EHCI F0000000h MMIO sz:4096 >>> >>> function: analyzeEHCI HCIVERSION: 0100h HCSPARAMS: 00000004h Ports: 4 HCCPARAMS: 00000080h No ext. capabil. OpRegs Address: F0000020h #4 0:1.3 dev:7113h vend:8086h IRQ:9 #5 0:2.0 dev:00B8h vend:1013h IRQ:0 #6 0:3.0 dev:100Eh vend:8086h IRQ:11 1.44 MB FDD device 0 <RAM Disk at C0005000h DIR> dev 35 info 13108 shell #NM: FPU is used. pCurrentTask: C0000070h #NM: FPU is used. pCurrentTask: C0000000h
-
Revision 318:
* Maus-Support (sogar mit Scrollwheel, falls von der Maus unterstützt)! IRQs werden angezeigt, mit Status!
-
Rev. 319:
- mouse.c: mouse print auf eine Zeile
- scheduler.c (Beginn der Auslagerung des Dispatchers/Schedulers, separat von task.c)scheduler.h/c wurde versehentlich nicht committed.
-
Rev. 320:
- Stylekorrekturen
- makefile und build.bat auf FloppyImage.img umgestellt
- scheduler.c/.h jetzt dabei
-
Rev. 321:
Code review:
BL1, BL2, ckernel: gdt_install(); idt_install(); // cf. interrupts.asm timer_install(1000); // Sets system frequency to ... Hz keyboard_install(); //... syscall_install(); fpu_install();
next step: paging, heap, tasking, pci-scan, mouse, ehci, ...
Thx to MrX, Cuervo, Tobiking, Iteem
-
Revision 322:
* Mausverbesserungen: Stabilisation, experimenteller Support für 5 Tasten (muss aktiviert werden, ist im Moment instabil und deswegen deaktiviert) und mouse_uninstall(), das sogar die Maus zurücksetzt.
EDIT:
* Des weiteren wurden einige Funktionen ausgelagert, z.B. die Funktion zum Setzen der Sample-Rate!
-
Revision 323:
- makefile-Bug bezüglich Shell behoben
- rebuild.bat hinzugefügt: führt target clean vorm Build aus
-
Revision 324:
* Kleinere Optimierungen
EDIT: Fehler, nicht-Windows nimmt jetzt i586-elf- gcc und binutils.. sry..
-
Rev. 325:
task.c überarbeitet (Code Review)