课堂练习3.2:进程的创建——第1关 进程创建前后TR寄存器值的分析

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

任务描述

本关任务回答问题:

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

为了完成本关任务,你需要掌握:

1. 系统调用的处理过程;
2. TR 寄存器的作用;
3. 在 0 号进程执行 fork 系统调用时,所用陷入指令的地址是多少;
4. 0 号进程刚执行完 fork 系统调用是在什么时候;
5. 在 bochsdbg 调试模式下,如何判断当前进程是几号进程;
6. 在 bochsdbg 中如何查看寄存器的值;
7. 在 bochsdbg 中如何反汇编;
8. 在 bochsdbg 中如何单步执行。

准备阶段

本实训需要设置内核版本 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
  1. 打开另一个终端,输入以下指令 (前面一个终端不要关闭)
  cd ~/os/linux-0.11-lab
  ./mygdb
  1. 进入GDB
  (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



问题答案:

1. 0号进程的fork系统调用中的陷入指令的地址是多少?(0x6908)
2. 0号进程执行fork系统用之前,TR寄存器的值为多少?(0x0020)
3. 0号进程刚执行完fork系统调用时,TR寄存器的值为多少?(0x0020)

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

任务描述

本关任务回答问题:

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

为了完成本关任务,你需要掌握:

1. 系统调用的处理过程;
2. TR 寄存器的作用;
3. 如何查看任何一个现有进程的进程控制块;
4. 1 号进程所执行的第一条语句的地址;
5. 0 号进程执行 fork 系统调用时的陷入指令地址;
6. 如何单步执行一条指令直到其运行结束(step over);
7. 进程的核心栈与进程控制块之间的位置关系。

准备阶段

本实训需要设置内核版本 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

-->不需要解压及修改内核的话进行以下操作:

  cd ~/os/linux-0.11-lab
  ./rungdb
  1. 打开另一个终端,输入以下指令 (前面一个终端不要关闭)
  cd ~/os/linux-0.11-lab
  ./mygdb
  1. 进入GDB
(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

问题答案:

1. 0号进程的进程控制块的起始地址是多少?0号进程的TSS的地址是多少?(0xlea20)(0xled08)
2. 在1号进程创建前,task数组的前2项是多少?(0xlea20)(0xfff000)
3. GDT的4-7号描述符是多少?(0x00008b0led080068)(0x00008201ecf00068)(0x000089fff2e80068)(0x000082fff2d00068)
4. 其中存储的段起始地址分别是多少?(0x000led08)(0x0001ecf0)(0x00fff2e8)(0x00fff2d0)
5. 在1号进程创建后,task数组的前2项是多少?(0xlea20)(0xfff000)
6. GDT4-7号描述符是(64位)多少?(0x00008b01ed080068)(0x00008201ecf00068)(0x000089fff2e80068)(0x000082fff2d00068)
7. 其中存储的段起始地址分别是多少?(0x000led08)(0x0001ecf0)(0x00fff2e8)(0x00fff2d0)
8. 1号进程的进程控制块的起始地址是多少?1号进程的TSS的地址是多少?1号进程执行的第一条语向的地址是多少?(0xfff000)(0xfff2e8)(0X0000690a)
9. 1号进程的核心栈栈底的位置是多少?该位置距离1号进程的进程控制块的起始位置有多远(字节数) ?(0x1000000)(4096)
posted @ 2023-04-21 18:03  宸婉  阅读(639)  评论(0)    收藏  举报