课堂练习4.3:段页式内存管理

dae2be1627594de2bae005076972a3fa.png

4-5 课堂练习4.3:段页式内存管理

段页式管理就是将程序分为多个逻辑段,在每个段里面又进行分页,即将分段和分页组合起来使用。这样做的目的就是想同时获得分段和分页的好处,但又避免了单独分段或单独分页的缺陷。 本实训分析 Linux 0.11 的段页式内存管理技术。

193f004fce8b4501b6c033ed96fed3c3.png

 

第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

94131b9c442641aca067c450afc62e04.png

cd os/linux-0.11-lab
tar -zxvf ../1.tgz 1

de0ebd3263cc4230a9de53bf430dcc0c.png

rm -rf cur
ln -s 1 cur
ls

f12d91d64d9c4b5db1cbd88daf504c59.png

cd 1/linux
make

ee35757477f1428b93032742a723085e.png

cd ../..
./rungdb

23f0bde27ee344dd940cda4d4cb7acf8.png

另开一个终端

cd os/linux-0.11-lab
./mygdb

164f5c0adaf1445daea419b6f8c24e68.png

fbccbf4fbd914128aef6f8f233cd2e02.pngaa32bcda893c48e69a4f0d09eb263d11.png71385efd2b7748c0947c93a20ada2841.png0350ca38a71e4a2f864033d21adff816.png

79c8f27336734aaeb7fee31bb7c98402.png

dd145486f77242f9b10c6efca7d8233c.png571019439d614f298ef01888a0434525.png7591f095bed1418da571da1d306463ee.png7bf60877310346839cb97fa760c5d999.png90b1e3da99a548cabf0c6a190e2c445c.pnga0cb8c1029524f2e8748d6f9a1b3271f.png

答案

f129f413c4114c11aa0ec8ae4d0ba543.png

 

第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

d501bcd8cb96494ba7c8ec9e20e99c4a.png

cd os/linux-0.11-lab
tar -zxvf ../1.3.tgz 1.3

5f0412a122c8491aba75762d9745f537.png

rm -rf cur
ln -s 1.3 cur
ls

38d76b9d18bc4449a9cbd034b09c2522.png

cd 1.3/linux
make

8ca61fc91296413aa4fe3c7ed4fdf283.png

cd ../..
./rungdb

23f0bde27ee344dd940cda4d4cb7acf8.png

另开一个终端

cd os/linux-0.11-lab
./mygdb

164f5c0adaf1445daea419b6f8c24e68.png

3a1d9eb8a7094e83bef9f30fd669d398.png036ec9efa49e43cb8036381197a48313.pngccef0c0956094bdca5c2dc6753e5f63c.png

7af392b9f3eb46ba902e8e92ea7db18b.png3a0d6a1e68694b3e85ed2de44e633cf1.pngfaa203fd66314eb1bab419445cb756fe.png93ca6af3414e4444a1a52c48a71bbb90.png524b8a1d98934b8faa0068ae95ae345a.pngdb4c0ca1ffc44bee9039e7a73ced393d.pnge32981c417bf4d2e8132b9f19e434526.png88eda30eb9da4cffa3011d483b27a7cf.png81c6e5f4aca74861904903f8c85a77a8.png7177d9f8d4c545a3a5244600d0480c7c.png

答案

666eb67e71b4402a9c1eb0d352e01f06.png

4-6 课堂练习4.3:段页式内存管理

段页式管理就是将程序分为多个逻辑段,在每个段里面又进行分页,即将分段和分页组合起来使用。这样做的目的就是想同时获得分段和分页的好处,但又避免了单独分段或单独分页的缺陷。 本实训分析 Linux 0.11 的段页式内存管理技术

c5054760e8eb4b07a2b69c1658012ac3.png

第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

94131b9c442641aca067c450afc62e04.png

cd os/linux-0.11-lab
tar -zxvf ../1.tgz 1

de0ebd3263cc4230a9de53bf430dcc0c.png

rm -rf cur
ln -s 1 cur
ls

f12d91d64d9c4b5db1cbd88daf504c59.png

cd 1/linux
make

ee35757477f1428b93032742a723085e.png

cd ../..
./rungdb

23f0bde27ee344dd940cda4d4cb7acf8.png

另开一个终端

cd os/linux-0.11-lab
./mygdb

164f5c0adaf1445daea419b6f8c24e68.png

1731195999b34afead812091e8acd864.png695f8b2e01e74f208bfb09c46af34a08.png

