diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-08-07 18:40:11 +0200 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-08-07 18:40:11 +0200 |
| commit | 5a83bd319a22d53eb82d43c738d471a5a8079b36 (patch) | |
| tree | 6c29e99ab2db9e8297ad977616f202612f041b3e | |
| parent | 0246dfba3efac4c20e73e83c229219d3c136ff40 (diff) | |
added some physical memory management
| -rw-r--r-- | Makefile | 5 | ||||
| -rw-r--r-- | kernel/console.c | 10 | ||||
| -rw-r--r-- | kernel/interrupts.c | 2 | ||||
| -rw-r--r-- | kernel/kernel.c | 92 | ||||
| -rw-r--r-- | kernel/mem.c | 161 |
5 files changed, 178 insertions, 92 deletions
@@ -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); + +} + |
