没有合适的资源?快使用搜索试试~ 我知道了~
实验五 内存1
需积分: 0 0 下载量 2 浏览量
2022-08-04
00:46:25
上传
评论
收藏 713KB PDF 举报
温馨提示
试读
9页
实验五 内存1
资源详情
资源评论
资源推荐
实验五 内存
马逸君 17300180070
第一部分 Physical Page Management
阅读kern/pmap.c中的mem_init()函数的代码(到check_page();这句代码为止),介绍整个流程以及
其中boot_alloc(), page_init(), page_alloc(), page_free()这几个函数的作用。
mem_init()(节选):用于建立起两级页表的结构。
其工作过程是,最开始探测本机物理内存的大小,根据得到的总页面数为页目录(两级页表的第一级)
申请空间并填充0初始化,并通过在页目录中插入自身给予用户代码直接读取二级页表的能力;然后为
二级页表申请一个PageInfo类型的数组,填充0并调用page_init()对其初始化;最后进行错误检查。
源码分析:
// 建立两级页表。kern_pgdir是该页表根部的线性地址(虚拟地址)。
// 该函数只建立地址空间的内核部分(亦即地址>=UTOP的部分),用户部分稍后建立。
// 权限设置:UTOP到ULIM,用户可读不可写;ULIM以上,用户不可读不可写。
void
mem_init(void)
{
... // 函数开头定义了两个变量,但我们需要分析的这段代码段中没有用到,故略去。
i386_detect_memory();
// 该函数用于得到本机拥有的内存大小。
// 包括总页数和基础内存(base memory)的页数。
kern_pgdir = (pde_t *) boot_alloc(PGSIZE); // 创建初始的页目录(两级页表的一
级)
memset(kern_pgdir, 0, PGSIZE); // 并填充0初始化
// 该行代码在页目录中插入自身,给予了从页目录访问自身的能力。
kern_pgdir[PDX(UVPT)] = PADDR(kern_pgdir) | PTE_U | PTE_P;
// 与PTE_U进行“或”运算,使得该页表项的present bit为真
// 与PTE_P进行“或”运算,赋予用户读取页目录权限
// 用boot_alloc()分配一个由npages个PageInfo组成的动态数组,用指针pages表示。
// 内核用这个数组来跟踪维护物理页面;每个物理页面在该数组中都有一个对应的PageInfo对
象。
pages = (struct PageInfo *) boot_alloc(npages * sizeof(struct
PageInfo));
memset(pages, 0, npages * sizeof(struct PageInfo));
// 对每个PageInfo的各项成员填充0初始化
// 至此我们已经分配了初始的内核数据结构,可以开始初始化这些分页结构了
(page_init())。
// 一旦完成,以后所有的内存管理都使用page_*()函数,不再使用boot_alloc()。
page_init();
// 下面执行一些检查。这些函数也定义在pmap.c中。
check_page_free_list(1);
// 检测空闲页面链表无错误。参数1表示仅检查低地址部分。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
书看不完了
- 粉丝: 21
- 资源: 364
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0