From c72944b5646863ffaaaff94dc03b939a08566203 Mon Sep 17 00:00:00 2001 From: Miguel Date: Wed, 12 Sep 2018 15:23:38 +0200 Subject: struggling with vmem --- asm/asm_usermode.S | 39 +++++++++++++++++++++++++++++++++++++ asm/asm_usermode.s | 39 ------------------------------------- driver/mouse.c | 1 + driver/pci.c | 1 + driver/timer.c | 1 + driver/vesa.c | 1 + fs/elf.c | 1 + fs/ext2.c | 1 + kernel/acpi.c | 1 + kernel/acpi.h | 1 + kernel/apic.c | 1 + kernel/exceptions.c | 1 + kernel/fifo.c | 4 ++-- kernel/gdt.c | 1 + kernel/interrupts.c | 3 ++- kernel/kernel.c | 1 + kernel/kernel.h | 46 +++++++++++++++++++++---------------------- kernel/kmalloc.c | 3 ++- kernel/log.h | 15 ++++++++++++++ kernel/mem.c | 1 + kernel/multiboot.c | 1 + kernel/scheduler.c | 5 +---- kernel/smashing.c | 1 + kernel/smp.c | 1 + kernel/syscalls.c | 1 + kernel/vmem.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++---- test/selftest.c | 1 + 27 files changed, 154 insertions(+), 74 deletions(-) create mode 100644 asm/asm_usermode.S delete mode 100644 asm/asm_usermode.s diff --git a/asm/asm_usermode.S b/asm/asm_usermode.S new file mode 100644 index 0000000..a07f480 --- /dev/null +++ b/asm/asm_usermode.S @@ -0,0 +1,39 @@ +.global asm_usermode + +asm_usermode: + + mov 0x4(%esp),%edx //get adress of passed : void func() + //to be called in ring 3 + + // 0x23 is user data segment (|2 low bits) + // 0x1b is user code segment (|2 low bits) + + // set segment registers + mov $0x23, %ax + mov %ax, %ds + mov %ax, %es + mov %ax, %fs + mov %ax, %gs + + // ss is handled by iret + + mov %esp, %eax + + pushl $0x23 // user data segment + //pushl $0x8fff000-3*32 //%eax // current stack + pushl $0xe0000000-3*32 //%eax // current stack (3 values will be poped) we subst 4 to align + pushf // + + // http://x86.renejeschke.de/html/file_module_x86_id_145.html + //mov $0x200, %eax + //push %eax // eflags image + pushl $0x1B // return code segment selector + push %edx // return instruction pointer + + iret + + jmp . // never to be reached + + + + diff --git a/asm/asm_usermode.s b/asm/asm_usermode.s deleted file mode 100644 index 147dfe5..0000000 --- a/asm/asm_usermode.s +++ /dev/null @@ -1,39 +0,0 @@ -.global asm_usermode - -asm_usermode: - - mov 0x4(%esp),%edx //get adress of passed : void func() - //to be called in ring 3 - - // 0x23 is user data segment (|2 low bits) - // 0x1b is user code segment (|2 low bits) - - // set segment registers - mov $0x23, %ax - mov %ax, %ds - mov %ax, %es - mov %ax, %fs - mov %ax, %gs - - // ss is handled by iret - - mov %esp, %eax - - pushl $0x23 // user data segment - //pushl $0x8fff000-3*32 //%eax // current stack - pushl $0xe0000000-3*32 //%eax // current stack (3 values will be poped) - pushf // - - // http://x86.renejeschke.de/html/file_module_x86_id_145.html - //mov $0x200, %eax - //push %eax // eflags image - pushl $0x1B // return code segment selector - push %edx // return instruction pointer - - iret - - jmp . // never to be reached - - - - diff --git a/driver/mouse.c b/driver/mouse.c index b9e0079..2b767b7 100644 --- a/driver/mouse.c +++ b/driver/mouse.c @@ -1,4 +1,5 @@ #include "kernel/kernel.h" +#include "log.h" #include "mouse.h" #include "driver/vesa.h" diff --git a/driver/pci.c b/driver/pci.c index e8d8b23..1e2f660 100644 --- a/driver/pci.c +++ b/driver/pci.c @@ -1,6 +1,7 @@ #include "kernel/kernel.h" +#include "log.h" #include "asm_x86.h" #include "e1000.h" diff --git a/driver/timer.c b/driver/timer.c index 7f9859c..30a30c6 100644 --- a/driver/timer.c +++ b/driver/timer.c @@ -1,4 +1,5 @@ #include "kernel.h" +#include "log.h" #include "timer.h" #include "asm_x86.h" diff --git a/driver/vesa.c b/driver/vesa.c index 1bd4b7a..c882595 100644 --- a/driver/vesa.c +++ b/driver/vesa.c @@ -1,4 +1,5 @@ #include "kernel/kernel.h" +#include "log.h" //http://wiki.osdev.org/GUI #include diff --git a/fs/elf.c b/fs/elf.c index 2603e2f..851c7e8 100644 --- a/fs/elf.c +++ b/fs/elf.c @@ -1,4 +1,5 @@ #include "kernel/kernel.h" +#include "log.h" #include #include "ext2.h" #include "lib/string/string.h" diff --git a/fs/ext2.c b/fs/ext2.c index 7562cf0..b062973 100644 --- a/fs/ext2.c +++ b/fs/ext2.c @@ -1,4 +1,5 @@ #include "kernel/kernel.h" +#include "log.h" // ext2 minidriver // based on osdev wiki article: http://wiki.osdev.org/Ext2 // diff --git a/kernel/acpi.c b/kernel/acpi.c index 67f31fb..b6370c3 100644 --- a/kernel/acpi.c +++ b/kernel/acpi.c @@ -1,4 +1,5 @@ #include "kernel.h" +#include "log.h" #include "acpi.h" #include diff --git a/kernel/acpi.h b/kernel/acpi.h index e94766c..204007c 100644 --- a/kernel/acpi.h +++ b/kernel/acpi.h @@ -14,6 +14,7 @@ */ #include +#include typedef struct { diff --git a/kernel/apic.c b/kernel/apic.c index 7899c82..3ec10b9 100644 --- a/kernel/apic.c +++ b/kernel/apic.c @@ -1,4 +1,5 @@ #include "kernel.h" +#include "log.h" #include "apic.h" #include "interrupts.h" #include "asm_pit.h" diff --git a/kernel/exceptions.c b/kernel/exceptions.c index 0c8f6af..f56536b 100644 --- a/kernel/exceptions.c +++ b/kernel/exceptions.c @@ -1,5 +1,6 @@ #include "kernel.h" #include "exceptions.h" +#include "log.h" #include "asm_x86.h" #include "smp.h" diff --git a/kernel/fifo.c b/kernel/fifo.c index 73df8b1..fadd248 100644 --- a/kernel/fifo.c +++ b/kernel/fifo.c @@ -1,8 +1,8 @@ - +#include "kernel.h" +#include "log.h" #include "fifo.h" #include "ringbuffer.h" -#include "kernel.h" #include diff --git a/kernel/gdt.c b/kernel/gdt.c index 24b52f7..447db20 100644 --- a/kernel/gdt.c +++ b/kernel/gdt.c @@ -1,4 +1,5 @@ #include "kernel.h" +#include "log.h" #include "gdt.h" #include "asm_gdt.h" #include "kmalloc.h" diff --git a/kernel/interrupts.c b/kernel/interrupts.c index 59d20c1..5e67105 100644 --- a/kernel/interrupts.c +++ b/kernel/interrupts.c @@ -1,4 +1,5 @@ -#include "kernel/kernel.h" +#include "kernel.h" +#include "log.h" #include "asm_int.h" #include "asm_pit.h" #include "driver/mouse.h" diff --git a/kernel/kernel.c b/kernel/kernel.c index 8680e7d..ef9a08d 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -1,4 +1,5 @@ #include "kernel.h" +#include "log.h" #include "serial.h" #include "asm_pic.h" diff --git a/kernel/kernel.h b/kernel/kernel.h index 0010692..1da1209 100644 --- a/kernel/kernel.h +++ b/kernel/kernel.h @@ -18,7 +18,6 @@ REFERENCES https://sourceware.org/newlib/ and many many more... */ -#include "log.h" #ifndef FOOLOS_CONFIG_H #define FOOLOS_CONFIG_H @@ -44,31 +43,32 @@ REFERENCES #define SMP_MAX_PROC 16 // 16 (together with bsp) We can currently only address a maximum of 16 cpus via ipis! // Virtual Memory Locations // -// NOTE THAT THE STACKS GROWN DOWNWARDS // +// REMEMBER THAT THE STACKS GROW DOWNWARDS // +// We leave some space around them +// 1 page 0x1000 bytes +// 8192 pages = 0x2000000 bytes + #define VMEM_KERNEL 0x00000000 // 8192 pages (32megs) / identity mapped +#define VMEM_KERNEL_END 0x02000000 -#define VMEM_USER_ENV 0x07000000 // 4 pages / per user process +#define VMEM_USER_ENV 0x07000000 // ? pages / per user process #define VMEM_USER_PROG 0x08048000 // ? pages / per user process (usual entry: 0x8048080) -#define VMEM_USER_STACK_TOP 0xE0000000 // ? pages / per thread - -#define VMEM_LAPIC 0xE0000000 // 1 pages / identity mapped -#define VMEM_IOAPIC 0xE0001000 // 1 pages / identity mapped -#define VMEM_CPU_PRIVATE 0xE0002000 // 4 pages / per cpu -#define VMEM_CPU_STACK_TOP 0xE000A000 // 4 pages / per cpu -#define VMEM_FRAMEBUFFER 0xF0000000 // 8192 pages (32megs) / identity mapped -#define VMEM_EXT2_RAMIMAGE 0xF2000000 // 8192 pages (32megs) / identity mapped - -// __FUNCTION__ ? -#ifndef FOOLOS_LOG_OFF -#define kpanic(...) {log(FOOLOS_LOG_COLOR,__FILE__,0," \033[41;37m [KERNEL PANIC] \033[37;40m " __VA_ARGS__ ); while(1);} -#define klog(...) log(FOOLOS_LOG_COLOR,__FILE__ ":" S2(__LINE__), 10, __VA_ARGS__) -#define fixme(...) log(FOOLOS_LOG_COLOR,__FILE__ ":" S2(__LINE__) "[FIXME/TODO]:" , 10, __VA_ARGS__) -#endif -#ifdef FOOLOS_LOG_OFF -#define kpanic(...) {while(1);} -#define klog(...) {} -#define fixme(...) {} -#endif +#define VMEM_USER_STACK_PAGES 0xF0000000 // 4 pages / per thread +#define VMEM_USER_STACK_BOT 0xEFFFC000 // 4 pages / per thread +#define VMEM_USER_STACK_TOP 0xF0000000 // 4 pages / per thread + +#define VMEM_LAPIC 0xF0005000 // 1 pages / identity mapped +#define VMEM_IOAPIC 0xF0006000 // 1 pages / identity mapped +#define VMEM_CPU_PRIVATE 0xF000A000 // 4 pages / per cpu + +#define VMEM_CPU_STACK_PAGES 0xF0000000 // 4 pages / per thread +#define VMEM_CPU_STACK_BOT 0xF0050000 // 4 pages / per cpu +#define VMEM_CPU_STACK_TOP 0xF0054000 // 4 pages / per cpu + +#define VMEM_COPY_PAGE 0xF5000000 // 1 page / temporery map-in tables for copying + +#define VMEM_FRAMEBUFFER 0xF6000000 // 8192 pages (32megs) / identity mapped +#define VMEM_EXT2_RAMIMAGE 0xF8000000 // 8192 pages (32megs) / identity mapped #endif diff --git a/kernel/kmalloc.c b/kernel/kmalloc.c index 239a50b..f4242cc 100644 --- a/kernel/kmalloc.c +++ b/kernel/kmalloc.c @@ -1,6 +1,7 @@ +#include "kernel.h" #include "kmalloc.h" +#include "log.h" -#include "kernel.h" #include "spinlock.h" static uint8_t data[KMALLOC_MEM_SIZE]; // bytes diff --git a/kernel/log.h b/kernel/log.h index 62fe6ef..e46a7b2 100644 --- a/kernel/log.h +++ b/kernel/log.h @@ -1,6 +1,8 @@ #ifndef FOOLOS_LOG_H #define FOOLOS_LOG_H +#include "kernel.h" + #include #define FOOLOS_LOG_ERROR 5 @@ -11,4 +13,17 @@ void log(bool color,char *module_name, int prio, char *format_string, ...); +// __FUNCTION__ ? +#ifndef FOOLOS_LOG_OFF +#define kpanic(...) {log(FOOLOS_LOG_COLOR,__FILE__,0," \033[41;37m [KERNEL PANIC] \033[37;40m " __VA_ARGS__ ); while(1);} +#define klog(...) log(FOOLOS_LOG_COLOR,__FILE__ ":" S2(__LINE__), 10, __VA_ARGS__) +#define fixme(...) log(FOOLOS_LOG_COLOR,__FILE__ ":" S2(__LINE__) "[FIXME/TODO]:" , 10, __VA_ARGS__) +#endif + +#ifdef FOOLOS_LOG_OFF +#define kpanic(...) {while(1);} +#define klog(...) {} +#define fixme(...) {} +#endif + #endif diff --git a/kernel/mem.c b/kernel/mem.c index 098515b..a77dfa4 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -1,3 +1,4 @@ +#include "log.h" #include "kernel.h" #include "mem.h" #include diff --git a/kernel/multiboot.c b/kernel/multiboot.c index 7f45093..ce97c0a 100644 --- a/kernel/multiboot.c +++ b/kernel/multiboot.c @@ -1,4 +1,5 @@ #include "kernel.h" +#include "log.h" #include "multiboot.h" multiboot_information* multiboot_read(uint32_t eax, uint32_t ebx, bool silent) diff --git a/kernel/scheduler.c b/kernel/scheduler.c index 1b2a70a..11b6db4 100644 --- a/kernel/scheduler.c +++ b/kernel/scheduler.c @@ -1,6 +1,7 @@ #include "scheduler.h" #include "kernel.h" #include "gdt.h" +#include "log.h" #include "smp.h" #include "mem.h" @@ -161,14 +162,10 @@ volatile int add_task(uint32_t parent,uint32_t vmem) if(task_list[cpu][i].active!=true) { task_list[cpu][i].parent=parent; - - // TODO: do this without paging please! task_list[cpu][i].vmem=vmem; task_list[cpu][i].esp = kballoc(4)+2*4096; // center - // TODO: use own page here and copy it instead of this! task_list[cpu][i].esp0 = kballoc(4)+4*4096; - task_list[cpu][i].wait=false; task_list[cpu][i].brk=task_list[cpu][current_task[cpu]].brk; diff --git a/kernel/smashing.c b/kernel/smashing.c index e62e317..d4365b9 100644 --- a/kernel/smashing.c +++ b/kernel/smashing.c @@ -1,4 +1,5 @@ #include "kernel/kernel.h" +#include "log.h" #include // CODE FOR Stack Smashing Protector. diff --git a/kernel/smp.c b/kernel/smp.c index 52dd41a..cd9f5ad 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -1,4 +1,5 @@ #include "kernel.h" +#include "log.h" #include "smp.h" #include diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 48a2604..71feeb7 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -15,6 +15,7 @@ #include #include "syscalls.h" #include "scheduler.h" +#include "log.h" // TODO: use includes!!! diff --git a/kernel/vmem.c b/kernel/vmem.c index 3752725..10c2401 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -1,6 +1,7 @@ #include #include "kernel.h" +#include "log.h" #include "vmem.h" #include "asm_x86.h" @@ -200,10 +201,20 @@ static pdirectory* vmem_clean_dir() return dir; } +static void vmem_clear_one(pdirectory* dir,uint32_t virt) +{ + pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt) ]; + ptable* table; + if(*entry!=0){ + table= pd_entry_get_frame (entry); + table->m_entries [PAGE_TABLE_INDEX (virt) ] = 0; + } +} + // addresses need to be page aligned. (or will be forced down) static void vmem_add_generic(pdirectory* dir,uint32_t phys,uint32_t virt,uint32_t pages, bool alloc, bool user) { - fixme("make sure the pages are marked as used in the physical mem manager, really?"); + //fixme("make sure the pages are marked as used in the physical mem manager, really?"); //force align phys/=4096; @@ -257,6 +268,7 @@ static void vmem_add_generic(pdirectory* dir,uint32_t phys,uint32_t virt,uint32_ pages--; } } + static void vmem_add_alloc(pdirectory* dir,uint32_t addr,uint32_t pages,bool user) { vmem_add_generic(dir,addr,addr,pages, true,user); @@ -266,6 +278,7 @@ static void vmem_add_remap(pdirectory* dir,uint32_t phys,uint32_t virt,uint32_t { vmem_add_generic(dir,phys,virt,pages, false,user); } + static void vmem_add_identity(pdirectory* dir,uint32_t addr,uint32_t pages, bool user) { vmem_add_generic(dir,addr,addr,pages, false,user); @@ -290,10 +303,10 @@ pdirectory* vmem_kernel_dir() vmem_add_remap(dir,mod_start,VMEM_EXT2_RAMIMAGE,1024*8,false);//32megs for ramimage: TODO: check if enough? vmem_add_alloc(dir,VMEM_CPU_PRIVATE,4,false); - vmem_add_alloc(dir,VMEM_CPU_STACK_TOP-4096*4,4,false); + vmem_add_alloc(dir,VMEM_CPU_STACK_BOT,4,false); vmem_add_alloc(dir,VMEM_USER_PROG,1024*2,true); - vmem_add_alloc(dir,VMEM_USER_STACK_TOP-4096*4,4,true); + vmem_add_alloc(dir,VMEM_USER_STACK_TOP-4096*10,10,true); return dir; } @@ -301,7 +314,7 @@ pdirectory* vmem_kernel_dir() pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only) { pdirectory* dir = vmem_clean_dir(); - //copy non-user pages. + //link non-user pages. for(int i=0;i<1024;i++) { uint32_t src_pt=copy_dir->m_entries [i]; @@ -311,6 +324,41 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only) vmem_add_alloc(dir,VMEM_USER_PROG,1024*2,true); vmem_add_alloc(dir,VMEM_USER_STACK_TOP-4096*4,4,true); + x86_cli(); // plese dear timer, do not schedule us away + pdirectory* orig=x86_get_page_directory(); + x86_set_page_directory(dir); + + //copy user pages. + //TODO: stack only! + uint32_t virt=0; + for(int i=0;i<1024;i++) + { + uint32_t src_pt=copy_dir->m_entries [i]; + if(pt_entry_is_user(src_pt)) + { + ptable *table=pt_entry_get_frame(&src_pt); + for(int j=0;j<1024;j++) + { + uint32_t src_pd=table->m_entries[j]; + uint32_t phys=pd_entry_get_frame(&src_pd); + if(src_pd) + { + // klog("copy %x to %x",phys,virt); + vmem_clear_one(dir,VMEM_COPY_PAGE); + vmem_add_remap(dir,phys,VMEM_COPY_PAGE,1,false); + x86_invlpg(VMEM_COPY_PAGE); // refresh TLB + memcpy(virt,VMEM_COPY_PAGE,4096); + } + virt+=4096; + + } + + } + else virt+=4096*1024; + } + x86_set_page_directory(orig); + x86_sti(); + return dir; } diff --git a/test/selftest.c b/test/selftest.c index e95b320..ef0b80a 100644 --- a/test/selftest.c +++ b/test/selftest.c @@ -1,4 +1,5 @@ #include "kernel.h" +#include "log.h" void selftest_stack_overflow() { -- cgit v1.2.3