diff options
| -rw-r--r-- | fs/fs.c | 22 | ||||
| -rw-r--r-- | fs/fs.h | 4 | ||||
| -rw-r--r-- | kernel/kernel.c | 17 | ||||
| -rw-r--r-- | kernel/mem.c | 5 | ||||
| -rw-r--r-- | kernel/mem.h | 2 | ||||
| -rw-r--r-- | kernel/vmem.c | 9 | ||||
| -rw-r--r-- | kernel/vmem.h | 2 |
7 files changed, 49 insertions, 12 deletions
@@ -1,7 +1,9 @@ // abstraction layer for filesystems +#define FOOLOS_MODULE_NAME "mount" #include "fs.h" #include "ext2.h" +#include "lib/logger/log.h" static uint32_t root_ext2_ramimage=0; @@ -18,9 +20,25 @@ int fs_readdir(const char *name,fs_dirent *dirs,int max) return ext2_read_dir(root_ext2_ramimage, inode_nr,dirs,max); // TODO: hardcoded, fix this } -void fs_mount(uint32_t ext2_ramimage) +void fs_mount(multiboot_information *info) { - root_ext2_ramimage=ext2_ramimage; + // deinit modules memory + if(info->flags&&1<<3) + { + multiboot_mod *mod=info->mods_addr; + for(int i=0;i<info->mods_count;i++) + { + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mounting mod from 0x%08X-0x%08X : %s", + mod->mod_start,mod->mod_end, mod->string); + + + //pmmngr_deinit_region(mod->mod_start,((uint32_t)mod->mod_end-(uint32_t)mod->mod_start)+1); + root_ext2_ramimage=mod->mod_start; + + + mod++; + } + } } uint32_t fs_get_root_ext2_ramimage() @@ -2,6 +2,7 @@ #define FOOLOS_FS #include <stdint.h> +#include "kernel/multiboot.h" enum FS_FILE_TYPE{ @@ -19,7 +20,6 @@ typedef struct fs_dirent_struct }fs_dirent; int fs_readdir(const char *name,fs_dirent *dirs,int max); -void fs_mount(uint32_t ext2_ramimage); // all you can mount so far is just one single - // ext2 ramimage as root +void fs_mount(multiboot_information *info); // mounts ext2 ramimage from module as root #endif diff --git a/kernel/kernel.c b/kernel/kernel.c index bdadd45..7b29730 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -31,6 +31,7 @@ void kernel_main(uint32_t eax,uint32_t ebx) { + // // Init Console // @@ -57,12 +58,12 @@ void kernel_main(uint32_t eax,uint32_t ebx) // after this is set up we will be able to allocate and deallocate // blocks of physical memory :) // - mem_init(info); + uint32_t kernel_blocks=mem_init(info); // // Activate Virtual Memory (paging) // - pdirectory *dir=vmem_new_space_dir(NULL); + pdirectory *dir=vmem_init(kernel_blocks); // // Setup Interrupts (code segment: 0x08) @@ -100,15 +101,23 @@ void kernel_main(uint32_t eax,uint32_t ebx) // // Mount Root EXT2 ramimage // - fs_mount(0x945000); + + fs_mount(info); // // Initialize Multitasking // - task_init(dir); //; this will never return! + + task_init(dir); + // + // Abvoe should never return + // + + panic(FOOLOS_MODULE_NAME,"reached end of kernel.c !!"); } + diff --git a/kernel/mem.c b/kernel/mem.c index 7c55a67..ff8e97d 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -149,7 +149,8 @@ void pmmngr_free_block (void* p) } -void mem_init(multiboot_information *info) +// returns index of first block outside of kerel-land +uint32_t mem_init(multiboot_information *info) { if(info->flags&&1<<6) { @@ -226,6 +227,8 @@ void mem_init(multiboot_information *info) log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO, "Free 4K blocks: %d (first free: %d)",mem_free_blocks,mem_min_block); + return mem_min_block; + } diff --git a/kernel/mem.h b/kernel/mem.h index 32b1160..c7e905e 100644 --- a/kernel/mem.h +++ b/kernel/mem.h @@ -2,4 +2,4 @@ #include "multiboot.h" physical_address* pmmngr_alloc_block (); void pmmngr_free_block (physical_address* p); -void mem_init(multiboot_information *info); +uint32_t mem_init(multiboot_information *info); diff --git a/kernel/vmem.c b/kernel/vmem.c index 491f486..a8e4008 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -9,6 +9,8 @@ #include "lib/logger/log.h" // logger facilities #define FOOLOS_MODULE_NAME "vmem" +static uint32_t kernel_pages; + // TODO : why is the frame not 0xfffff?? enum PAGE_PTE_FLAGS { @@ -255,7 +257,7 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir) uint32_t virt_addr=0; // first pages are identity mapped - for(int j=0;j<5;j++) + for(int j=0;j<kernel_pages;j++) { // this is the table for our page directory. It maps 1024*4096 bytes @@ -434,3 +436,8 @@ void vmem_set_dir(pdirectory *dir) x86_set_pdbr(dir); } +pdirectory* vmem_init(uint32_t kernel_blocks) +{ + kernel_pages=kernel_blocks/1024+1; + return vmem_new_space_dir(NULL); +} diff --git a/kernel/vmem.h b/kernel/vmem.h index 7c7ffd0..d30c7cf 100644 --- a/kernel/vmem.h +++ b/kernel/vmem.h @@ -34,4 +34,4 @@ typedef struct pdirectory_struct { pd_entry m_entries[PAGES_PER_DIR]; }pdirectory; -pdirectory* vmem_init(); +pdirectory* vmem_init(uint32_t kernel_blocks); |
