4-3 课堂练习4.2:页式内存管理
创建一个进程(创建进程是在磁盘中),进程以字节为单位编号,然后再进程分为许多页(每页 4KB ),内存中有对应的页框(设定同页)。通过页表(记录页和页框的对应关系),将最需要的页调入内存,其他页留在磁盘中。根据 CPU 的需要动态的更新页表,并调入调出页,实现对内存的充分利用。 本实训分析 Linux 0.11 的页式内存管理技术。
第1关1 号进程的 mynext 变量的物理地址
任务描述
本关任务通过调试版本 1.3 内核回答问题:
- 1 号进程第 1 次调用函数 output_char 时,它的 mynext 变量的物理地址是多少?
- 1 号进程第 2 次调用函数 output_char 时,它的 mynext 变量的物理地址是多少?
相关知识
为了完成本关任务,你需要掌握: 1.如何查看 1 号进程的函数调用 output_char() 所对应的汇编指令; 2.如何计算 1 号进程的 mynext 变量的逻辑地址(段地址:段内偏移); 3.在 bochsdbg 中,如何查看一个逻辑地址处的值; 4.如何计算一个线性地址对应的物理地址; 5.如何查看 CR3 寄存器的值; 6.页目录项和页表项的格式是什么; 7.如何查看某个页目录项的值; 8.在 bochsdbg 中,如何直接查看某物理地址处的值; 9.如何计算一个线性地址的高 10 位和中间 10 位的值。
环境准备
本关卡使用版本 1.3 内核进行分析,内核文件存放在/data/workspace/myshixun/exp1
中。
编程要求
通过 gdb 和 dbg 调试查找答案,将第一关的答案填写在/data/workspace/myshixun/第一关.txt
中。
- 1 号进程第 1 次调用函数 output_char 时,它的 mynext 变量的物理地址是多少?
- 1 号进程第 2 次调用函数 output_char 时,它的 mynext 变量的物理地址是多少?
实验过程及答案
实验过程
ls /data/workspace/myshixun/exp1 cp /data/workspace/myshixun/exp1/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
1
./rundbg
答案
第2关0 号进程的 mynext 变量的物理地址
任务描述
本关任务通过调试版本 1.3 内核回答问题:
- 0 号进程第 1 次调用函数 output_char 时,它的 mynext 变量的物理地址是多少?
- 0 号进程第 2 次调用函数 output_char 时,它的 mynext 变量的物理地址是多少?
相关知识
为了完成本关任务,你需要掌握: 1.如何查看 1 号进程的函数调用 output_char() 所对应的汇编指令; 2.如何计算 1 号进程的 mynext 变量的逻辑地址(段地址:段内偏移); 3.在 bochsdbg 中,如何查看一个逻辑地址处的值; 4.如何计算一个线性地址对应的物理地址; 5.如何查看 CR3 寄存器的值; 6.页目录项和页表项的格式是什么; 7.如何查看某个页目录项的值; 8.在 bochsdbg 中,如何直接查看某物理地址处的值。
环境准备
本关卡使用版本 1.3 内核进行分析,内核文件存放在/data/workspace/myshixun/exp1
中。
实验过程及答案
非必要不重新配置环境
实验过程
ls /data/workspace/myshixun/exp1 cp /data/workspace/myshixun/exp1/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
0
答案
4-4 课堂练习4.2:页式内存管理
创建一个进程(创建进程是在磁盘中),进程以字节为单位编号,然后再进程分为许多页(每页 4KB ),内存中有对应的页框(设定同页)。通过页表(记录页和页框的对应关系),将最需要的页调入内存,其他页留在磁盘中。根据 CPU 的需要动态的更新页表,并调入调出页,实现对内存的充分利用。 本实训分析 Linux 0.11 的页式内存管理技术。
第1关页目录和页表的变化
任务描述
本关任务通过调试版本 1.3 内核回答问题: 1.在 1 号进程第 1 次开始执行 output_char 函数调用时,线性地址空间到物理地址空间的映射关系是怎样的? 2.在 1 号进程第 2 次开始执行 output_char 函数调用时,线性地址空间到物理地址空间的映射关系是怎样的? 3.在 1 号进程的第 1、2 次 output_char 函数调用之间,页目录和页表发生了怎样的变化?
相关知识
为了完成本关任务,你需要掌握: 1.如何分析线性地址空间到物理地址空间的映射关系; 2.如何查看 1 号进程的函数调用 output_char() 所对应的汇编指令; 3.如何计算 1 号进程的 mynext 变量的逻辑地址(段地址:段内偏移); 4.在 bochsdbg 中,如何查看一个逻辑地址处的值; 5.如何计算一个线性地址对应的物理地址; 6.如何查看 CR3 寄存器的值; 7.页目录项和页表项的格式是什么; 8.如何查看某个页目录项的值; 9.在 bochsdbg 中,如何直接查看某物理地址处的值。
环境准备
本关卡使用版本 1.3 内核进行调试,内核文件存放在/data/workspace/myshixun/exp1
中。
编程要求
通过 gdb 和 dbg 调试查找答案,将第三关的答案填写在/data/workspace/myshixun/第三关.txt
中。
1.在 1 号进程第 1 次开始执行 output_char 函数调用时,线性地址空间到物理地址空间的映射关系是怎样的? 2.在 1 号进程第 2 次开始执行 output_char 函数调用时,线性地址空间到物理地址空间的映射关系是怎样的? 3.在 1 号进程的第 1、2 次 output_char 函数调用之间,页目录和页表发生了怎样的变化?
实验过程及答案
实验过程
ls /data/workspace/myshixun/exp1 cp /data/workspace/myshixun/exp1/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 ../.. ./rundbg
答案
第2关用户栈和核心栈的物理位置
任务描述
本关任务回答问题: 使用版本 1 内核时,在第 2 次进程调度后:
- 0 号进程和 1 号进程的进程控制块的地址分别是多少?
- 执行到函数 task0 时,0 号进程的用户栈栈顶位于物理内存何处?
- 0 号进程执行到函数 sys_pause 时,核心栈栈顶位于物理内存何处?
- 执行到函数 task1 时,1 号进程的用户栈栈顶位于物理内存何处?
- 1 号进程执行到函数 sys_pause 时,核心栈栈顶位于物理内存何处?
相关知识
为了完成本关任务,你需要掌握: 1.在 bochsdbg 中,如何跟踪到第 2 次进程调度; 2.如何得到一个函数的地址; 3.如何知道当前栈顶的物理位置; 4.什么时候使用核心栈?什么时候使用用户栈? 5.进程的核心栈与进程控制块之间的位置关系是什么; 6.在 bochsdbg 调试模式下,如何判断当前进程是几号进程; 7.如何计算一个线性地址对应的物理地址; 8.如何查看 CR3 寄存器的值; 9.如何计算一个线性地址的高 10 位和中间 10 位的值; 10.页目录项和页表项的格式是什么; 11.如何查看某个页目录项的值; 12.在 bochsdbg 中,如何直接查看某物理地址处的值。
实验准备
本关卡使用版本 1 内核进行调试分析,内核文件存放在/data/workspace/myshixun/exp4
中。
编程要求
通过 gdb 和 dbg 调试查找答案,将第四关的答案填写在/data/workspace/myshixun/第四关.txt
中。 使用版本 1 内核时,在第 2 次进程调度后:
- 0 号进程和 1 号进程的进程控制块的地址分别是多少?
- 执行到函数 task0 时,0 号进程的用户栈栈顶位于物理内存何处?
- 0 号进程执行到函数 sys_pause 时,核心栈栈顶位于物理内存何处?
- 执行到函数 task1 时,1 号进程的用户栈栈顶位于物理内存何处?
- 1 号进程执行到函数 sys_pause 时,核心栈栈顶位于物理内存何处?
实验过程及答案
实验过程
ls /data/workspace/myshixun/exp4 cp /data/workspace/myshixun/exp4/1.tgz ~/os
cd os/linux-0.11-lab tar -zxvf ../1.tgz 1
rm -rf cur ln -s 1 cur ls
另开一个终端
答案