26
|
1
|
|
2 /* Memory manager */
|
|
3
|
|
4 #include "kernel.h"
|
|
5
|
|
6 // BITMAP functions:
|
|
7 #define NFRAMES 1000
|
|
8 // Bit mask to check what frames are in use and which are free:
|
|
9 uint64_t frames[NFRAMES]; // NFRAMES*64*4kB frames.
|
|
10
|
|
11 void set_frame(uint64_t frame)
|
|
12 {
|
|
13 uint64_t idx = frame / 64;
|
|
14 uint64_t off = frame % 64;
|
|
15 frames[idx] |= (0x1 << off);
|
|
16 }
|
|
17
|
|
18 void clear_frame(uint64_t frame)
|
|
19 {
|
|
20 uint64_t idx = frame / 64;
|
|
21 uint64_t off = frame % 64;
|
|
22 frames[idx] &= ~(0x1 << off);
|
|
23 }
|
|
24
|
|
25 uint64_t test_frame(uint64_t frame)
|
|
26 {
|
|
27 uint64_t idx = frame / 64;
|
|
28 uint64_t off = frame % 64;
|
|
29 return (frames[idx] & (0x1 << off));
|
|
30 }
|
|
31
|
|
32 uint64_t first_frame()
|
|
33 {
|
|
34 uint64_t i, j;
|
|
35 for (i = 0; i < NFRAMES / 64; i++)
|
|
36 {
|
|
37 if (frames[i] != 0xFFFFFFFFFFFFFFFF)
|
|
38 {
|
|
39 for (j = 0; j < 64; j++)
|
|
40 {
|
|
41 uint64_t dut = 0x1 << j;
|
|
42 if ((frames[i] & dut) != dut)
|
|
43 {
|
|
44 return i*64+j;
|
|
45 }
|
|
46 }
|
|
47 }
|
|
48 }
|
|
49 return 0xFFFFFFFFFFFFFFFF;
|
|
50 }
|
|
51
|
|
52 // Memory manager functions:
|
|
53 void alloc_frame()
|
|
54 {
|
|
55 uint64_t idx = first_frame();
|
|
56 if (idx == (uint64_t) -1)
|
|
57 {
|
|
58 panic("No more memory!");
|
|
59 }
|
|
60 set_frame(idx);
|
|
61 }
|
|
62
|
|
63
|