4-5 课堂练习4.3:段页式内存管理
段页式管理就是将程序分为多个逻辑段,在每个段里面又进行分页,即将分段和分页组合起来使用。这样做的目的就是想同时获得分段和分页的好处,但又避免了单独分段或单独分页的缺陷。 本实训分析 Linux 0.11 的段页式内存管理技术。
第1关进程创建前后页目录和页表的变化
任务描述
本关任务分析版本 1 内核回答问题: 1.在 0 号进程执行 fork 系统调用之前,线性地址空间到物理地址空间的映射关系是怎样的? 2.在 0 号进程刚执行完 fork 系统调用时,线性地址空间到物理地址空间的映射关系是怎样的? 3.在 0 号进程执行 fork 系统调用前后,页目录发生了怎样的变化?
相关知识
为了完成本关任务,你需要掌握: 1.如何跟踪到一个系统调用的陷入指令(int 0x80)执行之前; 2.在 bochsdbg 中,如何跟踪到 0 号进程执行 fork 系统调用之前?如何继续跟踪到刚执行完该 fork 系统调用? 3.如何分析线性地址空间到物理地址空间的映射关系; 4.如何直接显示线性地址空间到物理地址空间的映射关系; 5.在 bochsdbg 调试模式下,如何判断当前进程是几号进程; 6.如何计算一个线性地址对应的物理地址; 7.如何查看 CR3 寄存器的值; 8.如何计算一个线性地址的高 10 位和中间 10 位的值; 9.页目录项和页表项的格式是什么; 10.如何查看某个页目录项的值; 11.在 bochsdbg 中,如何直接查看某物理地址处的值。
环境准备
本关卡使用版本 1 内核进行分析,内核文件存放在/data/workspace/myshixun/exp1
中。
编程要求
通过 gdb 和 dbg 调试查找答案,将第一关的答案填写在/data/workspace/myshixun/第一关.txt
中。 本关任务分析版本 1 内核回答问题: 1.在 0 号进程执行 fork 系统调用之前,线性地址空间到物理地址空间的映射关系是怎样的? 2.在 0 号进程刚执行完 fork 系统调用时,线性地址空间到物理地址空间的映射关系是怎样的? 3.在 0 号进程执行 fork 系统调用前后,页目录发生了怎样的变化?
实验过程及答案
实验过程
ls /data/workspace/myshixun/exp1 cp /data/workspace/myshixun/exp1/1.tgz ~/os
cd os/linux-0.11-lab tar -zxvf ../1.tgz 1
rm -rf cur ln -s 1 cur ls
cd 1/linux make
cd ../.. ./rungdb
另开一个终端
cd os/linux-0.11-lab ./mygdb
答案
第2关1 号进程对 mynext 变量的第一次修改
任务描述
本关任务通过调试版本 1.3 内核回答问题: 1.1 号进程修改 mynext 变量的指令地址是多少? 2.1 号进程的 mynext 变量的线性地址是多少? 3.在 1 号进程第一次修改 mynext 变量之前,上述线性地址对应的页表项的值是多少?该线性地址被映射到的物理地址(旧物理地址)是多少? 4.在 1 号进程第一次修改 mynext 变量时,会引发页故障,在页故障处理程序刚开始执行时,CR2 寄存器的值是多少? 5.在此页故障处理完回到恢复点时,恢复点的地址是什么?此时上述线性地址对应的页表项的值是多少?该线性地址被映射到的物理地址(新物理地址)是多少? 6.在恢复点指令执行后,上述新物理地址处的值是多少?上述旧物理地址处的值是多少?
相关知识
为了完成本关任务,你需要掌握: 1.如何查看 1 号进程修改 mynext 变量的指令地址; 2.在 bochsdbg 中,如果当前指令会引发页故障,怎么跟踪进入页故障处理程序; 3.如何跟踪到一个中断/异常处理程序对应的 iret 指令; 4.如何分析线性地址空间到物理地址空间的映射关系; 5.如何直接显示线性地址空间到物理地址空间的映射关系; 6.如何计算一个线性地址对应的物理地址; 7.如何查看 CR2 寄存器的值; 8.如何计算一个线性地址的高 10 位和中间 10 位的值; 9.页目录项和页表项的格式是什么; 10.如何查看某个页目录项的值; 11.在 bochsdbg 中,如何直接查看某物理地址处的值。
实验准备
本关卡使用版本 1.3 内核进行分析,内核文件存放在/data/workspace/myshixun/exp2
中。
编程要求
通过 gdb 和 dbg 调试查找答案,将第二关的答案填写在/data/workspace/myshixun/第二关.txt
中。 本关任务分析版本 1 内核回答问题: 1.1 号进程修改 mynext 变量的指令地址是多少? 2.1 号进程的 mynext 变量的线性地址是多少? 3.在 1 号进程第一次修改 mynext 变量之前,上述线性地址对应的页表项的值是多少?该线性地址被映射到的物理地址(旧物理地址)是多少? 4.在 1 号进程第一次修改 mynext 变量时,会引发页故障,在页故障处理程序刚开始执行时,CR2 寄存器的值是多少? 5.在此页故障处理完回到恢复点时,恢复点的地址是什么?此时上述线性地址对应的页表项的值是多少?该线性地址被映射到的物理地址(新物理地址)是多少? 6.在恢复点指令执行后,上述新物理地址处的值是多少?上述旧物理地址处的值是多少?
实验过程及答案
实验过程
ls /data/workspace/myshixun/exp2 cp /data/workspace/myshixun/exp2/1.3.tgz ~/os
cd os/linux-0.11-lab tar -zxvf ../1.3.tgz 1.3
rm -rf cur ln -s 1.3 cur ls
cd 1.3/linux make
cd ../.. ./rungdb
另开一个终端
cd os/linux-0.11-lab ./mygdb
答案
4-6 课堂练习4.3:段页式内存管理
段页式管理就是将程序分为多个逻辑段,在每个段里面又进行分页,即将分段和分页组合起来使用。这样做的目的就是想同时获得分段和分页的好处,但又避免了单独分段或单独分页的缺陷。 本实训分析 Linux 0.11 的段页式内存管理技术
第1关第一次页故障
任务描述
本关任务通过分析版本 1 内核回答问题: 系统的第一次页故障发生时: 1.当时正在执行几号进程? 正在访问的线性地址是多少? 2.该线性地址当时对应的页表项是什么?被映射到的物理地址是什么? 3.该页故障处理完后,该线性地址对应的页表项是什么?被映射到的物理地址是什么? 4.引发这次页故障的指令地址是什么? 5. main 函数中的 fork 系统调用的陷入指令的地址是多少?
相关知识
为了完成本关任务,你需要掌握: 1.如何跟踪到第一次页故障发生; 2.在 bochsdbg 调试模式下,如何判断当前进程是几号进程; 3.如何得到一个函数或全局变量的地址; 4.如何知道是对哪个线性地址的访问引发了页故障; 5.如何跟踪到一个中断/异常处理程序对应的 iret 指令; 6.如何分析线性地址空间到物理地址空间的映射关系; 7.如何直接显示线性地址空间到物理地址空间的映射关系; 8.如何计算一个线性地址对应的物理地址; 9.如何查看 CR2 和 CR3 寄存器的值; 10.如何计算一个线性地址的高 10 位和中间 10 位的值; 11.页目录项和页表项的格式是什么; 12.如何查看某个页目录项的值; 13.在 bochsdbg 中,如何直接查看某物理地址处的值; 14.在 0 号进程执行 fork 系统调用时,所用陷入指令的地址是多少。
实验准备
本关卡使用版本 1 内核进行分析,内核文件存放在/data/workspace/myshixun/exp1
中。
编程要求
根据相关知识回答问题,将第三关答案填写在/data/workspace/myshixun/第三关.txt
中。 系统的第一次页故障发生时: 1.当时正在执行几号进程? 正在访问的线性地址是多少? 2.该线性地址当时对应的页表项是什么?被映射到的物理地址是什么? 3.该页故障处理完后,该线性地址对应的页表项是什么?被映射到的物理地址是什么? 4.引发这次页故障的指令地址是什么? 5. main 函数中的 fork 系统调用的陷入指令的地址是多少?
实验过程及答案
实验过程
ls /data/workspace/myshixun/exp1 cp /data/workspace/myshixun/exp1/1.tgz ~/os
cd os/linux-0.11-lab tar -zxvf ../1.tgz 1
rm -rf cur ln -s 1 cur ls
cd 1/linux make
cd ../.. ./rungdb
另开一个终端
cd os/linux-0.11-lab ./mygdb
答案
第2关父子进程间的共享内存通信实现
任务描述
本关任务:改写版本 1.3 内核,使得 0 号进程顺序循环输出小写字母 a
、b
、c
. . . ,每输出一个字母就执行 pause 系统调用; 1 号进程的行为类似,只不过将小写变为大写;同时要求两个进程输出的字符是关联递增的,即如果 0 号进程上一次输出了字符a
,那么这一次如果是 1 号进程运行,那它应该输出字符B
,反之亦然,运行画面如下图所示。(要求还是使用 int 0x81 输出字符,且不能修改 int 0x81 的实现方式)
相关知识
为了完成本关任务,你需要掌握: 1.在 Linux 0.11 中创建进程时,是如何将父进程的内存空间拷贝给子进程的; 2.子进程的虚空间是怎样被映射到与父进程的虚空间相同的物理空间上去的; 3.如何分析线性地址空间到物理地址空间的映射关系; 4.如何直接显示线性地址空间到物理地址空间的映射关系; 5.如何计算一个线性地址对应的物理地址; 6.如何查看 CR2 和 CR3 寄存器的值; 7.页目录项和页表项的格式是什么; 8.如何查看某个页目录项的值; 9.在 bochsdbg 中,如何直接查看某物理地址处的值。
实验准备
本关卡使用版本 1.3 内核进行修改,内核文件存放在/data/workspace/myshixun/exp2
中。
编程要求
本关任务:改写版本 1.3 内核,使得 0 号进程顺序循环输出小写字母 a
、b
、c
. . . ,每输出一个字母就执行 pause 系统调用; 1 号进程的行为类似,只不过将小写变为大写;同时要求两个进程输出的字符是关联递增的,即如果 0 号进程上一次输出了字符a
,那么这一次如果是 1 号进程运行,那它应该输出字符B
,反之亦然,运行画面如下图所示。(要求还是使用 int 0x81 输出字符,且不能修改 int 0x81 的实现方式)
实验过程及答案
实验过程
ls /data/workspace/myshixun/exp2 cp /data/workspace/myshixun/exp2/1.3.tgz ~/os
cd os/linux-0.11-lab tar -zxvf ../1.3.tgz 1.3
打开桌面vscode
打开main.c
改为如下
改为如下
改为如下
改为如下
改为如下
打开memory.c
改为如下
改为如下
rm -rf cur ln -s 1.3 cur ls
cd 1.3/linux make