PA3.2
目录
思考题
1. ⼀些问题
- 因为自身存在低
12
位的偏移量 - 物理地址是必须的,否则使用虚拟地址会陷入死循环
- 使用多级页表可以使得页表在内存中离散存储;使用多级页表可以节省页表内存。
2. 空指针真的是'空'的吗?
空指针应该也表示一个虚拟地址,只不过在虚拟地址转换为物理地址后,对应的物理地址会触发空指针解引用的错误。
3. 理解 _map 函数
先取页目录基地址,然后根据虚拟地址和基地址得到页目录项,判断是否需要新的页表,如果需要,就 申请一个新的页表,并且把这个页表的地址和其他的标志位一起存到一个页目录项里面,并且根据虚拟 地址就得到了一个页表项,最后把物理地址和标志位一起放到一个页表项里面写入。
4. 内核映射的作⽤
pd_val.present
报错。因为没有进行内核映射拷贝,所以没有页表来存放对应的内核区的虚拟地址,就会出现这种报错。
5. git log 和 远程仓库截图
git log
仓库截图
操作题
1.添加分页控制相关寄存器
首先打开HAS_PTE
宏(nano-lites/src/main.c
)
之后找到nemu/include/memory/mm.h
对CR3,CR0
寄存器进行初始化
然后在restart()
函数中对CR0
进行初始化为0x60000011
,z在nemu/src/monitor/monitor.c
中
2.修改访存函数
修改vaddr_read()
和 vaddr_write()
函数(nemu/src/memory/memory.c
)
3.page_translate()
然后编写 page_translate()
函数
先声明paddr_t page_translate(vaddr_t vaddr,bool w);
之后补全函数
之后修改nanos-lite/src/main.c
最后发现指令还未实现完全还需要实现mov_r2cr() mov_cr2r()
填表:
/* 0x20 */ IDEX(mov_G2E,mov_cr2r), EMPTY, IDEX(mov_E2G,mov_r2cr), EMPTY,
实现make_EHelper(mov_r2cr)
make_EHelper(mov_r2cr) {//给cr寄存器赋值
switch (id_dest->reg)
{
case 0:
cpu.cr0.val = id_src->val;
break;
case 3:
cpu.cr3.val = id_src->val;
break;
default:
assert(0);
break;
}
print_asm("movl %%%s,%%cr%d", reg_name(id_src->reg, 4), id_dest->reg);
}
实现make_EHelper(mov_cr2r)
make_EHelper(mov_cr2r) {//给寄存器赋值
switch (id_dest->reg)
{
case 0:
id_src->val = cpu.cr0.val;
break;
case 3:
id_src->val = cpu.cr3.val;
break;
default:
assert(0);
break;
}
print_asm("movl %%cr%d,%%%s", id_src->reg, reg_name(id_dest->reg, 4));
#ifdef DIFF_TEST
diff_test_skip_qemu();
#endif
}
4.修改 loader()
首先修改navy-apps/Makefile.compile
中的链接地址为 0x8048000 并重新编译,nanoslite/src/loader.c
中的 DEFAULT_ENTRY 也要作相应的修改。
之后修改loader
函数如图所示
5.在分页上运行仙剑奇侠传
修改syscall.c
文件中的sys_brk
函数为
之后在PUTTY
中运行仙剑奇侠传即可,结果如图
新的故事:
实验心得
本次实验主要了解了分页的机制问题, 实现了在分页上运行仙剑奇侠传,通过前面多次实验的学些,本次实验可以大体知道出现错误时的错误来源和解决方案,实现基本独立解决问题,同时也对计算机组成原理这门课的理解更进一步。
备注
无
原文地址:https://www.cnblogs.com/shangjin2001/p/15102207.html
- Windows NLB搭配IIS的ARR搭建高可用环境
- hadoop: hbase1.0.1.1 伪分布安装
- InstallShield 脚本语言学习笔记
- C++服务器开发之笔记三
- 分布式服务注册和发现consul 简要介绍
- ZooKeeper 笔记(3) 实战应用之【统一配置管理】
- 3D游戏开发之在UE4中创建非玩家角色(NPC)
- VMware Fusion DHCP方式下如何指定虚拟机IP地址
- Visual Studio 2015正式发布
- 科技巨头纷纷入局 医疗人工智能需要奋起直追?
- Windows PowerShell 工具
- 游戏开发之在UE4中编写C++代码控制角色
- Visual Studio 64位应用程序编译
- Windows 7 上安装Visual Studio 2015 失败解决方案
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- kubernetes-身份与权限认证(十四)
- kubernetes-控制器statefulset和Job(十三)
- kubernetes-存储卷(十二)
- kubernetes-配置管理(十一)
- ceph-mimic版
- kubernetes-ingress(十)
- kubernetes-控制器Deployment和DaemonSet(八)
- kubernetes集群网络
- kubernetes-深入理解pod对象(七)
- kubernetes-核心概念及创建应用(六)
- k8s1.13.0二进制部署-Dashboard和coredns(五)
- kubernetes监控-prometheus(十六)
- kubernetes监控-Heapster+InfluxDB+Grafana(十五)
- centos7 安装mysql5.7
- ceph-简介及安装(luminous)版