From ceb17dd2c1fbd5209320814f55765e5fe5cd3d23 Mon Sep 17 00:00:00 2001 From: Christoph Urlacher Date: Thu, 23 Jun 2022 13:08:36 +0200 Subject: [PATCH 01/16] add vorgabe08 --- c_os/kernel/Paging.cc | 212 ++++++++++++++++ c_os/kernel/Paging.h | 72 ++++++ c_os/kernel/interrupts/Bluescreen.cc | 316 ++++++++++++++++++++++++ c_os/kernel/interrupts/Bluescreen.h | 21 ++ c_os/kernel/interrupts/IntDispatcher.cc | 16 +- c_os/startup.asm | 71 +++++- 6 files changed, 702 insertions(+), 6 deletions(-) create mode 100644 c_os/kernel/Paging.cc create mode 100644 c_os/kernel/Paging.h create mode 100644 c_os/kernel/interrupts/Bluescreen.cc create mode 100644 c_os/kernel/interrupts/Bluescreen.h mode change 100755 => 100644 c_os/startup.asm diff --git a/c_os/kernel/Paging.cc b/c_os/kernel/Paging.cc new file mode 100644 index 0000000..5b47ded --- /dev/null +++ b/c_os/kernel/Paging.cc @@ -0,0 +1,212 @@ +/***************************************************************************** + * * + * P A G I N G * + * * + *---------------------------------------------------------------------------* + * Beschreibung: Rudimentaeres Paging: 1:1 Mapping fuer gesamten logischen* + * Adressraum. logische Adresse = physikalische Adresse * + * * + * Page-Directory (alle Eintraege present, read/write * + * 0. Eintrag zeigt auf eine Page-Table (4 KB Eintraege)* + * Alle restl. Eintraege sind 4 MB Seiten und verweisen * + * somit auf keine Page-Tabelle sondern direkt auf die * + * 4 MB Seite. * + * * + * Page-Table (Logische Adressen 0 - 4 MB) * + * 1. Eintrag not present, read-only * + * -> Null-Pointer abfangen * + * 2. restl. Eintraege present & read/write * + * * + * Memory-Laylout * + * * + * boot.asm * + * 0x07c0: Bootsector vom BIOS geladen * + * 0x0060: Boot-Code verschiebt sich hier hin * + * 0x9000: Setup-Code (max. 64K inkl. Stack) vom * + * Bootsector-Code geladen * + * setup.asm * + * 0x1000: System-Code (max. 512K) geladen * + * BIOS-Aufruf * + * 0x24000: Parameter fuer BIOS-Aufurf * + * 0x25000: Altes ESP sichern, vor BIOS-Aufruf * + * 0x26000: 16-Bit Code-Segment fuer BIOS-Aufurf * + * System-Code * + * 0x100000: System-Code, kopiert nach Umschalten in * + * den Protected Mode kopiert (GRUB kann nur * + * an Adressen >1M laden) * + * Globale Variablen: Direkt nach dem Code liegen die globalen * + * Variablen. * + * Paging: * + * 0x200000: Page-Directory * + * 0x201000: Page-Table * + * 0x202000: erste allozierbare Page (via Paging.cc) * + * 0x3FF000: Anfang der letzten allozierbaren Page * + * Heap: * + * 0x400000: Start-Adresse der Heap-Verwaltung * + * Ende: Letzte Adresse des phys. Speichers * + * * + * * + * Autor: Michael Schoettner, 20.12.2018 * + *****************************************************************************/ +#include "kernel/Globals.h" +#include "kernel/Paging.h" + + +// Bits fuer Eintraege in der Page-Table +#define PAGE_PRESENT 0x001 +#define PAGE_WRITEABLE 0x002 +#define PAGE_BIGSIZE 0x080 +#define PAGE_RESERVED 0x800 // Bit 11 ist frei fuer das OS + +// Adresse des Page-Directory (benoetigt 4 KB) +#define PAGE_DIRECTORY 0x200000 + +// Adresse der Page-Table (benoetigt 4 KB) +#define PAGE_TABLE 0x201000 + +// Start- und End-Adresse der 4 KB Seiten die durch die Page-Table adressiert werden +#define FST_ALLOCABLE_PAGE 0x202000 +#define LST_ALLOCABLE_PAGE 0x2FF000 + + +// Externe Funktionen in startup.asm +extern "C" { + void paging_on (unsigned int* p_pdir); // Paging einschalten + void invalidate_tlb_entry(unsigned int* ptr); // Page in TLB invalid. +} + + +/***************************************************************************** + * Funktion: pg_alloc_page * + *---------------------------------------------------------------------------* + * Beschreibung: Alloziert eine 4 KB Seite. Allozieren heisst hier * + * lediglich Setzen eines eigenen RESERVED-Bits. * + *****************************************************************************/ + unsigned int * pg_alloc_page() { + unsigned int *p_page; + + p_page = (unsigned int*) PAGE_TABLE; + + // 1. Eintrag ist fuer Null-Pointer-Exception reserviert + // ausserdem liegt an die Page-Table an Adresse PAGE_TABLE + // somit ist est PAGE_TABLE + 4 KB frei (bis max. 3 MB, da beginnt der Heap) + for (int i = 1; i < 1024; i++) { + p_page ++; + // pruefe ob Page frei + if ( ((*p_page) & PAGE_RESERVED) == 0) { + *p_page = ( *p_page | PAGE_RESERVED); + return (unsigned int*)(i<<12); + } + } + return 0; +} + + +/***************************************************************************** + * Funktion: pg_write_protect_page * + *---------------------------------------------------------------------------* + * Beschreibung: Schreibschutz fuer die uebergebene Seite aktivieren. * + * Dies fuer das Debugging nuetzlich. * + *****************************************************************************/ +void pg_write_protect_page(unsigned int *p_page) { + + /* hier muss Code eingefügt werden */ + +} + + +/***************************************************************************** + * Funktion: pg_notpresent_page * + *---------------------------------------------------------------------------* + * Beschreibung: Seite als ausgelagert markieren. Nur fuer Testzwecke. * + *****************************************************************************/ +void pg_notpresent_page(unsigned int *p_page) { + + /* hier muss Code eingefügt werden */ + +} + + +/***************************************************************************** + * Funktion: pg_free_page * + *---------------------------------------------------------------------------* + * Beschreibung: Gibt eine 4 KB Seite frei. Es wird hierbei das RESERVED- * + * Bit geloescht. * + *****************************************************************************/ +void pg_free_page(unsigned int *p_page) { + int idx = (unsigned int)p_page >> 12; + + // ausserhalb Page ? + if (idx < 1 || idx > 1023) return ; + + // Eintrag einlesen und aendern (PAGE_WRITEABLE loeschen) + p_page = (unsigned int*) PAGE_TABLE; + p_page += idx; + + *p_page = ((idx << 12) | PAGE_WRITEABLE | PAGE_PRESENT); +} + + +/***************************************************************************** + * Funktion: pg_init * + *---------------------------------------------------------------------------* + * Beschreibung: Page-Tables einrichten und Paging mithilfe von * + * startup.asm aktivieren. * + *****************************************************************************/ +void pg_init() { + unsigned int i; + unsigned int *p_pdir; // Zeiger auf Page-Directory + unsigned int *p_page; // Zeiger auf einzige Page-Table fuer 4 KB Pages + unsigned int num_pages; // Anzahl 4 MB Pages die phys. Adressraum umfassen + + // wie viele 4 MB Seiten sollen als 'Present' angelegt werden, + // sodass genau der physikalische Adressraum abgedeckt ist? + num_pages = total_mem/(4096*1024); + + kout << "pg_init: " << total_mem << endl; + + kout << " total_mem: " << total_mem << endl; + kout << " #pages: " << total_mem/(4096*1024) << endl; + + + // + // Aufbau des Page-Directory + // + + // Eintrag 0: Zeiger auf 4 KB Page-Table + p_pdir = (unsigned int*) PAGE_DIRECTORY; + *p_pdir = PAGE_TABLE | PAGE_WRITEABLE | PAGE_PRESENT; + + // Eintraege 1-1023: Direktes Mapping (1:1) auf 4 MB Pages (ohne Page-Table) + for (i = 1; i < 1024; i++) { + p_pdir ++; + if (i>num_pages) + *p_pdir = ( (i<<22) | PAGE_BIGSIZE); + else + *p_pdir = ( (i<<22) | PAGE_BIGSIZE | PAGE_WRITEABLE | PAGE_PRESENT); + } + + + // + // 1. Page-Table + // + p_page = (unsigned int*) PAGE_TABLE; + + // ersten Eintrag loeschen -> not present, write protected -> Null-Pointer abfangen + *p_page = 0; + + // Eintraege 1-1023: Direktes Mapping (1:1) auf 4 KB page frames + for (i = 1; i < 1024; i++) { + p_page ++; + + // Seiten unter FST_ALLOCABLE_PAGE reservieren, damit diese nicht + // alloziert werden und das System kaputt geht + if ( (i<<12) >= FST_ALLOCABLE_PAGE) + *p_page = ((i << 12) | PAGE_WRITEABLE | PAGE_PRESENT); + else + *p_page = ((i << 12) | PAGE_WRITEABLE | PAGE_PRESENT | PAGE_RESERVED); + } + + // Paging aktivieren (in startup.asm) + paging_on( (unsigned int*) PAGE_DIRECTORY ); +} diff --git a/c_os/kernel/Paging.h b/c_os/kernel/Paging.h new file mode 100644 index 0000000..b1878fa --- /dev/null +++ b/c_os/kernel/Paging.h @@ -0,0 +1,72 @@ +/***************************************************************************** + * * + * P A G I N G * + * * + *---------------------------------------------------------------------------* + * Beschreibung: Rudimentaeres Paging: 1:1 Mapping fuer gesamten logischen* + * Adressraum. logische Adresse = physikalische Adresse * + * * + * Page-Directory (alle Eintraege present, read/write * + * 0. Eintrag zeigt auf eine Page-Table (4 KB Eintraege)* + * Alle restl. Eintraege sind 4 MB Seiten und verweisen * + * somit auf keine Page-Tabelle sondern direkt auf die * + * 4 MB Seite. * +* * + * Page-Table (Logische Adressen 0 - 4 MB) * + * 1. Eintrag not present, read-only * + * -> Null-Pointer abfangen * + * 2. restl. Eintraege present & read/write * + * * + * Memory-Laylout * + * * + * boot.asm * + * 0x07c0: Bootsector vom BIOS geladen * + * 0x0060: Boot-Code verschiebt sich hier hin * + * 0x9000: Setup-Code (max. 64K inkl. Stack) vom * + * Bootsector-Code geladen * + * setup.asm * + * 0x1000: System-Code (max. 512K) geladen * + * BIOS-Aufruf * + * 0x24000: Parameter fuer BIOS-Aufurf * + * 0x25000: Altes ESP sichern, vor BIOS-Aufruf * + * 0x26000: 16-Bit Code-Segment fuer BIOS-Aufurf * + * System-Code * + * 0x100000: System-Code, kopiert nach Umschalten in * + * den Protected Mode kopiert (GRUB kann nur * + * an Adressen >1M laden) * + * Globale Variablen: Direkt nach dem Code liegen die globalen * + * Variablen. * + * Paging: * + * 0x200000: Page-Directory * + * 0x201000: Page-Table * + * 0x202000: erste allozierbare Page (via Paging.cc) * + * 0x3FF000: letzte allozierbare Page * + * Heap: * + * 0x400000: Start-Adresse der Heap-Verwaltung * + * Ende: Letzte Adresse des phys. Speichers * + * * + * * + * Autor: Michael Schoettner, 2.2.2017 * + *****************************************************************************/ + +#ifndef __Paging_include__ +#define __Paging_include__ + +// ativiert paging +extern void pg_init(); + +// alloziert eine 4 KB Page +extern unsigned int * pg_alloc_page(); + +// Schreibschutz auf Seite setzen -> fuer debugging nuetzlich +extern void pg_write_protect_page(unsigned int *p_page); + +// Present Bit loeschen +extern void pg_notpresent_page(unsigned int *p_page); + +// gibt eine 4 KB Page frei +extern void pg_free_page(unsigned int *p_page); + +#endif + + diff --git a/c_os/kernel/interrupts/Bluescreen.cc b/c_os/kernel/interrupts/Bluescreen.cc new file mode 100644 index 0000000..f9af449 --- /dev/null +++ b/c_os/kernel/interrupts/Bluescreen.cc @@ -0,0 +1,316 @@ +/***************************************************************************** + * * + * B L U E S C R E E N * + * * + *---------------------------------------------------------------------------* + * Beschreibung: Ein Bluescreen, falls eine x86 Exception auftritt. Evt. * + * ist der Stack und oder Heap kaputt, weswegen hier nicht * + * kout etc. verwendet wird. * + * * + * Autor: Michael Schoettner, 11.12.2018 * + *****************************************************************************/ +#include "kernel/Globals.h" +#include "devices/CGA.h" + + +// in startup.asm +extern "C" { + // CR2 auslesen + unsigned int get_page_fault_address(); + + // 1st level interrupt handler in startup.asm sichert Zeiger auf Stackframe + // unmittelbar nach dem Interrupt und nachdem alle Register mit PUSHAD + // gesichert wurden + // |-------------| + // |  EFLAGS | + // |-------------| + // | CS | + // |-------------| + // | EIP | + // |-------------| + // | [ErrorCode] | + // |-------------| + // | EAX | + // |-------------| + // | ECX | + // |-------------| + // | EDX | + // |-------------| + // | EBX | + // |-------------| + // | ESP | + // |-------------| + // | EBP | + // |-------------| + // | ESI | + // |-------------| + // | EDI | + // |-------------| <-- int_esp + + void get_int_esp (unsigned int** esp); + +} + + +void break_on_bluescreen() { + + /* wenn auf diese Methode ein breakpoint in GDB gesetzt wird + so kann man sich mithilfe des Hex-Dumps umsehen + */ + +} + +// Cursor-Position +int bs_xpos = 0; +int bs_ypos = 0; + + +/***************************************************************************** + * Funktion: bs_clear * + *---------------------------------------------------------------------------* + * Beschreibung: Bildschirm loeschen. * + *****************************************************************************/ +void bs_clear() { + unsigned int x,y; + unsigned short *ptr = (unsigned short*)0xb8000; + + for (x=0; x<80; x++) { + for (y=0; y<25; y++) + *(ptr + y*80 + x) = (short)0x1F00; + } + + bs_xpos = 0; + bs_ypos = 0; +} + + +/***************************************************************************** + * Funktion: bs_lf * + *---------------------------------------------------------------------------* + * Beschreibung: Zeilenvorschub. * + *****************************************************************************/ +void bs_lf() { + bs_ypos++; + bs_xpos=0; +} + + +/***************************************************************************** + * Funktion: bs_print_char * + *---------------------------------------------------------------------------* + * Beschreibung: Ein Zeichen ausgeben. * + *****************************************************************************/ +void bs_print_char(char c) { + unsigned char *ptr = (unsigned char*)0xb8000; + + *(ptr + bs_ypos*80*2 + bs_xpos*2) = c; + bs_xpos++; +} + + +/***************************************************************************** + * Funktion: bs_print_string * + *---------------------------------------------------------------------------* + * Beschreibung: Eine Zeichenkette ausgeben. * + *****************************************************************************/ +void bs_print_string(char *str) { + + while ( *str != '\0' ) { + bs_print_char( *str ); + str++; + } +} + + +/***************************************************************************** + * Funktion: bs_printHexDigit * + *---------------------------------------------------------------------------* + * Beschreibung: Ein Hex-Zeichen ausgeben. * + *****************************************************************************/ +void bs_printHexDigit(int c) { + if (c<10) bs_print_char('0'+(unsigned char)c); + else bs_print_char('A'+(unsigned char)(c-10)); +} + + +/***************************************************************************** + * Funktion: bs_print_uintHex * + *---------------------------------------------------------------------------* + * Beschreibung: Integer ausgeben. * + *****************************************************************************/ +void bs_print_uintHex(unsigned int c) { + for (int i=28; i>=0; i=i-4) { + bs_printHexDigit( (c>>i)&0xF ); + } +} + + +/***************************************************************************** + * Funktion: bs_printReg * + *---------------------------------------------------------------------------* + * Beschreibung: String mit Integer ausgeben. Wird verwendet um ein * + * Register auszugeben. * + *****************************************************************************/ +void bs_printReg(char *str, int value) { + bs_print_string(str); + bs_print_uintHex(value); + bs_print_string(" \0"); +} + + +/***************************************************************************** + * Funktion: bs_dump * + *---------------------------------------------------------------------------* + * Beschreibung: Hauptroutine des Bluescreens. * + *****************************************************************************/ +void bs_dump (unsigned int exceptionNr) { + unsigned int *int_esp; + unsigned int *sptr; + unsigned int faultAdress; + unsigned int has_error_code = 0; + + + bs_clear (); + bs_print_string("HHUos crashed with Exception\0"); + + // Exception mit Error-Code? + if ( (exceptionNr>=8 && exceptionNr<=14) || exceptionNr==17 || exceptionNr==30) + has_error_code = 1; + + // Liegt ein Page-Fault vor? + if (exceptionNr==14) { + faultAdress = get_page_fault_address(); + // Zugriff auf Seite 0 ? -> Null-Ptr. Exception + if ((faultAdress & 0xFFFFF000) == 0) + exceptionNr=0x1B; + } + + bs_print_uintHex(exceptionNr); + bs_print_string(" (\0"); + + // Spruch ausgeben + switch (exceptionNr) { + case 0x00: bs_print_string("Divide Error\0"); break; + case 0x01: bs_print_string("Debug Exception\0"); break; + case 0x02: bs_print_string("NMI\0"); break; + case 0x03: bs_print_string("Breakpoint Exception\0"); break; + case 0x04: bs_print_string("Into Exception\0"); break; + case 0x05: bs_print_string("Index out of range Exception\0"); break; + case 0x06: bs_print_string("Invalid Opcode\0"); break; + case 0x08: bs_print_string("Double Fault\0"); break; + case 0x0D: bs_print_string("General Protection Error\0"); break; + case 0x0E: bs_print_string("Page Fault\0"); break; + case 0x18: bs_print_string("Stack invalid\0"); break; + case 0x19: bs_print_string("Return missing\0"); break; + case 0x1A: bs_print_string("Type Test Failed\0"); break; + case 0x1B: bs_print_string("Null pointer exception\0"); break; + case 0x1C: bs_print_string("MAGIC.StackTest failed\0"); break; + case 0x1D: bs_print_string("Memory-Panic\0"); break; + case 0x1E: bs_print_string("Pageload failed\0"); break; + case 0x1F: bs_print_string("Stack overflow\0"); break; + default: bs_print_string("unknown\0"); + } + bs_print_string(")\0"); bs_lf(); + + // Zeiger auf int_esp ueber startup.asm beschaffen (Stack-Layout siehe Anfang dieser Datei) + get_int_esp (&int_esp); + + // wir müssen den Inhalt auslesen und das als Zeiger verwenden, um den Stack auszulesen + sptr = (unsigned int*) *int_esp; + + bs_lf(); + + // wichtigste Register ausgeben + + // Exception mit Error-Code? + bs_printReg("EIP=\0", *(sptr + 8 + has_error_code) ); + bs_printReg("EBP=\0", *(sptr + 2) ); + bs_printReg("ESP=\0", *(sptr + 3) ); + bs_printReg(" CS=\0", *(sptr + 9 + has_error_code) ); + bs_lf(); + + + // verbleibende nicht-fluechtige Register ausgeben + bs_printReg("EBX=\0", *(sptr + 4) ); + bs_printReg("ESI=\0", *(sptr + 1) ); + bs_printReg("EDI=\0", *(sptr) ); + bs_lf(); + + // verbleibende fluechtige Register ausgeben + bs_printReg("EDX=\0", *(sptr + 5) ); + bs_printReg("ECX=\0", *(sptr + 6) ); + bs_printReg("EAX=\0", *(sptr + 7) ); + bs_printReg("EFL=\0", *(sptr + 10) ); + bs_lf(); + + + // Pagefault oder Null-Pointer? + if (exceptionNr==14 || exceptionNr==0x1B) { + bs_lf(); + bs_print_string("Fault address = \0"); + bs_print_uintHex(faultAdress); + bs_lf(); + + bs_print_string("Last useable address = \0"); + bs_print_uintHex(total_mem-1); + + bs_lf(); + } + + // Exception mit Error-Code? + if ( has_error_code == 1) { + int error_nr = *(sptr + 8); + + if (exceptionNr==14) { + if (error_nr==3) { + bs_print_string("Error: write access to read-only page.\0"); + } + else if (error_nr==2) { + bs_print_string("Error: read access to not-present page.\0"); + } + else if (error_nr==0) { + bs_print_string("Error: access to a not-present page.\0"); + } + else { + bs_print_string("Error code = \0"); + bs_print_uintHex( error_nr ); + } + bs_lf(); + } + else { + bs_print_string("Error code = \0"); + bs_print_uintHex( error_nr ); + bs_lf(); + } + } + + // Calling stack ... + bs_lf(); + bs_print_string("Calling Stack:\0"); bs_lf(); + int x = 0; + unsigned int *ebp = (unsigned int *) *(sptr + 2); + unsigned int raddr; + + // solange eip > 1 MB && ebp < 128 MB, max. Aufruftiefe 10 + while ( *ebp>0x100000 && *ebp<0x8000000 && x<10 ) { + + raddr = *(ebp+1); + bs_printReg(" raddr=\0", raddr ); bs_lf(); + + // dynamische Kette -> zum Aufrufer + ebp = (unsigned int*) *ebp; + + x++; + } + if (x==0) { + bs_print_string(" empty\0"); bs_lf(); + } + bs_lf(); + + // nur falls gdb benutzt werden soll + break_on_bluescreen(); + + bs_print_string("System halted\0"); +} + + diff --git a/c_os/kernel/interrupts/Bluescreen.h b/c_os/kernel/interrupts/Bluescreen.h new file mode 100644 index 0000000..1fdea8e --- /dev/null +++ b/c_os/kernel/interrupts/Bluescreen.h @@ -0,0 +1,21 @@ +/***************************************************************************** + * * + * B L U E S C R E E N * + * * + *---------------------------------------------------------------------------* + * Beschreibung: Ein Bluescreen, falls eine x86 Exception auftritt. Evt. * + * ist der Stack und oder Heap kaputt, weswegen hier nicht * + * kout etc. verwendet wird. * + * * + * Autor: Michael Schoettner, 2.2.2017 * + *****************************************************************************/ + +#ifndef __Bluescreen_include__ +#define __Bluescreen_include__ + +// dump blue screen (will not return) +void bs_dump (unsigned int exceptionNr); + +#endif + + diff --git a/c_os/kernel/interrupts/IntDispatcher.cc b/c_os/kernel/interrupts/IntDispatcher.cc index af807b2..636105d 100755 --- a/c_os/kernel/interrupts/IntDispatcher.cc +++ b/c_os/kernel/interrupts/IntDispatcher.cc @@ -10,9 +10,11 @@ * * * Autor: Michael Schoettner, 31.8.2016 * *****************************************************************************/ -#include "kernel/interrupts/IntDispatcher.h" #include "kernel/CPU.h" #include "kernel/Globals.h" +#include "kernel/interrupts/IntDispatcher.h" +#include "kernel/interrupts/Bluescreen.h" + extern "C" void int_disp(unsigned int slot); @@ -31,11 +33,19 @@ extern "C" void int_disp(unsigned int slot); void int_disp(unsigned int vector) { /* hier muss Code eingefuegt werden */ + if (vector < 32) { + bs_dump(vector); + cpu.halt (); + } - // kout << "Ein Interrupt ist aufgetreten (vector: " << vector << ")" << endl; - intdis.report(vector); + if (intdis.report (vector) < 0) { + kout << "Panic: unexpected interrupt " << vector; + kout << " - processor halted." << endl; + cpu.halt (); + } } + /***************************************************************************** * Konstruktor: IntDispatcher::IntDispatcher * *---------------------------------------------------------------------------* diff --git a/c_os/startup.asm b/c_os/startup.asm old mode 100755 new mode 100644 index 5c365e3..f592caa --- a/c_os/startup.asm +++ b/c_os/startup.asm @@ -9,7 +9,7 @@ ;* die weitere Ausfuehrung durch C-Code erfolgen kann. * ;* * ;* Autor: Olaf Spinczyk, TU Dortmund * -;* Michael Schoettner, HHU, 9.9.2016 * +;* Michael Schoettner, HHU, 15.12.2018 * ;****************************************************************************** ; Multiboot-Konstanten @@ -31,6 +31,10 @@ MULTIBOOT_EAX_MAGIC equ 0x2badb002 [GLOBAL idt] [GLOBAL __cxa_pure_virtual] [GLOBAL bios_call] +[GLOBAL invalidate_tlb_entry] +[GLOBAL paging_on] +[GLOBAL get_page_fault_address] +[GLOBAL get_int_esp] ; Michael Schoettner: ; Nachfolgender label steht fuer das 'delete', welches jetzt implementiert @@ -138,7 +142,9 @@ _fini_done: %macro wrapper 1 wrapper_%1: - push eax + pushad ; alle Register sichern (fuer den Bluescreen) + mov ecx, int_esp ; Stack_zeiger sichern, fuer Zugriff im Bluescreen + mov [ecx], esp mov al,%1 jmp wrapper_body %endmacro @@ -161,7 +167,7 @@ wrapper_body: add esp,4 ; Parameter vom Stack entfernen pop edx ; fluechtige Register wieder herstellen pop ecx - pop eax + popad ; alle Register wiederherstellen iret ; fertig! ; @@ -252,6 +258,46 @@ bios_call: lidt [idt_descr] ret +; Paging aktivieren +; (siehe Paging.cc) +paging_on: + mov eax,[4+esp] ; Parameter Addr. Page-Dir. ins eax Register + mov ebx, cr4 + or ebx, 0x10 ; 4 MB Pages aktivieren + mov cr4, ebx ; CR4 schreiben + mov cr3, eax ; Page-Directory laden + mov ebx, cr0 + or ebx, 0x80010000 ; Paging aktivieren + mov cr0, ebx + ret + +; Paging-Fault-Adresse holen +; (siehe Paging.cc) +get_page_fault_address: + mov eax,cr2 + ret + +; Invalidiert eine Seite im TLB. Dies notwendig, falls eine +; die Bits Present, R/W in einem Seitentabelleneintrag +; geaendert werden. Falls die Seite im TLB gespeichert ist +; wuerde die MMU nichts von diesen Aenderungen erkennen, +; da die MMU dann nicht auf die Seitentabellen zugreift. +; (siehe Paging.cc) +invalidate_tlb_entry: + mov eax, [esp+4] + invlpg [eax] + ret + +; Auslesen von 'int_esp' +; wird im Bluescreen benoetigt, um den Stacks zuzugreifen +; +; C Prototyp: void get_int_esp (unsigned int** esp); +get_int_esp: + mov eax,[4+esp] ; esp + mov ecx, int_esp + mov [eax], ecx + ret + [SECTION .data] @@ -319,3 +365,22 @@ gdt_48: idt16_descr: dw 1024 ; idt enthaelt max. 1024 Eintraege dd 0 ; Adresse 0 + +; +; Stack-Zeiger fuer Bluescreen +; (genauerer Stack-Aufbau siehe Bluescreen.cc) +; +; |-------------| +; |  EFLAGS | +; |-------------| +; | CS | +; |-------------| +; | EIP | +; |-------------| +; | [ErrorCode] | +; |-------------| +; | alle Regs. | +; | (PUSHAD) | +; |-------------| <-- int_esp +int_esp: + db 0,0,0,0 From 704af6a6fd382832d97f88f382d6a0b843fa305c Mon Sep 17 00:00:00 2001 From: Christoph Urlacher Date: Thu, 23 Jun 2022 13:15:23 +0200 Subject: [PATCH 02/16] reformat --- c_os/kernel/Paging.cc | 123 +++++++------- c_os/kernel/Paging.h | 10 +- c_os/kernel/interrupts/Bluescreen.cc | 244 +++++++++++++-------------- c_os/kernel/interrupts/Bluescreen.h | 4 +- 4 files changed, 180 insertions(+), 201 deletions(-) diff --git a/c_os/kernel/Paging.cc b/c_os/kernel/Paging.cc index 5b47ded..1f2b120 100644 --- a/c_os/kernel/Paging.cc +++ b/c_os/kernel/Paging.cc @@ -48,105 +48,98 @@ * * * Autor: Michael Schoettner, 20.12.2018 * *****************************************************************************/ -#include "kernel/Globals.h" #include "kernel/Paging.h" - +#include "kernel/Globals.h" // Bits fuer Eintraege in der Page-Table -#define PAGE_PRESENT 0x001 -#define PAGE_WRITEABLE 0x002 -#define PAGE_BIGSIZE 0x080 -#define PAGE_RESERVED 0x800 // Bit 11 ist frei fuer das OS +#define PAGE_PRESENT 0x001 +#define PAGE_WRITEABLE 0x002 +#define PAGE_BIGSIZE 0x080 +#define PAGE_RESERVED 0x800 // Bit 11 ist frei fuer das OS // Adresse des Page-Directory (benoetigt 4 KB) -#define PAGE_DIRECTORY 0x200000 +#define PAGE_DIRECTORY 0x200000 // Adresse der Page-Table (benoetigt 4 KB) -#define PAGE_TABLE 0x201000 +#define PAGE_TABLE 0x201000 -// Start- und End-Adresse der 4 KB Seiten die durch die Page-Table adressiert werden -#define FST_ALLOCABLE_PAGE 0x202000 -#define LST_ALLOCABLE_PAGE 0x2FF000 +// Start- und End-Adresse der 4 KB Seiten die durch die Page-Table adressiert werden +#define FST_ALLOCABLE_PAGE 0x202000 +#define LST_ALLOCABLE_PAGE 0x2FF000 - -// Externe Funktionen in startup.asm +// Externe Funktionen in startup.asm extern "C" { - void paging_on (unsigned int* p_pdir); // Paging einschalten - void invalidate_tlb_entry(unsigned int* ptr); // Page in TLB invalid. + void paging_on(unsigned int* p_pdir); // Paging einschalten + void invalidate_tlb_entry(unsigned int* ptr); // Page in TLB invalid. } - /***************************************************************************** * Funktion: pg_alloc_page * *---------------------------------------------------------------------------* * Beschreibung: Alloziert eine 4 KB Seite. Allozieren heisst hier * * lediglich Setzen eines eigenen RESERVED-Bits. * *****************************************************************************/ - unsigned int * pg_alloc_page() { - unsigned int *p_page; - - p_page = (unsigned int*) PAGE_TABLE; - +unsigned int* pg_alloc_page() { + unsigned int* p_page; + + p_page = (unsigned int*)PAGE_TABLE; + // 1. Eintrag ist fuer Null-Pointer-Exception reserviert // ausserdem liegt an die Page-Table an Adresse PAGE_TABLE // somit ist est PAGE_TABLE + 4 KB frei (bis max. 3 MB, da beginnt der Heap) for (int i = 1; i < 1024; i++) { - p_page ++; + p_page++; // pruefe ob Page frei - if ( ((*p_page) & PAGE_RESERVED) == 0) { - *p_page = ( *p_page | PAGE_RESERVED); - return (unsigned int*)(i<<12); + if (((*p_page) & PAGE_RESERVED) == 0) { + *p_page = (*p_page | PAGE_RESERVED); + return (unsigned int*)(i << 12); } } return 0; } - /***************************************************************************** * Funktion: pg_write_protect_page * *---------------------------------------------------------------------------* * Beschreibung: Schreibschutz fuer die uebergebene Seite aktivieren. * * Dies fuer das Debugging nuetzlich. * *****************************************************************************/ -void pg_write_protect_page(unsigned int *p_page) { - - /* hier muss Code eingefügt werden */ +void pg_write_protect_page(unsigned int* p_page) { + /* hier muss Code eingefügt werden */ } - /***************************************************************************** * Funktion: pg_notpresent_page * *---------------------------------------------------------------------------* * Beschreibung: Seite als ausgelagert markieren. Nur fuer Testzwecke. * *****************************************************************************/ -void pg_notpresent_page(unsigned int *p_page) { - - /* hier muss Code eingefügt werden */ +void pg_notpresent_page(unsigned int* p_page) { + /* hier muss Code eingefügt werden */ } - /***************************************************************************** * Funktion: pg_free_page * *---------------------------------------------------------------------------* * Beschreibung: Gibt eine 4 KB Seite frei. Es wird hierbei das RESERVED- * * Bit geloescht. * *****************************************************************************/ -void pg_free_page(unsigned int *p_page) { +void pg_free_page(unsigned int* p_page) { int idx = (unsigned int)p_page >> 12; - + // ausserhalb Page ? - if (idx < 1 || idx > 1023) return ; - + if (idx < 1 || idx > 1023) { + return; + } + // Eintrag einlesen und aendern (PAGE_WRITEABLE loeschen) - p_page = (unsigned int*) PAGE_TABLE; + p_page = (unsigned int*)PAGE_TABLE; p_page += idx; - + *p_page = ((idx << 12) | PAGE_WRITEABLE | PAGE_PRESENT); } - /***************************************************************************** * Funktion: pg_init * *---------------------------------------------------------------------------* @@ -155,58 +148,58 @@ void pg_free_page(unsigned int *p_page) { *****************************************************************************/ void pg_init() { unsigned int i; - unsigned int *p_pdir; // Zeiger auf Page-Directory - unsigned int *p_page; // Zeiger auf einzige Page-Table fuer 4 KB Pages - unsigned int num_pages; // Anzahl 4 MB Pages die phys. Adressraum umfassen - + unsigned int* p_pdir; // Zeiger auf Page-Directory + unsigned int* p_page; // Zeiger auf einzige Page-Table fuer 4 KB Pages + unsigned int num_pages; // Anzahl 4 MB Pages die phys. Adressraum umfassen + // wie viele 4 MB Seiten sollen als 'Present' angelegt werden, // sodass genau der physikalische Adressraum abgedeckt ist? - num_pages = total_mem/(4096*1024); - + num_pages = total_mem / (4096 * 1024); + kout << "pg_init: " << total_mem << endl; - + kout << " total_mem: " << total_mem << endl; - kout << " #pages: " << total_mem/(4096*1024) << endl; - + kout << " #pages: " << total_mem / (4096 * 1024) << endl; // // Aufbau des Page-Directory // - + // Eintrag 0: Zeiger auf 4 KB Page-Table - p_pdir = (unsigned int*) PAGE_DIRECTORY; + p_pdir = (unsigned int*)PAGE_DIRECTORY; *p_pdir = PAGE_TABLE | PAGE_WRITEABLE | PAGE_PRESENT; // Eintraege 1-1023: Direktes Mapping (1:1) auf 4 MB Pages (ohne Page-Table) for (i = 1; i < 1024; i++) { - p_pdir ++; - if (i>num_pages) - *p_pdir = ( (i<<22) | PAGE_BIGSIZE); - else - *p_pdir = ( (i<<22) | PAGE_BIGSIZE | PAGE_WRITEABLE | PAGE_PRESENT); + p_pdir++; + if (i > num_pages) { + *p_pdir = ((i << 22) | PAGE_BIGSIZE); + } else { + *p_pdir = ((i << 22) | PAGE_BIGSIZE | PAGE_WRITEABLE | PAGE_PRESENT); + } } - // // 1. Page-Table // - p_page = (unsigned int*) PAGE_TABLE; - + p_page = (unsigned int*)PAGE_TABLE; + // ersten Eintrag loeschen -> not present, write protected -> Null-Pointer abfangen *p_page = 0; // Eintraege 1-1023: Direktes Mapping (1:1) auf 4 KB page frames for (i = 1; i < 1024; i++) { - p_page ++; - + p_page++; + // Seiten unter FST_ALLOCABLE_PAGE reservieren, damit diese nicht // alloziert werden und das System kaputt geht - if ( (i<<12) >= FST_ALLOCABLE_PAGE) + if ((i << 12) >= FST_ALLOCABLE_PAGE) { *p_page = ((i << 12) | PAGE_WRITEABLE | PAGE_PRESENT); - else + } else { *p_page = ((i << 12) | PAGE_WRITEABLE | PAGE_PRESENT | PAGE_RESERVED); + } } // Paging aktivieren (in startup.asm) - paging_on( (unsigned int*) PAGE_DIRECTORY ); + paging_on((unsigned int*)PAGE_DIRECTORY); } diff --git a/c_os/kernel/Paging.h b/c_os/kernel/Paging.h index b1878fa..5abea90 100644 --- a/c_os/kernel/Paging.h +++ b/c_os/kernel/Paging.h @@ -56,17 +56,15 @@ extern void pg_init(); // alloziert eine 4 KB Page -extern unsigned int * pg_alloc_page(); +extern unsigned int* pg_alloc_page(); // Schreibschutz auf Seite setzen -> fuer debugging nuetzlich -extern void pg_write_protect_page(unsigned int *p_page); +extern void pg_write_protect_page(unsigned int* p_page); // Present Bit loeschen -extern void pg_notpresent_page(unsigned int *p_page); +extern void pg_notpresent_page(unsigned int* p_page); // gibt eine 4 KB Page frei -extern void pg_free_page(unsigned int *p_page); +extern void pg_free_page(unsigned int* p_page); #endif - - diff --git a/c_os/kernel/interrupts/Bluescreen.cc b/c_os/kernel/interrupts/Bluescreen.cc index f9af449..8a39c63 100644 --- a/c_os/kernel/interrupts/Bluescreen.cc +++ b/c_os/kernel/interrupts/Bluescreen.cc @@ -9,15 +9,14 @@ * * * Autor: Michael Schoettner, 11.12.2018 * *****************************************************************************/ -#include "kernel/Globals.h" #include "devices/CGA.h" - +#include "kernel/Globals.h" // in startup.asm extern "C" { // CR2 auslesen unsigned int get_page_fault_address(); - + // 1st level interrupt handler in startup.asm sichert Zeiger auf Stackframe // unmittelbar nach dem Interrupt und nachdem alle Register mit PUSHAD // gesichert wurden @@ -47,43 +46,40 @@ extern "C" { // | EDI | // |-------------| <-- int_esp - void get_int_esp (unsigned int** esp); - + void get_int_esp(unsigned int** esp); } - void break_on_bluescreen() { - + /* wenn auf diese Methode ein breakpoint in GDB gesetzt wird so kann man sich mithilfe des Hex-Dumps umsehen */ - } // Cursor-Position int bs_xpos = 0; int bs_ypos = 0; - /***************************************************************************** * Funktion: bs_clear * *---------------------------------------------------------------------------* * Beschreibung: Bildschirm loeschen. * *****************************************************************************/ void bs_clear() { - unsigned int x,y; - unsigned short *ptr = (unsigned short*)0xb8000; - - for (x=0; x<80; x++) { - for (y=0; y<25; y++) - *(ptr + y*80 + x) = (short)0x1F00; + unsigned int x; + unsigned int y; + unsigned short* ptr = (unsigned short*)0xb8000; + + for (x = 0; x < 80; x++) { + for (y = 0; y < 25; y++) { + *(ptr + y * 80 + x) = (short)0x1F00; + } } bs_xpos = 0; bs_ypos = 0; } - /***************************************************************************** * Funktion: bs_lf * *---------------------------------------------------------------------------* @@ -91,98 +87,96 @@ void bs_clear() { *****************************************************************************/ void bs_lf() { bs_ypos++; - bs_xpos=0; + bs_xpos = 0; } - /***************************************************************************** * Funktion: bs_print_char * *---------------------------------------------------------------------------* * Beschreibung: Ein Zeichen ausgeben. * *****************************************************************************/ void bs_print_char(char c) { - unsigned char *ptr = (unsigned char*)0xb8000; - - *(ptr + bs_ypos*80*2 + bs_xpos*2) = c; + unsigned char* ptr = (unsigned char*)0xb8000; + + *(ptr + bs_ypos * 80 * 2 + bs_xpos * 2) = c; bs_xpos++; } - /***************************************************************************** * Funktion: bs_print_string * *---------------------------------------------------------------------------* * Beschreibung: Eine Zeichenkette ausgeben. * *****************************************************************************/ -void bs_print_string(char *str) { - - while ( *str != '\0' ) { - bs_print_char( *str ); +void bs_print_string(char* str) { + + while (*str != '\0') { + bs_print_char(*str); str++; } } - /***************************************************************************** * Funktion: bs_printHexDigit * *---------------------------------------------------------------------------* * Beschreibung: Ein Hex-Zeichen ausgeben. * *****************************************************************************/ void bs_printHexDigit(int c) { - if (c<10) bs_print_char('0'+(unsigned char)c); - else bs_print_char('A'+(unsigned char)(c-10)); + if (c < 10) { + bs_print_char('0' + (unsigned char)c); + } else { + bs_print_char('A' + (unsigned char)(c - 10)); + } } - /***************************************************************************** * Funktion: bs_print_uintHex * *---------------------------------------------------------------------------* * Beschreibung: Integer ausgeben. * *****************************************************************************/ void bs_print_uintHex(unsigned int c) { - for (int i=28; i>=0; i=i-4) { - bs_printHexDigit( (c>>i)&0xF ); + for (int i = 28; i >= 0; i = i - 4) { + bs_printHexDigit((c >> i) & 0xF); } } - /***************************************************************************** * Funktion: bs_printReg * *---------------------------------------------------------------------------* * Beschreibung: String mit Integer ausgeben. Wird verwendet um ein * * Register auszugeben. * *****************************************************************************/ -void bs_printReg(char *str, int value) { +void bs_printReg(char* str, int value) { bs_print_string(str); bs_print_uintHex(value); bs_print_string(" \0"); } - /***************************************************************************** * Funktion: bs_dump * *---------------------------------------------------------------------------* * Beschreibung: Hauptroutine des Bluescreens. * *****************************************************************************/ -void bs_dump (unsigned int exceptionNr) { - unsigned int *int_esp; - unsigned int *sptr; +void bs_dump(unsigned int exceptionNr) { + unsigned int* int_esp; + unsigned int* sptr; unsigned int faultAdress; unsigned int has_error_code = 0; - - - bs_clear (); + + bs_clear(); bs_print_string("HHUos crashed with Exception\0"); // Exception mit Error-Code? - if ( (exceptionNr>=8 && exceptionNr<=14) || exceptionNr==17 || exceptionNr==30) - has_error_code = 1; + if ((exceptionNr >= 8 && exceptionNr <= 14) || exceptionNr == 17 || exceptionNr == 30) { + has_error_code = 1; + } - // Liegt ein Page-Fault vor? - if (exceptionNr==14) { + // Liegt ein Page-Fault vor? + if (exceptionNr == 14) { faultAdress = get_page_fault_address(); // Zugriff auf Seite 0 ? -> Null-Ptr. Exception - if ((faultAdress & 0xFFFFF000) == 0) - exceptionNr=0x1B; + if ((faultAdress & 0xFFFFF000) == 0) { + exceptionNr = 0x1B; + } } bs_print_uintHex(exceptionNr); @@ -190,127 +184,123 @@ void bs_dump (unsigned int exceptionNr) { // Spruch ausgeben switch (exceptionNr) { - case 0x00: bs_print_string("Divide Error\0"); break; - case 0x01: bs_print_string("Debug Exception\0"); break; - case 0x02: bs_print_string("NMI\0"); break; - case 0x03: bs_print_string("Breakpoint Exception\0"); break; - case 0x04: bs_print_string("Into Exception\0"); break; - case 0x05: bs_print_string("Index out of range Exception\0"); break; - case 0x06: bs_print_string("Invalid Opcode\0"); break; - case 0x08: bs_print_string("Double Fault\0"); break; - case 0x0D: bs_print_string("General Protection Error\0"); break; - case 0x0E: bs_print_string("Page Fault\0"); break; - case 0x18: bs_print_string("Stack invalid\0"); break; - case 0x19: bs_print_string("Return missing\0"); break; - case 0x1A: bs_print_string("Type Test Failed\0"); break; - case 0x1B: bs_print_string("Null pointer exception\0"); break; - case 0x1C: bs_print_string("MAGIC.StackTest failed\0"); break; - case 0x1D: bs_print_string("Memory-Panic\0"); break; - case 0x1E: bs_print_string("Pageload failed\0"); break; - case 0x1F: bs_print_string("Stack overflow\0"); break; - default: bs_print_string("unknown\0"); + case 0x00: bs_print_string("Divide Error\0"); break; + case 0x01: bs_print_string("Debug Exception\0"); break; + case 0x02: bs_print_string("NMI\0"); break; + case 0x03: bs_print_string("Breakpoint Exception\0"); break; + case 0x04: bs_print_string("Into Exception\0"); break; + case 0x05: bs_print_string("Index out of range Exception\0"); break; + case 0x06: bs_print_string("Invalid Opcode\0"); break; + case 0x08: bs_print_string("Double Fault\0"); break; + case 0x0D: bs_print_string("General Protection Error\0"); break; + case 0x0E: bs_print_string("Page Fault\0"); break; + case 0x18: bs_print_string("Stack invalid\0"); break; + case 0x19: bs_print_string("Return missing\0"); break; + case 0x1A: bs_print_string("Type Test Failed\0"); break; + case 0x1B: bs_print_string("Null pointer exception\0"); break; + case 0x1C: bs_print_string("MAGIC.StackTest failed\0"); break; + case 0x1D: bs_print_string("Memory-Panic\0"); break; + case 0x1E: bs_print_string("Pageload failed\0"); break; + case 0x1F: bs_print_string("Stack overflow\0"); break; + default: bs_print_string("unknown\0"); } - bs_print_string(")\0"); bs_lf(); + bs_print_string(")\0"); + bs_lf(); // Zeiger auf int_esp ueber startup.asm beschaffen (Stack-Layout siehe Anfang dieser Datei) - get_int_esp (&int_esp); + get_int_esp(&int_esp); // wir müssen den Inhalt auslesen und das als Zeiger verwenden, um den Stack auszulesen - sptr = (unsigned int*) *int_esp; + sptr = (unsigned int*)*int_esp; bs_lf(); // wichtigste Register ausgeben - - // Exception mit Error-Code? - bs_printReg("EIP=\0", *(sptr + 8 + has_error_code) ); - bs_printReg("EBP=\0", *(sptr + 2) ); - bs_printReg("ESP=\0", *(sptr + 3) ); - bs_printReg(" CS=\0", *(sptr + 9 + has_error_code) ); - bs_lf(); + // Exception mit Error-Code? + bs_printReg("EIP=\0", *(sptr + 8 + has_error_code)); + bs_printReg("EBP=\0", *(sptr + 2)); + bs_printReg("ESP=\0", *(sptr + 3)); + bs_printReg(" CS=\0", *(sptr + 9 + has_error_code)); + bs_lf(); // verbleibende nicht-fluechtige Register ausgeben - bs_printReg("EBX=\0", *(sptr + 4) ); - bs_printReg("ESI=\0", *(sptr + 1) ); - bs_printReg("EDI=\0", *(sptr) ); - bs_lf(); - - // verbleibende fluechtige Register ausgeben - bs_printReg("EDX=\0", *(sptr + 5) ); - bs_printReg("ECX=\0", *(sptr + 6) ); - bs_printReg("EAX=\0", *(sptr + 7) ); - bs_printReg("EFL=\0", *(sptr + 10) ); + bs_printReg("EBX=\0", *(sptr + 4)); + bs_printReg("ESI=\0", *(sptr + 1)); + bs_printReg("EDI=\0", *(sptr)); bs_lf(); + // verbleibende fluechtige Register ausgeben + bs_printReg("EDX=\0", *(sptr + 5)); + bs_printReg("ECX=\0", *(sptr + 6)); + bs_printReg("EAX=\0", *(sptr + 7)); + bs_printReg("EFL=\0", *(sptr + 10)); + bs_lf(); // Pagefault oder Null-Pointer? - if (exceptionNr==14 || exceptionNr==0x1B) { + if (exceptionNr == 14 || exceptionNr == 0x1B) { bs_lf(); bs_print_string("Fault address = \0"); bs_print_uintHex(faultAdress); bs_lf(); - + bs_print_string("Last useable address = \0"); - bs_print_uintHex(total_mem-1); - + bs_print_uintHex(total_mem - 1); + bs_lf(); } // Exception mit Error-Code? - if ( has_error_code == 1) { - int error_nr = *(sptr + 8); - - if (exceptionNr==14) { - if (error_nr==3) { - bs_print_string("Error: write access to read-only page.\0"); + if (has_error_code == 1) { + int error_nr = *(sptr + 8); + + if (exceptionNr == 14) { + if (error_nr == 3) { + bs_print_string("Error: write access to read-only page.\0"); + } else if (error_nr == 2) { + bs_print_string("Error: read access to not-present page.\0"); + } else if (error_nr == 0) { + bs_print_string("Error: access to a not-present page.\0"); + } else { + bs_print_string("Error code = \0"); + bs_print_uintHex(error_nr); } - else if (error_nr==2) { - bs_print_string("Error: read access to not-present page.\0"); - } - else if (error_nr==0) { - bs_print_string("Error: access to a not-present page.\0"); - } - else { - bs_print_string("Error code = \0"); - bs_print_uintHex( error_nr ); - } bs_lf(); - } - else { - bs_print_string("Error code = \0"); - bs_print_uintHex( error_nr ); - bs_lf(); - } + } else { + bs_print_string("Error code = \0"); + bs_print_uintHex(error_nr); + bs_lf(); + } } // Calling stack ... bs_lf(); - bs_print_string("Calling Stack:\0"); bs_lf(); + bs_print_string("Calling Stack:\0"); + bs_lf(); int x = 0; - unsigned int *ebp = (unsigned int *) *(sptr + 2); + unsigned int* ebp = (unsigned int*)*(sptr + 2); unsigned int raddr; - + // solange eip > 1 MB && ebp < 128 MB, max. Aufruftiefe 10 - while ( *ebp>0x100000 && *ebp<0x8000000 && x<10 ) { - - raddr = *(ebp+1); - bs_printReg(" raddr=\0", raddr ); bs_lf(); + while (*ebp > 0x100000 && *ebp < 0x8000000 && x < 10) { + + raddr = *(ebp + 1); + bs_printReg(" raddr=\0", raddr); + bs_lf(); // dynamische Kette -> zum Aufrufer - ebp = (unsigned int*) *ebp; - + ebp = (unsigned int*)*ebp; + x++; } - if (x==0) { - bs_print_string(" empty\0"); bs_lf(); + if (x == 0) { + bs_print_string(" empty\0"); + bs_lf(); } bs_lf(); - + // nur falls gdb benutzt werden soll break_on_bluescreen(); - + bs_print_string("System halted\0"); } - - diff --git a/c_os/kernel/interrupts/Bluescreen.h b/c_os/kernel/interrupts/Bluescreen.h index 1fdea8e..bcc5e62 100644 --- a/c_os/kernel/interrupts/Bluescreen.h +++ b/c_os/kernel/interrupts/Bluescreen.h @@ -14,8 +14,6 @@ #define __Bluescreen_include__ // dump blue screen (will not return) -void bs_dump (unsigned int exceptionNr); +void bs_dump(unsigned int exceptionNr); #endif - - From 331613cd467c7efcb3c4618c8ce94b83bdf1ad7a Mon Sep 17 00:00:00 2001 From: churl Date: Mon, 27 Jun 2022 22:50:11 +0200 Subject: [PATCH 03/16] update mode, why does this keep happening? --- .gitignore | 0 boot/Makefile | 0 boot/bootsect.asm | 0 boot/setup.asm | 0 c_os/.clang-tidy | 0 c_os/kernel/threads/Dispatch.cc | 0 c_os/kernel/threads/Dispatch.h | 0 c_os/kernel/threads/IdleThread.h | 0 c_os/kernel/threads/Scheduler.cc | 0 c_os/kernel/threads/Scheduler.h | 0 c_os/kernel/threads/Thread.asm | 0 c_os/kernel/threads/Thread.cc | 0 c_os/kernel/threads/Thread.h | 0 c_os/kernel/threads/Thread.inc | 0 c_os/kernel/threads/ThreadState.h | 0 c_os/lib/Queue.h | 0 c_os/user/CoopThreadDemo.cc | 0 c_os/user/CoopThreadDemo.h | 0 c_os/user/HelloWorldThread.cc | 0 c_os/user/HelloWorldThread.h | 0 c_os/user/LoopThread.cc | 0 c_os/user/LoopThread.h | 0 22 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 .gitignore mode change 100755 => 100644 boot/Makefile mode change 100755 => 100644 boot/bootsect.asm mode change 100755 => 100644 boot/setup.asm mode change 100755 => 100644 c_os/.clang-tidy mode change 100755 => 100644 c_os/kernel/threads/Dispatch.cc mode change 100755 => 100644 c_os/kernel/threads/Dispatch.h mode change 100755 => 100644 c_os/kernel/threads/IdleThread.h mode change 100755 => 100644 c_os/kernel/threads/Scheduler.cc mode change 100755 => 100644 c_os/kernel/threads/Scheduler.h mode change 100644 => 100755 c_os/kernel/threads/Thread.asm mode change 100644 => 100755 c_os/kernel/threads/Thread.cc mode change 100755 => 100644 c_os/kernel/threads/Thread.h mode change 100644 => 100755 c_os/kernel/threads/Thread.inc mode change 100644 => 100755 c_os/kernel/threads/ThreadState.h mode change 100755 => 100644 c_os/lib/Queue.h mode change 100755 => 100644 c_os/user/CoopThreadDemo.cc mode change 100755 => 100644 c_os/user/CoopThreadDemo.h mode change 100755 => 100644 c_os/user/HelloWorldThread.cc mode change 100755 => 100644 c_os/user/HelloWorldThread.h mode change 100755 => 100644 c_os/user/LoopThread.cc mode change 100755 => 100644 c_os/user/LoopThread.h diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 diff --git a/boot/Makefile b/boot/Makefile old mode 100755 new mode 100644 diff --git a/boot/bootsect.asm b/boot/bootsect.asm old mode 100755 new mode 100644 diff --git a/boot/setup.asm b/boot/setup.asm old mode 100755 new mode 100644 diff --git a/c_os/.clang-tidy b/c_os/.clang-tidy old mode 100755 new mode 100644 diff --git a/c_os/kernel/threads/Dispatch.cc b/c_os/kernel/threads/Dispatch.cc old mode 100755 new mode 100644 diff --git a/c_os/kernel/threads/Dispatch.h b/c_os/kernel/threads/Dispatch.h old mode 100755 new mode 100644 diff --git a/c_os/kernel/threads/IdleThread.h b/c_os/kernel/threads/IdleThread.h old mode 100755 new mode 100644 diff --git a/c_os/kernel/threads/Scheduler.cc b/c_os/kernel/threads/Scheduler.cc old mode 100755 new mode 100644 diff --git a/c_os/kernel/threads/Scheduler.h b/c_os/kernel/threads/Scheduler.h old mode 100755 new mode 100644 diff --git a/c_os/kernel/threads/Thread.asm b/c_os/kernel/threads/Thread.asm old mode 100644 new mode 100755 diff --git a/c_os/kernel/threads/Thread.cc b/c_os/kernel/threads/Thread.cc old mode 100644 new mode 100755 diff --git a/c_os/kernel/threads/Thread.h b/c_os/kernel/threads/Thread.h old mode 100755 new mode 100644 diff --git a/c_os/kernel/threads/Thread.inc b/c_os/kernel/threads/Thread.inc old mode 100644 new mode 100755 diff --git a/c_os/kernel/threads/ThreadState.h b/c_os/kernel/threads/ThreadState.h old mode 100644 new mode 100755 diff --git a/c_os/lib/Queue.h b/c_os/lib/Queue.h old mode 100755 new mode 100644 diff --git a/c_os/user/CoopThreadDemo.cc b/c_os/user/CoopThreadDemo.cc old mode 100755 new mode 100644 diff --git a/c_os/user/CoopThreadDemo.h b/c_os/user/CoopThreadDemo.h old mode 100755 new mode 100644 diff --git a/c_os/user/HelloWorldThread.cc b/c_os/user/HelloWorldThread.cc old mode 100755 new mode 100644 diff --git a/c_os/user/HelloWorldThread.h b/c_os/user/HelloWorldThread.h old mode 100755 new mode 100644 diff --git a/c_os/user/LoopThread.cc b/c_os/user/LoopThread.cc old mode 100755 new mode 100644 diff --git a/c_os/user/LoopThread.h b/c_os/user/LoopThread.h old mode 100755 new mode 100644 From d2e6a9f9b9fe489f53319b56bdd3b32e19395b54 Mon Sep 17 00:00:00 2001 From: ChUrl Date: Mon, 4 Jul 2022 11:23:15 +0200 Subject: [PATCH 04/16] Init flake --- .envrc | 4 ++++ flake.nix | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 .envrc create mode 100644 flake.nix diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..5e9005b --- /dev/null +++ b/.envrc @@ -0,0 +1,4 @@ +if ! has nix_direnv_version || ! nix_direnv_version 2.1.1; then + source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.1.1/direnvrc" "sha256-b6qJ4r34rbE23yWjMqbmu3ia2z4b2wIlZUksBke/ol0=" +fi +use flake diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..4f37ef9 --- /dev/null +++ b/flake.nix @@ -0,0 +1,24 @@ +{ + description = "A basic flake with a shell"; + + inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + + outputs = { self, nixpkgs, flake-utils }: + flake-utils.lib.eachDefaultSystem (system: + let pkgs = nixpkgs.legacyPackages.${system}; + in { + devShell = pkgs.mkShell { + # Native inputs run on host + nativeBuildInputs = with pkgs; [ + bashInteractive + gnumake + gcc + nasm + ]; + + # Build inputs are for target platform, app will be linked against those + buildInputs = with pkgs; [ ]; + }; + }); +} From 93f80f8d4b63e22b79bbbbdabfd08d2a48e93ae3 Mon Sep 17 00:00:00 2001 From: ChUrl Date: Mon, 4 Jul 2022 11:31:06 +0200 Subject: [PATCH 05/16] update flake --- flake.lock | 43 +++++++++++++++++++++++++++++++++++++++++++ flake.nix | 2 ++ 2 files changed, 45 insertions(+) create mode 100644 flake.lock diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..b058f65 --- /dev/null +++ b/flake.lock @@ -0,0 +1,43 @@ +{ + "nodes": { + "flake-utils": { + "locked": { + "lastModified": 1656065134, + "narHash": "sha256-oc6E6ByIw3oJaIyc67maaFcnjYOz1mMcOtHxbEf9NwQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "bee6a7250dd1b01844a2de7e02e4df7d8a0a206c", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1656755932, + "narHash": "sha256-TGThfOxr+HjFK464+UoUE6rClp2cwxjiKvHcBVdIGSQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "660ac43ff9ab1f12e28bfb31d4719795777fe152", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix index 4f37ef9..97cbf95 100644 --- a/flake.nix +++ b/flake.nix @@ -15,6 +15,8 @@ gnumake gcc nasm + glibc_multi + qemu ]; # Build inputs are for target platform, app will be linked against those From 8e7a0df43c58e4a922820ab682df83c633fce9ce Mon Sep 17 00:00:00 2001 From: ChUrl Date: Mon, 4 Jul 2022 11:31:17 +0200 Subject: [PATCH 06/16] ignore .direnv --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 349be1d..70fd963 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ boot/setup tools/build /c_os/.cache/ /c_os/dep/ +/.direnv/ From c043ae9df18e74b1e9130770d2e466094f64a2f5 Mon Sep 17 00:00:00 2001 From: ChUrl Date: Mon, 4 Jul 2022 13:21:09 +0200 Subject: [PATCH 07/16] disable extra stuff (allocator, scrollbackbuffer) --- c_os/devices/CGA_Stream.h | 5 +++-- c_os/devices/Keyboard.cc | 25 +++++++++++++------------ c_os/kernel/Globals.cc | 4 ++-- c_os/kernel/Globals.h | 4 ++-- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/c_os/devices/CGA_Stream.h b/c_os/devices/CGA_Stream.h index c3fb5dc..97675bb 100755 --- a/c_os/devices/CGA_Stream.h +++ b/c_os/devices/CGA_Stream.h @@ -15,7 +15,8 @@ #ifndef __CGA_Stream_include__ #define __CGA_Stream_include__ -#include "devices/BufferedCGA.h" +// #include "devices/BufferedCGA.h" +#include "devices/CGA.h" #include "lib/OutStream.h" // NOTE: I added this @@ -33,7 +34,7 @@ public: }; // NOTE: I added this (changed this) to use BufferedCGA -class CGA_Stream : public OutStream, public BufferedCGA { +class CGA_Stream : public OutStream, public CGA { private: CGA_Stream(CGA_Stream& copy) = delete; // Verhindere Kopieren diff --git a/c_os/devices/Keyboard.cc b/c_os/devices/Keyboard.cc index fce3400..657e62d 100755 --- a/c_os/devices/Keyboard.cc +++ b/c_os/devices/Keyboard.cc @@ -340,9 +340,10 @@ void Keyboard::trigger() { // NOTE: My keyboard has no delete key... if (key.ctrl_left() && key.alt_left() && (char)key == 'r') { this->reboot(); - } else if ((char)key == 'k' || (char)key == 'j') { - scroll_mode(key); } + // else if ((char)key == 'k' || (char)key == 'j') { + // scroll_mode(key); + // } } // TODO: Where to place this? @@ -350,13 +351,13 @@ void Keyboard::trigger() { // - Ereignisverwaltung, wo man Threads registrieren kann // - Blockierte Threads verwalten und aufwecken bei ereignissen // Waits for keys to control the scrollback buffer display -void scroll_mode(Key key) { - switch ((char)key) { - case 'k': - kout.scroll_page_backward(); - break; - case 'j': - kout.scroll_page_forward(); - break; - } -} +// void scroll_mode(Key key) { +// switch ((char)key) { +// case 'k': +// kout.scroll_page_backward(); +// break; +// case 'j': +// kout.scroll_page_forward(); +// break; +// } +// } diff --git a/c_os/kernel/Globals.cc b/c_os/kernel/Globals.cc index b84d58d..0764a05 100755 --- a/c_os/kernel/Globals.cc +++ b/c_os/kernel/Globals.cc @@ -17,9 +17,9 @@ Keyboard kb; // Tastatur IntDispatcher intdis; // Unterbrechungsverteilung PIC pic; // Interrupt-Controller unsigned int total_mem; // RAM total -// BumpAllocator allocator; +BumpAllocator allocator; // LinkedListAllocator allocator; -TreeAllocator allocator; +// TreeAllocator allocator; Scheduler scheduler; BIOS bios; // Schnittstelle zum 16-Bit BIOS VESA vesa; // VESA-Treiber diff --git a/c_os/kernel/Globals.h b/c_os/kernel/Globals.h index a1aa79b..561b28e 100755 --- a/c_os/kernel/Globals.h +++ b/c_os/kernel/Globals.h @@ -30,9 +30,9 @@ extern Keyboard kb; // Tastatur extern IntDispatcher intdis; // Unterbrechungsverteilung extern PIC pic; // Interrupt-Controller extern unsigned int total_mem; // RAM total -// extern BumpAllocator allocator; +extern BumpAllocator allocator; // extern LinkedListAllocator allocator; -extern TreeAllocator allocator; +// extern TreeAllocator allocator; extern Scheduler scheduler; extern BIOS bios; // Schnittstelle zum 16-Bit BIOS extern VESA vesa; // VESA-Treiber From 2341d7bd9520dee41194219951f13ada198582e8 Mon Sep 17 00:00:00 2001 From: ChUrl Date: Mon, 4 Jul 2022 13:21:28 +0200 Subject: [PATCH 08/16] reformat --- c_os/kernel/Paging.cc | 18 ++++++++++++------ c_os/kernel/Paging.h | 12 ++++++------ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/c_os/kernel/Paging.cc b/c_os/kernel/Paging.cc index 1f2b120..a45633f 100644 --- a/c_os/kernel/Paging.cc +++ b/c_os/kernel/Paging.cc @@ -31,18 +31,18 @@ * 0x25000: Altes ESP sichern, vor BIOS-Aufruf * * 0x26000: 16-Bit Code-Segment fuer BIOS-Aufurf * * System-Code * - * 0x100000: System-Code, kopiert nach Umschalten in * + * 0x100000: System-Code, kopiert nach Umschalten in * * den Protected Mode kopiert (GRUB kann nur * * an Adressen >1M laden) * * Globale Variablen: Direkt nach dem Code liegen die globalen * * Variablen. * * Paging: * - * 0x200000: Page-Directory * - * 0x201000: Page-Table * - * 0x202000: erste allozierbare Page (via Paging.cc) * - * 0x3FF000: Anfang der letzten allozierbaren Page * + * 0x200000: Page-Directory * + * 0x201000: Page-Table * + * 0x202000: erste allozierbare Page (via Paging.cc) * + * 0x3FF000: Anfang der letzten allozierbaren Page * * Heap: * - * 0x400000: Start-Adresse der Heap-Verwaltung * + * 0x400000: Start-Adresse der Heap-Verwaltung * * Ende: Letzte Adresse des phys. Speichers * * * * * @@ -107,6 +107,9 @@ unsigned int* pg_alloc_page() { void pg_write_protect_page(unsigned int* p_page) { /* hier muss Code eingefügt werden */ + + unsigned int mask = PAGE_WRITEABLE; // fill to 32bit + *p_page = *p_page & ~mask; // set writable to 0 } /***************************************************************************** @@ -117,6 +120,9 @@ void pg_write_protect_page(unsigned int* p_page) { void pg_notpresent_page(unsigned int* p_page) { /* hier muss Code eingefügt werden */ + + unsigned int mask = PAGE_PRESENT; + *p_page = *p_page & ~mask; // set present to 0 } /***************************************************************************** diff --git a/c_os/kernel/Paging.h b/c_os/kernel/Paging.h index 5abea90..3d48591 100644 --- a/c_os/kernel/Paging.h +++ b/c_os/kernel/Paging.h @@ -31,18 +31,18 @@ * 0x25000: Altes ESP sichern, vor BIOS-Aufruf * * 0x26000: 16-Bit Code-Segment fuer BIOS-Aufurf * * System-Code * - * 0x100000: System-Code, kopiert nach Umschalten in * + * 0x100000: System-Code, kopiert nach Umschalten in * * den Protected Mode kopiert (GRUB kann nur * * an Adressen >1M laden) * * Globale Variablen: Direkt nach dem Code liegen die globalen * * Variablen. * * Paging: * - * 0x200000: Page-Directory * - * 0x201000: Page-Table * - * 0x202000: erste allozierbare Page (via Paging.cc) * - * 0x3FF000: letzte allozierbare Page * + * 0x200000: Page-Directory * + * 0x201000: Page-Table * + * 0x202000: erste allozierbare Page (via Paging.cc) * + * 0x3FF000: letzte allozierbare Page * * Heap: * - * 0x400000: Start-Adresse der Heap-Verwaltung * + * 0x400000: Start-Adresse der Heap-Verwaltung * * Ende: Letzte Adresse des phys. Speichers * * * * * From a230ee84e170a578d795c339ac759530ba32160c Mon Sep 17 00:00:00 2001 From: ChUrl Date: Mon, 4 Jul 2022 13:21:43 +0200 Subject: [PATCH 09/16] reformat --- c_os/kernel/allocator/TreeAllocator.h | 2 +- c_os/kernel/interrupts/Bluescreen.cc | 2 +- c_os/kernel/interrupts/IntDispatcher.cc | 12 +++++------- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/c_os/kernel/allocator/TreeAllocator.h b/c_os/kernel/allocator/TreeAllocator.h index 48b0970..c2d46b4 100755 --- a/c_os/kernel/allocator/TreeAllocator.h +++ b/c_os/kernel/allocator/TreeAllocator.h @@ -45,7 +45,7 @@ private: void dump_free_memory(tree_block_t* node); - // NOTE: Would be nice to have this stuff somewhere else for general use, + // NOTE: Would be nice to have this stuff somewhere else for general use (scheduling?) // but that would require different rbt_node/dll_node structures. // If I need this again later I should move it. void rbt_rot_l(tree_block_t* x); diff --git a/c_os/kernel/interrupts/Bluescreen.cc b/c_os/kernel/interrupts/Bluescreen.cc index 8a39c63..1cd36b8 100644 --- a/c_os/kernel/interrupts/Bluescreen.cc +++ b/c_os/kernel/interrupts/Bluescreen.cc @@ -163,7 +163,7 @@ void bs_dump(unsigned int exceptionNr) { unsigned int has_error_code = 0; bs_clear(); - bs_print_string("HHUos crashed with Exception\0"); + bs_print_string("HHUos crashed with Exception \0"); // Exception mit Error-Code? if ((exceptionNr >= 8 && exceptionNr <= 14) || exceptionNr == 17 || exceptionNr == 30) { diff --git a/c_os/kernel/interrupts/IntDispatcher.cc b/c_os/kernel/interrupts/IntDispatcher.cc index 636105d..4230820 100755 --- a/c_os/kernel/interrupts/IntDispatcher.cc +++ b/c_os/kernel/interrupts/IntDispatcher.cc @@ -10,12 +10,11 @@ * * * Autor: Michael Schoettner, 31.8.2016 * *****************************************************************************/ +#include "kernel/interrupts/IntDispatcher.h" #include "kernel/CPU.h" #include "kernel/Globals.h" -#include "kernel/interrupts/IntDispatcher.h" #include "kernel/interrupts/Bluescreen.h" - extern "C" void int_disp(unsigned int slot); /***************************************************************************** @@ -35,17 +34,16 @@ void int_disp(unsigned int vector) { /* hier muss Code eingefuegt werden */ if (vector < 32) { bs_dump(vector); - cpu.halt (); + cpu.halt(); } - if (intdis.report (vector) < 0) { + if (intdis.report(vector) < 0) { kout << "Panic: unexpected interrupt " << vector; kout << " - processor halted." << endl; - cpu.halt (); - } + cpu.halt(); + } } - /***************************************************************************** * Konstruktor: IntDispatcher::IntDispatcher * *---------------------------------------------------------------------------* From a4283aba54bf974a2d10755fcbe6465b1ee27a6b Mon Sep 17 00:00:00 2001 From: ChUrl Date: Mon, 4 Jul 2022 13:21:47 +0200 Subject: [PATCH 10/16] disable extra stuff --- c_os/main.cc | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/c_os/main.cc b/c_os/main.cc index beef0a7..fe60587 100755 --- a/c_os/main.cc +++ b/c_os/main.cc @@ -11,6 +11,8 @@ *****************************************************************************/ #include "kernel/Globals.h" +#include "kernel/Paging.h" +#include "kernel/threads/IdleThread.h" #include "user/CoopThreadDemo.h" #include "user/HelloWorldThread.h" #include "user/VBEdemo.h" @@ -22,11 +24,11 @@ int main() { allocator.init(); // Initialize scrollback buffer after allocator.init() - kout.init(5); + // kout.init(5); // Startmeldung if constexpr (!DEBUG) { - kout << "HHUos 0.7\n" + kout << "HHUos 0.8\n" << "=========\n" << "Unterstuetzte Funktionen:\n" << " - Bildschirmausgaben\n" @@ -36,6 +38,7 @@ int main() { << " - Tastatureingaben per Interrupt\n" << " - Kooperative Threads\n" << " - VESA Graphics Mode\n" + << " - Paging\n" << endl; } @@ -47,18 +50,26 @@ int main() { /* hier muss Code eingefuegt werden */ cpu.enable_int(); - // text_demo(); - // sound_demo(); - // keyboard_demo(); - // heap_demo(); - // key_irq_demo(); - // coroutineDemo.main(); + // Activate paging + // Scheduler triggers bluescreen? + // pg_init(); - // Threads anlegen + // Trigger Bluescreen + // kout << "Trigger Bluescreen, if you can read this it didn't work" << endl; + + // BlueScreen 1 + // asm("int $3"); + + // BlueScreen 2 + // unsigned int* page = pg_alloc_page(); + // *page = 42; // Should work + // pg_write_protect_page(page); + // *page = 42; // should trigger BlueScreen + + // Demo threads anlegen // scheduler.ready(new HelloWorldThread()); // scheduler.ready(new CoopThreadDemo()); - - scheduler.ready(new VBEdemo()); + // scheduler.ready(new VBEdemo()); // Switch to VESA graphics mode // Scheduler starten (schedule() erzeugt den Idle-Thread) scheduler.schedule(); @@ -66,5 +77,6 @@ int main() { // TODO: Use templates for queue so threads don't have to be casted down from chain // TODO: Move scrollback control to thread + // Scheduler doesn't return return 0; } From 5b309bd3633f6fe2e895df5f21d1d65f11c83b9e Mon Sep 17 00:00:00 2001 From: ChUrl Date: Mon, 4 Jul 2022 13:25:22 +0200 Subject: [PATCH 11/16] build --- tools/build | Bin 17208 -> 38192 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tools/build b/tools/build index 9d69b4d1f86f98d2a0715c27fb1337dfff936c01..2fe2ee012a036453d3da288e1b9ce9ee4b59f124 100755 GIT binary patch literal 38192 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 From 2ec47752db0b6d5171c0ed2dccef3ccfb8c98711 Mon Sep 17 00:00:00 2001 From: ChUrl Date: Mon, 4 Jul 2022 13:25:41 +0200 Subject: [PATCH 12/16] flake --- flake.lock | 0 flake.nix | 11 ++++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) mode change 100644 => 100755 flake.lock mode change 100644 => 100755 flake.nix diff --git a/flake.lock b/flake.lock old mode 100644 new mode 100755 diff --git a/flake.nix b/flake.nix old mode 100644 new mode 100755 index 97cbf95..d38842c --- a/flake.nix +++ b/flake.nix @@ -14,9 +14,18 @@ bashInteractive gnumake gcc - nasm glibc_multi + nasm qemu + gdb + bear # To generate compilation database + + # TODO: Get clang tooling to work, in combination with fcc it can't find standard headers + # llvmPackages_14.clang-unwrapped + # clang_14 # LSP + formatting + # libcxxStdenv + # clang-tools_14 + # llvmPackages.libcxxClang # LSP + formatting ]; # Build inputs are for target platform, app will be linked against those From 455c9c555758d244caaad6c6c0302069a0247a1d Mon Sep 17 00:00:00 2001 From: ChUrl Date: Mon, 4 Jul 2022 13:43:49 +0200 Subject: [PATCH 13/16] disable any optimizations --- c_os/Makefile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/c_os/Makefile b/c_os/Makefile index 9f290b6..6ff6cc5 100755 --- a/c_os/Makefile +++ b/c_os/Makefile @@ -70,10 +70,13 @@ DELETE = rm ASM = nasm CC ?= gcc CXX ?= g++ -CFLAGS := $(CFLAGS) -m32 -march=i486 -Wall -fno-stack-protector -nostdlib -I. -g -ffreestanding -fno-pie -fno-pic -mpreferred-stack-boundary=2 -Wno-write-strings -mno-sse -mno-sse2 -mmanual-endbr -CXXFLAGS := $(CFLAGS) -Wno-non-virtual-dtor -fno-threadsafe-statics -fno-use-cxa-atexit -fno-rtti -fno-exceptions -std=c++17 + +# I added O0 to allow paging/bluescreen to work (We need the ebp on the stack) +CFLAGS := $(CFLAGS) -O0 -m32 -march=i486 -Wall -fno-stack-protector -nostdlib -I. -g -ffreestanding -fno-pie -fno-pic -mpreferred-stack-boundary=2 -Wno-write-strings -mno-sse -mno-sse2 -mmanual-endbr + # I added -std=c++17 for if constexpr, but it isn't necessary for anything critical # Needed for template concepts, but we don't have it available: -std=c++20 +CXXFLAGS := $(CFLAGS) -Wno-non-virtual-dtor -fno-threadsafe-statics -fno-use-cxa-atexit -fno-rtti -fno-exceptions -std=c++17 BOOT = ../boot TOOLS = ../tools From 7fe5d8e956056a2f2be7d74a2e60138bee7b493f Mon Sep 17 00:00:00 2001 From: ChUrl Date: Mon, 4 Jul 2022 14:54:14 +0200 Subject: [PATCH 14/16] fix treeallocator bug and reenable --- c_os/kernel/Globals.cc | 4 ++-- c_os/kernel/Globals.h | 4 ++-- c_os/kernel/allocator/TreeAllocator.cc | 9 ++++++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/c_os/kernel/Globals.cc b/c_os/kernel/Globals.cc index 0764a05..b84d58d 100755 --- a/c_os/kernel/Globals.cc +++ b/c_os/kernel/Globals.cc @@ -17,9 +17,9 @@ Keyboard kb; // Tastatur IntDispatcher intdis; // Unterbrechungsverteilung PIC pic; // Interrupt-Controller unsigned int total_mem; // RAM total -BumpAllocator allocator; +// BumpAllocator allocator; // LinkedListAllocator allocator; -// TreeAllocator allocator; +TreeAllocator allocator; Scheduler scheduler; BIOS bios; // Schnittstelle zum 16-Bit BIOS VESA vesa; // VESA-Treiber diff --git a/c_os/kernel/Globals.h b/c_os/kernel/Globals.h index 561b28e..a1aa79b 100755 --- a/c_os/kernel/Globals.h +++ b/c_os/kernel/Globals.h @@ -30,9 +30,9 @@ extern Keyboard kb; // Tastatur extern IntDispatcher intdis; // Unterbrechungsverteilung extern PIC pic; // Interrupt-Controller extern unsigned int total_mem; // RAM total -extern BumpAllocator allocator; +// extern BumpAllocator allocator; // extern LinkedListAllocator allocator; -// extern TreeAllocator allocator; +extern TreeAllocator allocator; extern Scheduler scheduler; extern BIOS bios; // Schnittstelle zum 16-Bit BIOS extern VESA vesa; // VESA-Treiber diff --git a/c_os/kernel/allocator/TreeAllocator.cc b/c_os/kernel/allocator/TreeAllocator.cc index 9c7c6bd..1ec58b2 100755 --- a/c_os/kernel/allocator/TreeAllocator.cc +++ b/c_os/kernel/allocator/TreeAllocator.cc @@ -10,6 +10,7 @@ void TreeAllocator::init() { this->free_start->left = NULL; this->free_start->right = NULL; this->free_start->parent = NULL; + this->free_start->red = false; // The root is always black this->free_start->next = (list_block_t*)this->free_start; this->free_start->previous = (list_block_t*)this->free_start; @@ -59,9 +60,6 @@ void* TreeAllocator::alloc(unsigned int req_size) { unsigned int size = this->get_size(best_fit); if constexpr (DEBUG) { kout << " - Found best-fit: " << hex << (unsigned int)best_fit << endl; } - // Remove the block first so we can insert correctly when cutting - // kout << " - Removing block from freelist" << endl; - this->rbt_remove(best_fit); if (size > HEAP_MIN_FREE_BLOCK_SIZE + rreq_size + sizeof(list_block_t)) { // Block can be cut if constexpr (DEBUG) { kout << " - Allocating " << dec << rreq_size << " Bytes with cutting" << endl; } @@ -77,6 +75,11 @@ void* TreeAllocator::alloc(unsigned int req_size) { // need to remove it from the freelist, which is done for both cases if constexpr (DEBUG) { kout << " - Allocating " << dec << rreq_size << " Bytes without cutting" << endl; } } + // Remove the old block from the freelist + // BUG: If the first allocation allocates the whole heap, this removal will crash the paging + // as the freelist will no longer contain any notes, gives NullPointerException as it's not handled + // kout << " - Removing block from freelist" << endl; + this->rbt_remove(best_fit); if constexpr (DEBUG) { kout << " - Returned address " << hex << (unsigned int)((char*)best_fit + sizeof(list_block_t)) << endl; } return (void*)((char*)best_fit + sizeof(list_block_t)); From 1f01a561a36caee80202a8d10031a9046083cd46 Mon Sep 17 00:00:00 2001 From: ChUrl Date: Mon, 4 Jul 2022 14:54:25 +0200 Subject: [PATCH 15/16] fix scheduling bug when only 1 thread is available --- c_os/kernel/threads/Scheduler.cc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/c_os/kernel/threads/Scheduler.cc b/c_os/kernel/threads/Scheduler.cc index 35af795..dead80a 100644 --- a/c_os/kernel/threads/Scheduler.cc +++ b/c_os/kernel/threads/Scheduler.cc @@ -96,10 +96,12 @@ void Scheduler::yield() { /* hier muss Code eingefuegt werden */ - // if (this->readyQueue.isEmpty()) { - // // Idle thread running - // return; - // } + // When only one thread exists (IdleThread) it can't yield as the readyqueue becomes empty + // and this is not handled anywhere else + if (this->readyQueue.isEmpty()) { + // Idle thread running + return; + } Thread& next = *(Thread*)this->readyQueue.dequeue(); this->readyQueue.enqueue(this->get_active()); From cfa6265cee8b4483ac7ac9377406e66fea1b492e Mon Sep 17 00:00:00 2001 From: ChUrl Date: Mon, 4 Jul 2022 14:54:59 +0200 Subject: [PATCH 16/16] enable paging --- c_os/main.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/c_os/main.cc b/c_os/main.cc index fe60587..d213b14 100755 --- a/c_os/main.cc +++ b/c_os/main.cc @@ -51,8 +51,9 @@ int main() { cpu.enable_int(); // Activate paging - // Scheduler triggers bluescreen? - // pg_init(); + // This has to happen after the allocator is initialized but before the scheduler is started + // TODO: Scheduler triggers bluescreen? + pg_init(); // Trigger Bluescreen // kout << "Trigger Bluescreen, if you can read this it didn't work" << endl; @@ -68,7 +69,7 @@ int main() { // Demo threads anlegen // scheduler.ready(new HelloWorldThread()); - // scheduler.ready(new CoopThreadDemo()); + scheduler.ready(new CoopThreadDemo()); // scheduler.ready(new VBEdemo()); // Switch to VESA graphics mode // Scheduler starten (schedule() erzeugt den Idle-Thread)