[自制操作系统] 第14回 内存管理系统

本文详细介绍了自制操作系统中内存管理系统的实现,包括位图bitmap的使用来标记内存使用状态,内存池的划分,以及内核和用户内存的管理。通过创建bitmap.c, bitmap.h, memory.c 和 memory.h 文件,实现了内存分配和管理的代码。文章还解释了pde_ptr和pte_ptr函数的工作原理,用于根据虚拟地址获取页表和物理页的位置。" 7900633,204932,理解sugarcrm的REST API实现,"['REST', 'API', 'webservice', 'class', 'module']
摘要由CSDN通过智能技术生成

🚀 优质资源分享 🚀

学习路线指引(点击解锁) 知识定位 人群定位
🧡 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 &#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值