diff options
| author | Miguel <m.i@gmx.at> | 2018-09-12 15:23:38 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-09-12 15:23:38 +0200 |
| commit | c72944b5646863ffaaaff94dc03b939a08566203 (patch) | |
| tree | 3ce3d74fc27b297cd6958d0d8ba588ccbbe16bfb /kernel | |
| parent | 800b1a878ec34a8ff30ed093e20561182fa6ae36 (diff) | |
struggling with vmem
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/acpi.c | 1 | ||||
| -rw-r--r-- | kernel/acpi.h | 1 | ||||
| -rw-r--r-- | kernel/apic.c | 1 | ||||
| -rw-r--r-- | kernel/exceptions.c | 1 | ||||
| -rw-r--r-- | kernel/fifo.c | 4 | ||||
| -rw-r--r-- | kernel/gdt.c | 1 | ||||
| -rw-r--r-- | kernel/interrupts.c | 3 | ||||
| -rw-r--r-- | kernel/kernel.c | 1 | ||||
| -rw-r--r-- | kernel/kernel.h | 46 | ||||
| -rw-r--r-- | kernel/kmalloc.c | 3 | ||||
| -rw-r--r-- | kernel/log.h | 15 | ||||
| -rw-r--r-- | kernel/mem.c | 1 | ||||
| -rw-r--r-- | kernel/multiboot.c | 1 | ||||
| -rw-r--r-- | kernel/scheduler.c | 5 | ||||
| -rw-r--r-- | kernel/smashing.c | 1 | ||||
| -rw-r--r-- | kernel/smp.c | 1 | ||||
| -rw-r--r-- | kernel/syscalls.c | 1 | ||||
| -rw-r--r-- | kernel/vmem.c | 56 |
18 files changed, 108 insertions, 35 deletions
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 <stdint.h> 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 <stdint.h> +#include <stdbool.h> 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 <stddef.h> 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 <stdbool.h> #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 <stdint.h> 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 <stdint.h> // 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 <stdint.h> 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 <stddef.h> #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 <stdlib.h> #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; } |
