4-1 课堂练习4.1:段式内存管理
段式内存管理以段为单位分配内存空间,段内连续,段间可以不连续。段可以很大,比如数据段、代码段、栈段等。本实训分析 Linux 0.11 的段式内存管理技术。
第1关1 号进程 mynext 变量的逻辑地址与线性地址
任务描述
本关任务调试版本 1.3 内核并回答问题:
- 1 号进程的函数调用 output_char() 所对应的第一条汇编指令的地址是多少?
- 1 号进程的 mynext 变量所在的段地址和段内偏移是多少?该段地址对应到几号描述符?存放在哪个段描述符表中(GDT/LDT)?
- 1 号进程的进程控制块中的 ldt 数组的起始地址是多少?其中 1 号和 2 号描述符里存放的段起始地址分别是多少?
- 1 号进程的 mynext 变量所在的线性地址是多少?
相关知识
为了完成本关任务,你需要掌握: 1.如何查看 1 号进程的函数调用 output_char() 所对应的汇编指令; 2.如何计算 1 号进程的 mynext 变量的逻辑地址(段地址:段内偏移); 3.段寄存器值(如 ds )的含义是什么; 4.如何查看进程的 LDT ; 5.如何从段描述符的值计算出段的起始地址。
环境准备
本实训 5 个关卡全部使用版本 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
答案
第2关0号进程 mynext 变量的逻辑地址与线性地址
任务描述
本关任务调试版本 1.3 内核回答问题:
- 0 号进程的函数调用 output_char() 所对应的第一条汇编指令的地址是多少?
- 0 号进程的 mynext 变量所在的段地址和段内偏移是多少?该段地址对应到几号描述符?存放在哪个段描述符表中(GDT/LDT)?
- 0 号进程的进程控制块中的ldt数组的起始地址是多少?其中 1 号和 2 号描述符里存放的段起始地址分别是多少?
- 0 号进程的 mynext 变量所在的线性地址是多少?
相关知识
为了完成本关任务,你需要掌握:
- 如何查看 0 号进程的函数调用 output_char() 所对应的汇编指令;
- 如何计算 0 号进程的 mynext 变量的逻辑地址(段地址:段内偏移);
- 段寄存器值(如 ds )的含义是什么;
- 如何查看进程的 LDT ;
- 如何从段描述符的值计算出段的起始地址。
编程要求
根据相关知识,修改版本 1.3 内核回答问题: 通过 gdb 调试查找答案,将第二关的答案填写在/data/workspace/myshixun/第二关.txt
中。
-
0 号进程的函数调用 output_char() 所对应的第一条汇编指令的地址是多少?
-
0 号进程的 mynext 变量所在的段地址和段内偏移是多少?该段地址对应到几号描述符?存放在哪个段描述符表中(GDT/LDT)?
-
0 号进程的进程控制块中的 ldt 数组的起始地址是多少?其中 1 号和 2 号描述符里存放的段起始地址分别是多少?
-
0 号进程的 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
答案
4-2 课堂练习4.1:段式内存管理
段式内存管理以段为单位分配内存空间,段内连续,段间可以不连续。段可以很大,比如数据段、代码段、栈段等。本实训分析 Linux 0.11 的段式内存管理技术。
第1关0号进程和1号进程的mynext变量的取值变化
任务描述
本关任务调试版本 1.3 内核回答问题:
- 1 号进程的 output_char 函数调用会执行几次?
- 每次调用时,1 号进程和 0 号进程的 mynext 变量的值分别是多少?
相关知识
为了完成本关任务,你需要掌握:
- 如何查看 1 号进程的函数调用 output_char() 所对应的汇编指令;
- 在 gdb 中如何正确查看 1 号进程的 mynext 变量的值;
- 如何在断点被捕获时自动执行一组命令;
- 段寄存器值(如 ds )的含义是什么;
- 如何查看进程的 LDT 。
编程要求
根据相关知识,修改版本 1.3 内核回答问题: 通过 gdb 调试查找答案,将第三关的答案填写在/data/workspace/myshixun/第三关.txt
中。
- 1 号进程的 output_char 函数调用会执行几次?
- 每次调用时,1 号进程和 0 号进程的 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
由前两关实验我们得到了0号进程和1号进程的线性地址
答案
第2关LDTR 寄存器
任务描述
本关任务调试版本 1.3 内核回答问题:
- 1 号进程(在用户态)运行时,LDTR 寄存器的值是多少?它指向 GDT 中的几号描述符?该段描述符内的段起始地址是多少?指向哪个进程的 ldt 数组?
- 0 号进程(在用户态)运行时,LDTR 寄存器的值是多少?它指向 GDT 中的几号描述符?该段描述符内的段起始地址是多少?指向哪个进程的 ldt 数组?
相关知识
为了完成本关任务,你需要掌握:
- 在 bochsdbg 中如何跟踪到 1 号进程(在用户态)运行时;
- 如何查看 1 号进程的函数调用 output_char() 所对应的汇编指令;
- 在 bochsdbg 中如何查看 LDTR 的值?其含义是什么?
- 段寄存器值(如 DS )的含义是什么;
- 如何查看进程的 LDT ;
- 如何从段描述符的值计算出段的起始地址。
编程要求
根据相关知识,修改版本 1.3 内核回答问题: 通过 gdb 调试查找答案,将第四关的答案填写在/data/workspace/myshixun/第四关.txt
中。
- 1 号进程(在用户态)运行时,LDTR 寄存器的值是多少?它指向 GDT 中的几号描述符?该段描述符内存的段起始地址是多少?指向哪个进程的 ldt 数组?
- 0 号进程(在用户态)运行时,LDTR 寄存器的值是多少?它指向 GDT 中的几号描述符?该段描述符内存的段起始地址是多少?指向哪个进程的 ldt 数组?
实验过程及答案
延用第一关配置,非必要不重新配置环境
实验过程
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
答案
第3关内核代码段和数据段的段基址
任务描述
本关任务调试版本 1.3 内核回答问题:
- 0 号进程执行到 sys_pause 时,默认数据段(CS)和默认数据段(DS)的值分别是多少?其基地址分别是多少?
- 1 号进程执行到 sys_pause 时,默认数据段(CS)和默认数据段(DS)的值分别是多少?其基地址分别是多少?
相关知识
为了完成本关任务,你需要掌握:
- 在 gdb 中如何查看全局描述符表;
- 在 Linux 0.11 中,内核程序运行时访问的线性地址空间是什么?;
- 在 bochsdbg 中如何查看 LDTR 的值?其含义是什么?;
- 段寄存器值(如 DS )的含义是什么;
- 如何从段描述符的值计算出段的起始地址。
编程要求
根据相关知识,修改版本 1.3 内核回答问题: 通过 gdb 调试查找答案,将第五关的答案填写在/data/workspace/myshixun/第五关.txt
中。
1.0 号进程执行到 sys_pause 时,默认数据段(CS)和默认数据段(DS)的值分别是多少?其基地址分别是多少? 2.1 号进程执行到 sys_pause 时,默认数据段(CS)和默认数据段(DS)的值分别是多少?其基地址分别是多少?
实验过程及答案
延用第一关配置,非必要不重新配置环境
实验过程
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