Mercurial > lcfOS
diff cos/kernel/mm.c @ 26:dcce92b1efbc
Added mm.c
author | windel |
---|---|
date | Tue, 27 Dec 2011 17:36:52 +0100 |
parents | |
children | 47b7df514243 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cos/kernel/mm.c Tue Dec 27 17:36:52 2011 +0100 @@ -0,0 +1,63 @@ + +/* Memory manager */ + +#include "kernel.h" + +// BITMAP functions: +#define NFRAMES 1000 +// Bit mask to check what frames are in use and which are free: +uint64_t frames[NFRAMES]; // NFRAMES*64*4kB frames. + +void set_frame(uint64_t frame) +{ + uint64_t idx = frame / 64; + uint64_t off = frame % 64; + frames[idx] |= (0x1 << off); +} + +void clear_frame(uint64_t frame) +{ + uint64_t idx = frame / 64; + uint64_t off = frame % 64; + frames[idx] &= ~(0x1 << off); +} + +uint64_t test_frame(uint64_t frame) +{ + uint64_t idx = frame / 64; + uint64_t off = frame % 64; + return (frames[idx] & (0x1 << off)); +} + +uint64_t first_frame() +{ + uint64_t i, j; + for (i = 0; i < NFRAMES / 64; i++) + { + if (frames[i] != 0xFFFFFFFFFFFFFFFF) + { + for (j = 0; j < 64; j++) + { + uint64_t dut = 0x1 << j; + if ((frames[i] & dut) != dut) + { + return i*64+j; + } + } + } + } + return 0xFFFFFFFFFFFFFFFF; +} + +// Memory manager functions: +void alloc_frame() +{ + uint64_t idx = first_frame(); + if (idx == (uint64_t) -1) + { + panic("No more memory!"); + } + set_frame(idx); +} + +