summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2015-05-15 02:34:33 +0200
committerMichal Idziorek <m.i@gmx.at>2015-05-15 02:34:33 +0200
commit9b152b773d40d40abf41a46be2ddae8905170fdf (patch)
tree7e6ee94e0af8804e11a2725028e8566cb2387c89
parent0365bbb5c58912fd24b3d33b90477d3de5d46d96 (diff)
using ramimage position and correct kernel pages count
-rw-r--r--fs/fs.c22
-rw-r--r--fs/fs.h4
-rw-r--r--kernel/kernel.c17
-rw-r--r--kernel/mem.c5
-rw-r--r--kernel/mem.h2
-rw-r--r--kernel/vmem.c9
-rw-r--r--kernel/vmem.h2
7 files changed, 49 insertions, 12 deletions
diff --git a/fs/fs.c b/fs/fs.c
index fd43c52..19027d6 100644
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -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()
diff --git a/fs/fs.h b/fs/fs.h
index db6e608..b90b4f1 100644
--- a/fs/fs.h
+++ b/fs/fs.h
@@ -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);