课前准备:
这是没有引入虚拟内存的方式
大致思路:把内存当成一个数组,然后,留出一块空间用来管理这个数组。
未完
内存地址对齐
一般写法
#define ALIGN_4_BYTES 4
#define ALIGN_4_MASK (ALIGN_4_BYTES - 1)
//4字节地址对齐
static inline uintptr_t align_4_bytes(uintptr_t address) {
return (address + ALIGN_4_MASK) & ~ALIGN_4_MASK;
}
//定义页大小是4k,2的12次方是4096
#define PAGE_SIZE 4096
#define PAGE_ORDER 12
//4k地址对齐
static inline ptr_t _align_page(ptr_t address) {
ptr_t order = (1 << PAGE_ORDER) - 1;
return (address + order) & (~order);
}
解释
1 << PAGE_ORDER =2的12方 order-1 的值是 0xFFF,它的二进制表示是 1111 1111 1111。
address加上 order(即 0xFFF 或 4095)是为了确保任何未对齐的地址在加上 order 后会超过下一个页面边界。然后,通过清空低12位,可以将地址对齐到下一个4KB边界。
示例:
对于已经对齐的地址,例如 0x1000:
0x1000 + 0xFFF = 0x1FFF
0x1FFF & 0xFFFFF000 = 0x1000(保持不变)
对于未对齐的地址,例如 0x1003:
0x1003 + 0xFFF = 0x2002
0x2002 & 0xFFFFF000 = 0x2000(对齐到下一个4KB边界)
保留页
内存就是一段数组,可以有多种使用策略,好比进入一个小区, 要先登记, 然后,有人带路不迷路。
内部的分配单位是页,保留页就是小区物业,看大门的大爷, 你大爷还是你大爷。那么需要多少的保留页呢?
- 管理页面状态:每个页面需要一个数据结构来存储其状态信息。
- 内存管理效率:集中存储页面描述符可以提高内存管理的效率。
- 避免内存碎片:集中存储页面描述符可以减少内存碎片。
#define PAGE_SIZE 4096
struct Page {
uint8_t flags;
};
void calculate_reserved_pages(uint32_t length_ram) {
uint32_t total_pages = length_ram / PAGE_SIZE;
//向上取整,给够充足的空间
uint32_t num_reserved_pages = (total_pages * sizeof(struct Page) + PAGE_SIZE - 1) / PAGE_SIZE;
printf("Total pages: %u\n", total_pages);
printf("Reserved pages: %u\n", num_reserved_pages);
}
int main() {
uint32_t length_ram = 256 * 1024 * 1024; // 256MB
calculate_reserved_pages(length_ram);
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。