第1关:第一次进程切换过程分析
任务描述
本关任务回答问题:
在第一次进程切换时:
1.是从几号进程切换到几号进程?0 号进程和 1 号进程的剩余时间片分别是多少?
2.在(ljmp)切换前,寄存器对 CS:EIP 和 SS:ESP 的值是多少?其下一条指令的地址是多少?0 号进程的 TSS 中的字段对 cs:eip 和 ss:esp 的值是多少?1 号进程的 TSS 中的字段对 cs:eip 和 ss:esp 的值是多少?
3.在(ljmp)切换后,寄存器对 CS:EIP 和 SS:ESP 的值是多少?0 号进程的 TSS 中的字段对 cs:eip 和 ss:esp 的值是多少?1 号进程的 TSS 中的字段对 cs:eip 和 ss:esp 的值是多少?
实验准备
本关卡对版本 1 内核进行修改,内核文件存放在/data/workspace/myshixun/exp1
中。
代码及答案
1.首先配置环境
cp /data/workspace/myshixun/exp1/1.tgz ~/os/
cd os/linux-0.11-lab
tar zxvf ../1.tgz
rm -rf cur
ln -s 1 cur
cd 1/linux/
make
cd ../..
./rungdb
如图所示
2.然后打开mygdb,先新建一个终端,再运行mygdb
在新建终端输入以下代码:
//在一个终端里切换到目录~/os/linux-0.11-lab
cd os/linux/0.11-lab
./mygdb
执行后如下图所示
3.创建断点。
先在sched.c的第136行创建一个断点,查询进程0和进程1的剩余时间片。
跟踪到 switch_to,反汇编找到 ljmp 指令
查询下一条指令的地址
查询寄存器 CS:EIP 和 SS:ESP 的值
查询0 号进程的 TSS 中 cs:eip 和 ss:esp ,以及1 号进程的 TSS 中的字段 cs:eip 和 ss:esp 的值
用si单步执行ljmp指令切换进程,查询CS:EIP 和 SS:ESP 的值
查询0 号进程的 TSS 中 cs:eip 和 ss:esp ,以及1 号进程的 TSS 中的字段 cs:eip 和 ss:esp 的值
4.填写txt,提交测评
第一次进程切换时:
1.是从几号进程切换到几号进程?(0)(1)
2.0号进程和1号进程的剩余时间片分别是多少?(13)(15)
3.在(ljmp)切换前,寄存器对 CS:EIP 和 SS:ESP 的值是多少?(0x8:0x6f33)(0x10:0x1f9cc)
其下一条指令的地址是多少?(0x6f37)
0 号进程的 TSS 中的字段对 cs:eip 和 ss:esp 的值是多少?(0x17:0x0)(0x17:0x0)
1 号进程的 TSS 中的字段对 cs:eip 和 ss:esp 的值是多少?(0xf:0x690a)(0x17:0x25740)
4.在(ljmp)切换后,寄存器对 CS:EIP 和 SS:ESP 的值是多少?(0xf:0x690a)(0x17:0x25740)
0 号进程的 TSS 中的字段对 cs:eip 和 ss:esp 的值是多少?(0x8:0x6f37)(0x10:0x1f9cc)
1 号进程的 TSS 中的字段对 cs:eip 和 ss:esp 的值是多少?(0xf:0x690a)(0x17:0x25740)
(记得ctrl+s保存文档内容哦~)
最后在gdb调试里面quit一下
第2关:第一进程切换时TR寄存器的变化分析
任务描述
本关任务回答问题:
1.第一次进程切换前,CPU 中 TR 寄存器的值是多少?它所指向的 GDT 描述符中的段起始地址是多少?是几号进程的 TSS 地址?
2.第一次进程切换后,CPU 中 TR 寄存器的值是多少?它所指向的 GDT 描述符中的段起始地址是多少?是几号进程的 TSS 地址?
实验准备
本关卡实验版本 1 内核进行修改,使用 gdb 和 dbg 共同调试分析。
代码及答案
1.用第一关搜索到的0x6f33 ljmp地址进行dbg调试
cd os/linux-0.11-lab
./rundbg
1.第一次进程切换前,CPU 中 TR 寄存器的值是多少?(0x0020)它所指向的 GDT 描述符中的段起始地址是多少?(0x0001ed08)是几号进程的 TSS 地址?(0)
2.第一次进程切换后,CPU 中 TR 寄存器的值是多少?(0x0030)它所指向的 GDT 描述符中的段起始地址是多少?(0x00fff2e8)是几号进程的 TSS 地址?(1)