9a47c6c0e36f4e9c92f648c65a43db51.png7685213b3df4499ea25c1fcf0c9b0fe3.png153f35a3dafa40069de4a012abfe5b1b.pngdcf30f3bdc6d4c8c8f3df3fbad64f2ec.png77f5f442469d4e5f9ee4aa3c19bfd229.pngc16c1095361545328d4467e5490b2f0d.pnge9510f2d447744049748dee9eef73dc4.png56a43aee00a04e32bb36717d4cc6944c.pnga1cecb15a8d14734809f2698a522c862.png0809461157cb4dbbb6f41209a5fbfc1d.png

答案

77ceccff4451403d9977657f63e33fcb.png

 

第2关父子进程间的共享内存通信实现

任务描述

本关任务:改写版本 1.3 内核,使得 0 号进程顺序循环输出小写字母 abc . . . ,每输出一个字母就执行 pause 系统调用; 1 号进程的行为类似,只不过将小写变为大写;同时要求两个进程输出的字符是关联递增的,即如果 0 号进程上一次输出了字符a,那么这一次如果是 1 号进程运行,那它应该输出字符B,反之亦然,运行画面如下图所示。(要求还是使用 int 0x81 输出字符,且不能修改 int 0x81 的实现方式)

 

fab257e1d9f097edac6ac5da5c3b94e5.png

相关知识

为了完成本关任务,你需要掌握: 1.在 Linux 0.11 中创建进程时,是如何将父进程的内存空间拷贝给子进程的; 2.子进程的虚空间是怎样被映射到与父进程的虚空间相同的物理空间上去的; 3.如何分析线性地址空间到物理地址空间的映射关系; 4.如何直接显示线性地址空间到物理地址空间的映射关系; 5.如何计算一个线性地址对应的物理地址; 6.如何查看 CR2 和 CR3 寄存器的值; 7.页目录项和页表项的格式是什么; 8.如何查看某个页目录项的值; 9.在 bochsdbg 中,如何直接查看某物理地址处的值。

实验准备

本关卡使用版本 1.3 内核进行修改,内核文件存放在/data/workspace/myshixun/exp2中。

编程要求

本关任务:改写版本 1.3 内核,使得 0 号进程顺序循环输出小写字母 abc . . . ,每输出一个字母就执行 pause 系统调用; 1 号进程的行为类似,只不过将小写变为大写;同时要求两个进程输出的字符是关联递增的,即如果 0 号进程上一次输出了字符a,那么这一次如果是 1 号进程运行,那它应该输出字符B,反之亦然,运行画面如下图所示。(要求还是使用 int 0x81 输出字符,且不能修改 int 0x81 的实现方式)

fab257e1d9f097edac6ac5da5c3b94e5.png

实验过程及答案

实验过程

ls /data/workspace/myshixun/exp2
cp /data/workspace/myshixun/exp2/1.3.tgz ~/os

ffbf8ba7f7b143228f32ccfca5555486.png

cd os/linux-0.11-lab
tar -zxvf ../1.3.tgz 1.3

0dd2b8f31ffe47a4b83c38f3d45b51d4.png

打开桌面vscode19654a851255497f9c85fe3b0b42adec.png4c0892db75354cbca2ce8700ffb1d635.png2760352bc87247a681a5ee92cb92c63b.png1ef347729d844ee1aeeb5d3890814565.png

打开main.c

203154d9a7034295a923b2f740fdaf21.png680ed07988344e46af739ec387136b3a.png改为如下

5d61335fda5a451c9197288b3336e79f.png

5e6fd2deff734f5591097646571de538.png

改为如下d888c2757d4d4c509d5b81f3edb07fd3.png

9ca29056230a423b8ff13d375cda1f9f.png

改为如下45a5a57fc8934177ad8b12e50f947447.png

5ee8915f14aa44aaa8e299d9aaadae9a.png改为如下

 e8ec9740fd514534ad0afe145954e0d5.png

52ca907963134320ba76314605b64465.png

改为如下

45376051acf443818d3b85289b6c3b00.png

打开memory.c

936b27cf47064a77a8a7354c281aef95.pngbe4722a686204b0bbbc5742c72e51bf6.png改为如下

6c78a6868d2c43c7ba228d52f9d44d7d.png

6c3fd73bc3fb430995e1eda0bb5f48ba.png

改为如下

620752bcf75e4c86acffca0a6b27a759.png

rm -rf cur
ln -s 1.3 cur
ls

345713d334dd4d789d2308d8e7e31760.png

cd 1.3/linux
make

013eebd9da78483591f79c9768e06d3b.png

d092d18be74b4335b056605af3fa7224.pngfe772afbedb0455a85bfe7f9f98a8b47.png

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ItsNorth

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值