diff options
| -rw-r--r-- | Makefile | 6 | ||||
| -rw-r--r-- | README.md | 8 | ||||
| -rw-r--r-- | bochsrc | 2 | ||||
| -rw-r--r-- | boot/mbr.asm | 5 | ||||
| -rw-r--r-- | boot/vesa_setup_16.asm | 2 | ||||
| -rw-r--r-- | kernel/console.c | 3 | ||||
| -rw-r--r-- | kernel/interrupts.c | 4 | ||||
| -rw-r--r-- | kernel/kernel.c | 29 | ||||
| -rw-r--r-- | kernel/keyboard.c | 7 | ||||
| -rw-r--r-- | kernel/mem.c | 40 | ||||
| -rw-r--r-- | kernel/pci.c | 8 | ||||
| -rw-r--r-- | kernel/shell.c | 11 | ||||
| -rw-r--r-- | kernel/vesa.c | 5 | ||||
| -rw-r--r-- | kernel/vmem.c | 146 | ||||
| -rw-r--r-- | kernel/x86.c | 14 | ||||
| -rw-r--r-- | kernel/x86.h | 2 | ||||
| -rw-r--r-- | lib/logger/log.c | 14 | ||||
| -rw-r--r-- | lib/logger/log.h | 1 |
18 files changed, 259 insertions, 48 deletions
@@ -45,7 +45,7 @@ kernel_entry.o: boot/kernel_entry.asm kernel.o: kernel/kernel.c kernel/console.h - gcc -ffreestanding -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0 + gcc -ffreestanding -std=gnu99 -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0 x86.o: kernel/x86.c gcc -ffreestanding -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0 @@ -54,10 +54,10 @@ floppy.o: kernel/floppy.c gcc -ffreestanding -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0 vmem.o: kernel/vmem.c - gcc -ffreestanding -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0 + gcc -ffreestanding -std=gnu99 -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0 mem.o: kernel/mem.c - gcc -ffreestanding -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0 + gcc -ffreestanding --std=gnu99 -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0 e1000.o: kernel/e1000.c gcc -ffreestanding -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0 @@ -24,12 +24,15 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Notes +----- + Features -------- All features are only very rudiemntary and buggy. -* Runs in bochs (with cirrus) and virtual box. +* Runs in bochs (with cirrus), qemu and virtual box (disable nested paging etc) * PIT support / Timing * PIC support & Interrupt handling framework * PCI bus scanning @@ -79,6 +82,7 @@ FLOPPY IMAGE RAM --- + 0x1000 boot loader puts the kernel binary here. @@ -105,6 +109,8 @@ RAM 0xb000 memory above this is used for dma (by our floppy.c driver) +0x9000 + esp REFERENCES @@ -220,7 +220,7 @@ romimage: file=/home/miguel/opt/bochs-2.6.6/bios/BIOS-bochs-latest # used all allocated host memory and wants more. # #======================================================================= -memory: guest=1024, host=1024 +memory: guest=16, host=1024 #======================================================================= # OPTROMIMAGE[1-4]: diff --git a/boot/mbr.asm b/boot/mbr.asm index 4dd82d1..96fc788 100644 --- a/boot/mbr.asm +++ b/boot/mbr.asm @@ -49,6 +49,7 @@ MEMMAP_OFFSET equ 0x7c00+0x400 VESA_MODES equ 0x8300 VESA_MODE_INFO equ 0x8400 VESA_MODE_SELECT equ 0x4114 +;VESA_MODE_SELECT equ 0x0 jmp boot_16 ;start boot process @@ -62,7 +63,7 @@ VESA_CHECK1: VESA_CHECK2: db " V2",0 VESA_CHECK3: - db " V2",0 + db " V3",0 CHECK_A20: db " A20",0 @@ -117,7 +118,7 @@ boot_16: a20check: - mov bx, STR_VERSION + mov bx, CHECK_A20 call print_string call check_a20 diff --git a/boot/vesa_setup_16.asm b/boot/vesa_setup_16.asm index 4f276b5..7180252 100644 --- a/boot/vesa_setup_16.asm +++ b/boot/vesa_setup_16.asm @@ -17,6 +17,7 @@ VesaSetup: vesa_ok: ; + ;VESA: get vesa info on mode of interest mov ax,0 ; set target address in es:di (0:offset) mov es,ax @@ -32,6 +33,7 @@ VesaSetup: jmp vesa_err2 vesa_ok2: + ;VESA: finally switch to the mode of choice! mov ax,0x4f02 ;vesa function: Set Mode mov bx,VESA_MODE_SELECT diff --git a/kernel/console.c b/kernel/console.c index b1a9125..72ad066 100644 --- a/kernel/console.c +++ b/kernel/console.c @@ -1,6 +1,7 @@ #include "console.h" -#define FOOLOS_CONSOLE +//#define FOOLOS_CONSOLE +//#undef FOOLOS_CONSOLE static int posx=0; static int posy=0; diff --git a/kernel/interrupts.c b/kernel/interrupts.c index 167f0ad..348972e 100644 --- a/kernel/interrupts.c +++ b/kernel/interrupts.c @@ -51,8 +51,6 @@ void int_def_handler() int_unhandled++; X86_IRQ_END - - } //set a handler for a specific interrupt @@ -79,7 +77,7 @@ void int_init(uint16_t sel) int_install_ir(i, 0b10001110, sel,&int_def_handler); } - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"initializing..."); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"initializing. IDT: 0x%08x, IDTD: 0x%08X",&idt,&idtd); } void int_install() diff --git a/kernel/kernel.c b/kernel/kernel.c index 7d9b848..2dd57fd 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -25,13 +25,14 @@ void int_test_handler_worker() { // this can not be called directly from interrupt handler // due to optional parameters (...) probably! - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"irq 88"); + panic(FOOLOS_MODULE_NAME,"unhandled EXCEPTION!"); } void int_test_handler() { X86_IRQ_BEGIN int_test_handler_worker(); sleep(30); + while(1); // hang! X86_IRQ_END } @@ -55,17 +56,23 @@ void kernel_main() // while the last one is set in the Makefile. The font binary // is integrated in the kernel image. // - vesa_init(0x8300,0x8400,0x7200); + // this function returns the physical base address of + // our video memory + // + uint32_t vesa_physbase=vesa_init(0x8300,0x8400,0x7200); // // PIT config (timer) timer_init(); + // we know that here, the bootloader placed the mamory map! mem_init(0x7c00+0x400,*((uint16_t *)(0x7c00+0x600))); - // paging (Todo) - vmem_init(); + // paging (pass the vesa physbase address for identity mapping) + vmem_init(vesa_physbase); + + // // init and interrupt decriptor table int_init(0x08); @@ -90,10 +97,15 @@ void kernel_main() // install test software interrupt handler int_install_ir(88, 0b10001110, 0x08,&int_test_handler); + + for(int i=0;i<19;i++) + int_install_ir(i, 0b10001110, 0x08,&int_test_handler); // now we can enable interrupts back again int_enable(); +// int x=10/0; + // pci pci_init(); @@ -116,6 +128,15 @@ void kernel_main() log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"test mem %x",*(memtest2+1)); */ + /* stack pointer test? + uint32_t *esp=0x90000; + for(int i=0;i<10;i++) + { + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"esp: %x",*esp); + esp--; + } + */ + while(1); // never ending loop diff --git a/kernel/keyboard.c b/kernel/keyboard.c index ede71a2..7b08098 100644 --- a/kernel/keyboard.c +++ b/kernel/keyboard.c @@ -1,18 +1,15 @@ #include "kernel.h" #include "x86.h" #include "console.h" + #include "../lib/logger/log.h" // logger facilities #define FOOLOS_MODULE_NAME "keyboard" /// keyboard driver //// - -//static int cursor=0; -//static char last_code=0; - void keyboard_handle(uint8_t in) { - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"scancode 0x%x",in); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"scancode 0x%x",in); int i=0; // diff --git a/kernel/mem.c b/kernel/mem.c index b761c8c..4896272 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -38,6 +38,39 @@ int mmap_test(int bit) return _mmngr_memory_map[bit / 32] & (1 << (bit % 32)); } +void mmap_show_free () +{ + + int last_pos=0; + uint32_t last=_mmngr_memory_map[0]; + + for (int i=1; i< MEM_BITMAP_SIZE ; i++) + { + if (_mmngr_memory_map[i] != last||i==MEM_BITMAP_SIZE-1) + { + + if(last==0) + { + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d -%d free",last_pos*32,i*32); + } + else if(last==0xffffffff) + { + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d -%d full",last_pos*32,i*32); + } + else + { + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d -%d some free",last_pos*32,i*32); + } + + last_pos=i; + last=_mmngr_memory_map[i]; + + + } + } + +} + // int mmap_first_free () { @@ -61,6 +94,7 @@ int mmap_first_free () } + void pmmngr_init () { //! By default, all of memory is in use @@ -107,7 +141,7 @@ void* pmmngr_alloc_block () if (frame == -1) { - scr_put_string_nl("OUT OF MEM!"); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"OUT OF MEMORY"); return 0; //out of memory } @@ -231,7 +265,7 @@ void mem_init(uint16_t *memmap,uint16_t entries) #ifdef MEM_PRINT_MEMORYMAP - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%x : 0x%08x - 0x%08x", + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"type: %02d / range: 0x%08x - 0x%08x", memmap[8], (((uint32_t)memmap[1])<<16)+memmap[0], (((uint32_t)memmap[1])<<16)+memmap[0] @@ -249,7 +283,7 @@ void mem_init(uint16_t *memmap,uint16_t entries) } - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Available Mem: %d bytes.",avail_mem); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Available Mem: %d bytes. (~%d MB)",avail_mem,avail_mem/1024/1024); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Available 4K blocks: %d blocks.",mem_free_blocks); } diff --git a/kernel/pci.c b/kernel/pci.c index c8bd95d..c1e6753 100644 --- a/kernel/pci.c +++ b/kernel/pci.c @@ -85,11 +85,11 @@ uint16_t pciCheck(uint8_t bus, uint8_t slot) { // uint16_t irq=pciConfigReadWord(bus,slot,0,0x3C); // uint16_t irq2=pciConfigReadWord(bus,slot,0,0x3E); - init_e1000(); +// init_e1000(); - test_bar(bus,slot,0x10); - test_bar(bus,slot,0x14); - test_bar(bus,slot,0x18); +// test_bar(bus,slot,0x10); +// test_bar(bus,slot,0x14); +// test_bar(bus,slot,0x18); // scr_put_hex(irq); // scr_put_hex(irq2); diff --git a/kernel/shell.c b/kernel/shell.c index 45e8620..aff2dc4 100644 --- a/kernel/shell.c +++ b/kernel/shell.c @@ -20,7 +20,7 @@ void shell_init() void shell_put(char x) { - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"char:%c",x); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"char:%c",x); if(pos<COMMAND_LENGTH-2); @@ -65,6 +65,15 @@ void shell_execute() { int_generate88(); } + else if(1==strcmp(command,"MEM")) + { + mmap_show_free(); + } + else if(1==strcmp(command,"ALLOC")) + { + uint32_t *malloc= pmmngr_alloc_block(); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"allocated 4KB block at: %08x.",malloc); + } else if(1==strcmp(command,"READ")) { uint8_t *read= flpydsk_read_sector (10); diff --git a/kernel/vesa.c b/kernel/vesa.c index 048dbf1..b7b4615 100644 --- a/kernel/vesa.c +++ b/kernel/vesa.c @@ -57,7 +57,7 @@ static console_y; static console_lines; static console_cols; -void vesa_init(vbeinfo *info,vbemodeinfo *mode,foolfont *rawfont) +uint32_t vesa_init(vbeinfo *info,vbemodeinfo *mode,foolfont *rawfont) { //the only functionallu important init lines! (rest is log) VbeModeInfoBlock=mode; @@ -90,10 +90,13 @@ void vesa_init(vbeinfo *info,vbemodeinfo *mode,foolfont *rawfont) while(*modeptr!=0xffff&&*modeptr!=0) { log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"mode supported : 0x%x", (*modeptr)); + scr_put_hex(*modeptr); modeptr++; } #endif + return VbeModeInfoBlock->physbase; + } void PutPixel(int x,int y, int color){ diff --git a/kernel/vmem.c b/kernel/vmem.c index 9d34810..b1ecfa1 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -1,5 +1,12 @@ +// http://www.brokenthorn.com/Resources/OSDev18.html + #include "kernel.h" +#include "x86.h" +#include "../lib/logger/log.h" // logger facilities +#define FOOLOS_MODULE_NAME "vmem" + +// TODO : why is the frame not 0xfffff?? enum PAGE_PTE_FLAGS { I86_PTE_PRESENT = 1, //0000000000000000000000000000001 @@ -12,7 +19,7 @@ enum PAGE_PTE_FLAGS { I86_PTE_PAT = 0x80, //0000000000000000000000010000000 I86_PTE_CPU_GLOBAL = 0x100, //0000000000000000000000100000000 I86_PTE_LV4_GLOBAL = 0x200, //0000000000000000000001000000000 - I86_PTE_FRAME = 0x7FFFF000 //1111111111111111111000000000000 + I86_PTE_FRAME = 0xFFFFF000 //1111111111111111111000000000000 }; enum PAGE_PDE_FLAGS { @@ -27,7 +34,7 @@ enum PAGE_PDE_FLAGS { I86_PDE_4MB = 0x80, //0000000000000000000000010000000 I86_PDE_CPU_GLOBAL = 0x100, //0000000000000000000000100000000 I86_PDE_LV4_GLOBAL = 0x200, //0000000000000000000001000000000 - I86_PDE_FRAME = 0x7FFFF000 //1111111111111111111000000000000 + I86_PDE_FRAME = 0xFFFFF000 //1111111111111111111000000000000 }; //! page table entry @@ -62,53 +69,65 @@ typedef uint8_t bool; #define PAGE_SIZE 4096 //! page table -struct ptable { +typedef struct ptable_struct { pt_entry m_entries[PAGES_PER_TABLE]; -}; +}ptable ; //! page directory -struct pdirectory { +typedef struct pdirectory_struct { pd_entry m_entries[PAGES_PER_DIR]; -}; +}pdirectory; -void pt_entry_add_attrib (pt_entry* e, uint32_t attrib) +void pt_entry_add_attrib (pt_entry* e, uint32_t attrib) { + *e|=attrib; } -void pt_entry_del_attrib (pt_entry* e, uint32_t attrib) +void pt_entry_del_attrib (pt_entry* e, uint32_t attrib) { + *e&=~attrib; } -void pt_entry_set_frame (pt_entry* e , physical_addr addr) +void pt_entry_set_frame (pt_entry* e , physical_addr addr) { + // *e = (*e & ~I86_PTE_FRAME) | addr; + + *e|=I86_PTE_FRAME&addr; + } -bool pt_entry_is_present (pt_entry e) +bool pt_entry_is_present (pt_entry e) { - return 1; + return e&I86_PTE_PRESENT; } -bool pt_entry_is_writable (pt_entry e) + +bool pt_entry_is_writable (pt_entry e) { - return 1; + return e&I86_PTE_WRITABLE; } -physical_addr pt_entry_pfn (pt_entry e) + +physical_addr pt_entry_pfn (pt_entry e) { - return 1; + return e&I86_PTE_FRAME; } void pd_entry_add_attrib (pd_entry* e, uint32_t attrib) { + *e|=attrib; } void pd_entry_del_attrib (pd_entry* e, uint32_t attrib) { + *e&=~attrib; } void pd_entry_set_frame (pd_entry* e, physical_addr add) { + *e|=I86_PDE_FRAME&add; } bool pd_entry_is_present (pd_entry e) { - return 1; + return e&I86_PDE_PRESENT; } +/* bool pd_entry_is_user (pd_entry e) { return 1; @@ -118,20 +137,23 @@ bool pd_entry_is_4mb (pd_entry e) { return 1; } +*/ bool pd_entry_is_writable (pd_entry e) { - return 1; + return e&I86_PDE_WRITABLE; } physical_addr pd_entry_pfn (pd_entry e) { - return 1; + return e&I86_PDE_FRAME; } +/* void pd_entry_enable_global (pd_entry e) { } +*/ uint8_t vmmngr_alloc_page (pt_entry* e) { @@ -148,8 +170,94 @@ uint8_t vmmngr_alloc_page (pt_entry* e) return 1; } -void vmem_init() +void vmmngr_free_page (pt_entry* e) +{ + void* p = (void*)pt_entry_pfn (*e); + if (p) + pmmngr_free_block (p); + + pt_entry_del_attrib (e, I86_PTE_PRESENT); +} + +pt_entry* vmmngr_ptable_lookup_entry (ptable* p, virtual_addr addr) +{ + + if (p) + return &p->m_entries[ PAGE_TABLE_INDEX (addr) ]; + + return 0; +} + +// TODO !? http://www.brokenthorn.com/Resources/OSDev18.html +void vmmngr_map_page (void* phys, void* virt) +{ + +} + +void vmem_init(uint32_t vesa_physbase) { + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging (vesa base: 0x%08x)",vesa_physbase); + + ptable* table1 = (ptable*) pmmngr_alloc_block (); + + if (!table1)panic(FOOLOS_MODULE_NAME,"unable to alloc table1"); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table1: 0x%X",table1); + + ptable* table2 = (ptable*) pmmngr_alloc_block (); + + if (!table1)panic(FOOLOS_MODULE_NAME,"unable to alloc table2"); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table2: 0x%X",table2); + + // TODO: 3blocks? + pdirectory* dir = (pdirectory*) pmmngr_alloc_block (); + if (!dir)panic(FOOLOS_MODULE_NAME,"unable to alloc pdirectory"); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"pdirectory: 0x%X",dir); + + //! map 1mb to 3gb (where we are at) + for (int i=0, frame=vesa_physbase, virt=vesa_physbase; i<1024; i++, frame+=4096, virt+=4096) { + + //! create a new page + pt_entry page=0; + pt_entry_add_attrib (&page, I86_PTE_PRESENT); + pt_entry_set_frame (&page, frame); + + //! ...and add it to the page table + table1->m_entries [PAGE_TABLE_INDEX (virt) ] = page; + } + + //! 1st 4mb are idenitity mapped + for (int i=0, frame=0x0, virt=0x00000000; i<1024; i++, frame+=4096, virt+=4096) + { + + //! create a new page + pt_entry page=0; + pt_entry_add_attrib (&page, I86_PTE_PRESENT); + pt_entry_set_frame (&page, frame); + + //! ...and add it to the page table + table2->m_entries [PAGE_TABLE_INDEX (virt) ] = page; + } + + + pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (vesa_physbase) ]; + *entry=0; + pd_entry_add_attrib (entry, I86_PDE_PRESENT); + pd_entry_add_attrib (entry, I86_PDE_WRITABLE); + pd_entry_set_frame (entry, (physical_addr)table1); + + + pd_entry* entry2 = &dir->m_entries [PAGE_DIRECTORY_INDEX (0x00000000) ]; + *entry2=0; + pd_entry_add_attrib (entry2, I86_PDE_PRESENT); + pd_entry_add_attrib (entry2, I86_PDE_WRITABLE); + pd_entry_set_frame (entry2, (physical_addr)table2); + + + x86_set_pdbr(dir); + + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"enabling paging..."); + x86_paging_enable(); + } diff --git a/kernel/x86.c b/kernel/x86.c index ee38599..cc7c303 100644 --- a/kernel/x86.c +++ b/kernel/x86.c @@ -36,3 +36,17 @@ uint32_t x86_inl(int port) return data; } + +void x86_set_pdbr(uint32_t addr) +{ + asm volatile("mov %0, %%cr3":: "b"(addr)); + +} + +void x86_paging_enable() +{ + unsigned int cr0; + asm volatile("mov %%cr0, %0": "=b"(cr0)); + cr0 |= 0x80000000; + asm volatile("mov %0, %%cr0":: "b"(cr0)); +} diff --git a/kernel/x86.h b/kernel/x86.h index 2b7572c..3233124 100644 --- a/kernel/x86.h +++ b/kernel/x86.h @@ -16,5 +16,7 @@ void x86_outw(int port, uint16_t data); uint16_t x86_inw(int port); void x86_outl(int port, uint32_t data); uint32_t x86_inl(int port); +void x86_set_pdbr(uint32_t addr); +void x86_paging_enable(); #endif diff --git a/lib/logger/log.c b/lib/logger/log.c index 3a6606e..fd226e5 100644 --- a/lib/logger/log.c +++ b/lib/logger/log.c @@ -19,3 +19,17 @@ void log(char *module_name, int log_level, char *format_string, ...) } +void panic(char *module_name, char *format_string) +{ + + PutConsole("!! KERNEL PANIC !! ",0b1111100000000000,0); + PutConsole(module_name,0b1111100000000000,0); + PutConsole(" : ",0b0000011111100000,0); + PutConsole(format_string,0b1111100000000000,0); + + + while(1); // halt + + + +} diff --git a/lib/logger/log.h b/lib/logger/log.h index 9c32a39..251c66f 100644 --- a/lib/logger/log.h +++ b/lib/logger/log.h @@ -6,6 +6,7 @@ #define FOOLOS_LOG_FINE 1 void log(char *module_name, int prio, char *format_string, ...); +void panic(char *module_name, char *format_string); #endif |
