summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile5
-rw-r--r--kernel/console.c10
-rw-r--r--kernel/interrupts.c2
-rw-r--r--kernel/kernel.c92
-rw-r--r--kernel/mem.c161
5 files changed, 178 insertions, 92 deletions
diff --git a/Makefile b/Makefile
index 98f0f66..642f143 100644
--- a/Makefile
+++ b/Makefile
@@ -32,6 +32,9 @@ 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
+mem.o: kernel/mem.c
+ gcc -ffreestanding -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0
+
console.o: kernel/console.c kernel/console.h
gcc -ffreestanding -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0
@@ -47,7 +50,7 @@ timer.o: kernel/timer.c
shell.o: kernel/shell.c
gcc -ffreestanding -m32 -o $@ -c $< -fno-asynchronous-unwind-tables -O0
-kernel.bin: kernel_entry.o kernel.o console.o interrupts.o keyboard.o timer.o shell.o
+kernel.bin: kernel_entry.o kernel.o console.o interrupts.o keyboard.o timer.o shell.o mem.o
ld -o $@ -Ttext 0x1000 --oformat binary -melf_i386 $^ -O0
diff --git a/kernel/console.c b/kernel/console.c
index 27b21e5..77b5fc1 100644
--- a/kernel/console.c
+++ b/kernel/console.c
@@ -104,6 +104,7 @@ void scr_put_char(char ch,char col)
if(posx>=SCR_WIDTH)scr_nextline();
}
+
void scr_put_hex(uint16_t val)
{
@@ -121,6 +122,15 @@ void scr_put_hex(uint16_t val)
}
+void scr_put_hex32(uint32_t val)
+{
+ scr_put_string("[");
+ scr_put_hex(val>>16);
+ scr_put_string(",");
+ scr_put_hex(val&0xffff);
+ scr_put_string("]");
+}
+
void scr_put_string(char *str)
{
while(*str!=0)
diff --git a/kernel/interrupts.c b/kernel/interrupts.c
index 49a29a3..a07cfef 100644
--- a/kernel/interrupts.c
+++ b/kernel/interrupts.c
@@ -60,7 +60,7 @@ void int_def_handler()
void int_install_ir(int irq, uint16_t flags, uint16_t sel, void *addr)
{
- uint64_t base=(uint64_t)&(*addr); // TODO!
+ uint64_t base=(uint64_t)&(*addr); // TODO!
idt[irq].addrLo = base & 0xffff;
idt[irq].addrHi = (base >> 16) & 0xffff;
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 7c5f982..0e6b32e 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -36,96 +36,8 @@ void kernel_main()
timer_init();
scr_put_string_nl("Configured PIT Channel 0 : Mode 2 : 1/25 s.");
- /*
- //probe memory
- scr_put_string_nl("Probing core memory...");
- char *prober=0xf000;
-
- for(;prober<0xfffffff;prober+=0xf00)
- {
- *prober='x';
- if(*prober!='x')break;
-
- }
-
-
- //0xA5000
- scr_put_hex((uint32_t)prober>>16);
- scr_put_hex((uint32_t)prober&0xffff);
- scr_put_string_nl(" finished!");
- //
-
- */
-
- uint16_t *memmap=0x7c00+0x120;
- uint32_t avail_mem=0;
-
- //print memory map:
-
- while(1)
- {
- if(memmap[8]==0)break;
- if(memmap[8]==1)
- {
- avail_mem+=memmap[4]+(memmap[5]<<16);
- }
- //bytes: 8 8 4 4//
- //scr_put_hex(memmap[3]);
- //scr_put_string(" ");
- //scr_put_hex(memmap[2]);
- //scr_put_string(" ");
- scr_put_hex(memmap[1]);
- scr_put_string(" ");
- scr_put_hex(memmap[0]);
- scr_put_string(" ");
-// scr_put_hex(memmap[4]);
-// scr_put_string(" ");
-// scr_put_hex(memmap[5]);
-// scr_put_string(" ");
-// scr_put_hex(memmap[6]);
-// scr_put_string(" ");
-// scr_put_hex(memmap[7]);
-
-
- scr_put_string(" - ");
-// scr_put_hex(memmap[8]);
-// scr_put_string(" ");
-// scr_put_hex(memmap[9]);
-// scr_put_string(" ");
-// scr_put_hex(memmap[10]);
-// scr_put_string(" ");
-// scr_put_hex(memmap[11]);
-// scr_put_string(" ");
- //scr_put_hex(memmap[7]);
- //scr_put_string(" ");
- //scr_put_hex(memmap[6]);
- //scr_put_string(" ");
- scr_put_hex(memmap[5]);
- scr_put_string(" ");
- scr_put_hex(memmap[4]);
-
- scr_put_string(" : ");
- scr_put_hex(memmap[8]);
-// scr_put_string(" ");
-// scr_put_hex(memmap[9]);
-
-
- scr_put_string_nl("");
-
- memmap+=12;
- }
-
-
- scr_put_string("Total Available Mem: ");
- scr_put_hex(avail_mem>>16);
- scr_put_string(" ");
- scr_put_hex(avail_mem&0xffff);
- scr_put_string_nl(" byte");
- scr_put_string_nl("");
-
-
-
-
+ // we know that here the bootloader placed the mamory map!
+ mem_init(0x7c00+0x120);
// init and interrupt decriptor table
int_init(0x08);
diff --git a/kernel/mem.c b/kernel/mem.c
new file mode 100644
index 0000000..1bb4109
--- /dev/null
+++ b/kernel/mem.c
@@ -0,0 +1,161 @@
+#include "kernel.h"
+
+//! 8 blocks per byte
+#define PMMNGR_BLOCKS_PER_BYTE 8
+
+//! block size (4k)
+#define PMMNGR_BLOCK_SIZE 4096
+
+//! block alignment
+#define PMMNGR_BLOCK_ALIGN PMMNGR_BLOCK_SIZE
+
+// memory map bit array. Each bit represents a memory block
+static uint32_t _mmngr_memory_map[129*1024];
+static uint32_t mem_free_blocks;
+
+// bit funcs!
+
+void mmap_set(int bit)
+{
+ _mmngr_memory_map[bit / 32] |= (1 << (bit % 32));
+}
+
+void mmap_unset(int bit)
+{
+ _mmngr_memory_map[bit / 32] &= ~ (1 << (bit % 32));
+}
+
+int mmap_test(int bit)
+{
+ return _mmngr_memory_map[bit / 32] & (1 << (bit % 32));
+}
+
+///
+
+int mmap_first_free () {
+
+ //! find the first free bit
+ uint32_t i;
+ int j;
+
+
+ for (i=0; i< 128 ; i++)
+ if (_mmngr_memory_map[i] != 0xffffffff)
+ for (j=0; j<32; j++) { //! test each bit in the dword
+
+ int bit = 1 << j;
+ if (! (_mmngr_memory_map[i] & bit) )
+ return i*4*8+j;
+ }
+
+ return -1;
+}
+
+void pmmngr_init () {
+
+ //! By default, all of memory is in use
+ // memset (_mmngr_memory_map, 0xf, 128 );
+ int i;
+ for(i=0;i++;i<128*1024)
+ {
+ _mmngr_memory_map[i]=0xffffffff;
+ }
+}
+
+void pmmngr_init_region (uint32_t base, uint32_t size)
+{
+
+
+ uint32_t align = base / PMMNGR_BLOCK_SIZE;
+ uint32_t blocks = size / PMMNGR_BLOCK_SIZE;
+
+ for (; blocks>0; blocks--)
+ {
+ // hack to lock first ~4MB of memory
+ if(align<1000)
+ {
+ align++;
+ continue;
+ }
+
+
+ mmap_unset (align++);
+ mem_free_blocks++;
+ //_mmngr_used_blocks--;
+ }
+
+ //mmap_set (0); //first block is always set. This insures allocs cant be 0
+}
+
+void mem_test(int start, int end, int steps)
+{
+ int *p=start;
+ for(;p<end;p+=steps)
+ {
+ scr_put_string("testing memory at ");
+ scr_put_hex32(p);
+
+ //
+ *p=p;
+ volatile x=*p;
+ if(x==p) scr_put_string(" OK");
+ //
+
+ scr_put_string_nl("");
+ }
+}
+
+void mem_init(uint16_t *memmap)
+{
+ mem_free_blocks=0;
+
+ // count available memory
+ uint32_t avail_mem=0;
+
+ //print memory map;
+ while(1)
+ {
+ if(memmap[8]==0)break;
+
+ scr_put_hex(memmap[8]);
+ scr_put_string(" : ");
+
+
+ scr_put_hex(memmap[1]);
+ scr_put_string(" ");
+ scr_put_hex(memmap[0]);
+ scr_put_string(" ");
+
+ scr_put_string(" - ");
+ scr_put_hex(memmap[5]);
+ scr_put_string(" ");
+ scr_put_hex(memmap[4]);
+
+ scr_put_string_nl("");
+
+ if(memmap[8]==1)
+ {
+ avail_mem+=memmap[4]+(memmap[5]<<16);
+ pmmngr_init_region(memmap[0]+(memmap[1]<<16),memmap[4]+((memmap[5])<<16));
+ }
+
+ memmap+=12;
+ }
+
+ scr_put_string("Total Available Mem: ");
+ scr_put_hex(avail_mem>>16);
+ scr_put_string(" ");
+ scr_put_hex(avail_mem&0xffff);
+ scr_put_string_nl(" byte");
+
+ scr_put_string("Total of free (4KB) blocks: ");
+ scr_put_hex(mem_free_blocks>>16);
+ scr_put_hex(mem_free_blocks&0xffff);
+ scr_put_string_nl("");
+
+ //crossing 512MB boundary!
+ // (do not do this in real, coz it probably is reserved)
+ //mem_test(0x1fee1000,0x2000f000,0x800);
+
+}
+