第1关:进程创建前后TR寄存器值的分析

编程要求

根据相关知识,回答问题:(将答案填写在/data/workspace/myshixun/第一关.txt中)

  • 0 号进程的 fork 系统调用(main.c:147)中的陷入指令的地址是多少?
  • 0 号进程执行 fork 系统调用之前,TR 寄存器的值为多少?
  • 0 号进程刚执行完 fork 系统调用时,TR 寄存器的值为多少?

准备阶段

本实训需要设置内核版本 1 为调试分析的对象,用 gdb 调试内核,内核版本 1 的压缩文件存放在/data/workspace/myshixun/exp1中。


首先先解压内核,敲熟悉的老铁已经形成手指肌肉记忆,秒搞定,还不会的友友可以跟着来。

 1.打开终端,分别输入以下指令。

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
cd 1/linux 
make
cd ../..
./rungdb

2.环境配置完了。打开另一个终端,输入以下指令。前面一个不要关闭。

cd ~/os/linux-0.11-lab
./mygdb

3.接着我们会进入到GDB DEBUGING,如图所示。

头歌实验java平台答案最新 头歌实训_头歌实验java平台答案最新

 输入以下指令:

(gdb)b 145
(gdb)c
(gdb)n
(gdb)x/5i $eip
(gdb)si
(gdb)x/5i $eip
(gdb)quit
y
./rundbg
<bochs>b 0x68e8
<bochs>c
<bochs>sreg
<bochs>n
<bochs>sreg

头歌实验java平台答案最新 头歌实训_头歌实验java平台答案最新_02

头歌实验java平台答案最新 头歌实训_头歌实验java平台答案最新_03


第2关:1 号进程创建前后的GDT和PCB分析

编程要求

根据相关知识,回答问题:(将答案填写在/data/workspace/myshixun/第二关.txt中)
注:操作过程中只能出现一个0x0000690a

  • 0 号进程的进程控制块的起始地址是多少?0 号进程的 TSS 的地址是多少?
  • 在 1 号进程创建前,task 数组的前 2 项是多少?GDT 的 4~7 号描述符(64位)是多少?其中存储的段起始地址分别是多少?
  • 在 1 号进程创建后,task 数组的前 2 项是多少?GDT 的 4~7 号描述符(64位)是多少?其中存储的段起始地址分别是多少?
  • 1 号进程的进程控制块的起始地址是多少?1 号进程的 TSS 的地址是多少?1 号进程执行的第一条语句的地址是多少?
  • 1 号进程的核心栈栈底的位置是多少?该位置距离 1 号进程的进程控制块的起始位置有多远(字节数)?

准备阶段

本实训需要设置内核版本 1 为调试分析的对象,用 gdb 调试内核,内核版本 1 的压缩文件存放在/data/workspace/myshixun/exp1中。


内核环境配置不再说,可以看前面的。第一关过的到了第二关可以不用再解压和修改内核,如果重置环境则要。

打开一个终端

cd ~/os/linux-0.11-lab
./rungdb

再打开一个终端,前一个不要关闭.

cd ~/os/linux-0.11-lab
./mygdb
(gdb)b 145
(gdb)c
(gdb)n
(gdb)x/5i $eip
(gdb)si
(gdb)p &task[0]->tss
(gdb)ni 
(gdb)p task
(gdb)x/20wx gdt
(gdb)p &task[1]->tss
(gdb)p/x task[1]->tss

 

头歌实验java平台答案最新 头歌实训_进程创建_04


课堂练习3.2:进程的创建的两关就算全部搞定了,如果对这些指令运行原理感兴趣的话,或者是说答案怎么从这些指令中找出,可以跟我交流噢!OK了,以上是本次文章的全部内容,stay tuned!