🚀 优质资源分享 🚀
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
💛Python量化交易实战💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
目录
一、前景回顾
二、位图bitmap及函数实现
三、内存池划分
四、运行
一、前景回顾
前面我们已经花了一个回合来完善了一下我们的系统,包括增加了makefile,ASSERT以及一些常见的字符串操作函数。关于makefile,还是我以前学习Linux系统编程的时候学了一点点,很久没用导致就几乎都忘了,还是花了一下午时间去补了一下。看来知识这个东西,还是得温故而知新。
随时还是要回过头来总结一下我们的工作,上面是目前为止的工作,其实我们可以看到,现在我们的主要工作就是不停地往init_all()里面去填充一系列初始化函数,本回合也不例外,今天我们开始进入内存管理系统。
二、位图bitmap及函数实现
长话短说,举个例子,当我们的程序在申请使用一块物理内存时,该物理内存肯定是不能被占用的。所以这就要求我们每使用一块物理内存,就需要做个标记,这个标记用来指示该物理内存是否已被占用。而我们又知道内存被划分为多个4KB大小的页,如果我们的系统能够标记每一页的使用情况,这样上面的问题就迎刃而解了。所以基于位图bitmap的思想,我们有了如下的位图与内存的关系:
如图所示,我们知道1个字节等于8位,我们用每一位0或者1的状态来表示一页内存是否被占用,0就是未被占用,1就被已被占用。所以我们用一页内存4KB,就可以表示410248*4KB=128MB内存。
在project/lib/kernel目录下,新建bitmap.c和bitmap.h文件,还需要完善一下stdint.h文件。
1 #ifndef \_\_LIB\_KERNEL\_BITMAP\_H
2 #define \_\_LIB\_KERNEL\_BITMAP\_H
3 #include "stdint.h"
4
5
6 #define BITMAP\_MASK 1
7
8 struct bitmap {
9 uint32\_t btmp\_bytes\_len;
10 uint8\_t *bits;
11 };
12
13 void bitmap\_init(struct bitmap *btmp);
14 bool bitmap\_scan\_test(struct bitmap *btmp, uint32\_t bit\_idx);
15 int bitmap\_scan(struct bitmap *btmp, uint32\_t cnt);
16 void bitmap\_set(struct bitmap *btmp, uint32\_t bit\_idx, int8\_t value);
17
18 #endif
bitmap.h
1 #include "bitmap.h"
2 #include "stdint.h"
3 #include "string.h"
4 #include "debug.h"
5
6 /*将位图btmp初始化*/
7 void bitmap\_init(struct bitmap *btmp)
8 {
9 memset(btmp->bits, 0, btmp->btmp\_bytes\_len);
10 }
11
12 /*判断bit\_idx位是否为1, 若为1则返回true,否则返回false*/
13 bool bitmap\_scan\_test(struct bitmap *btmp, uint32\_t bit\_idx)
14 {
15 uint32\_t byte\_idx = bit\_idx / 8;
16 uint32\_t bit\_odd = bit\_idx % 8;
17 return (btmp->bits[byte\_idx] & (BITMAP\_MASK << bit\_odd));
18 }
19
20 /*在位图中申请连续cnt个位,成功则返回其起始地址下标,否则返回-1*/
21 int bitmap\_scan(struct bitmap *btmp, uint32\_t cnt)
22 {
23 ASSERT(cnt >= 1);
24 uint32\_t idx\_byte = 0;
25
26 while ((idx\_byte < btmp->btmp\_bytes\_len) && (btmp->bits[idx\_byte] == 0xff))
27 idx\_byte++;
28
29 if (idx\_byte == btmp->btmp\_bytes\_len)
30 return -1;
31
32 int idx\_bit = 0;
33
34 while ((btmp->bits[idx\_byte] & (uint8\_t)(BITMAP\_MASK << idx\_bit)))
35 idx\_bit++;
36
37 int bit\_idx\_start = idx\_bit + 8 * idx\_byte;
38 if (cnt &#