位图:综合起来,位图就是用字节中的 1 位来映射其他单位大小(默认一页4K)的资源,按位与资源之间是一对一的对应关系。
那么一字节八位对应32K,40000*32K=
本质上是压缩存储来方便管理
在书中
struct bitmap {
uint32_t btmp_bytes_len;
/* 在遍历位图时,整体上以字节为单位,细节上是以位为单位,所以此处位图的指针必须是单字节 */
uint8_t* bits;
};
后续的内存管理中多处用到了位图
管理虚拟地址用到了位图:memory.h
/* 用于虚拟地址管理 */
struct virtual_addr {
/* 虚拟地址用到的位图结构,用于记录哪些虚拟地址被占用了。以页为单位。*/
struct bitmap vaddr_bitmap;
/* 管理的虚拟地址 */
uint32_t vaddr_start;
};
struct virtual_addr kernel_vaddr; // 此结构是用来给内核分配虚拟地址
用内存池pool管理物理地址,比虚拟地址复杂,分为kernel和user两个pool:memory.c
/* 内存池结构,生成两个实例用于管理内核内存池和用户内存池 */
struct pool {
struct bitmap pool_bitmap; // 本内存池用到的位图结构,用于管理物理内存
uint32_t phy_addr_start; // 本内存池所管理物理内存的起始地址
uint32_t pool_size; // 本内存池字节容量
};
struct pool kernel_pool, user_pool; // 生成内核内存池和用户内存池
32位虚拟地址的转换过程
1.高10位