第1关:任务寄存器(TR)的分析

编程要求

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

  1. 1 号进程的任务状态段(TSS)的地址是多少?1 号进程的核心栈栈底的位置是多少?

  1. 1 号进程运行时,任务寄存器(TR)的值是多少?它指向的任务状态段描述符的值是多少?该描述符里记录的任务状态段起始地址是多少?

先配置版本内核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
./mygdb

在gdb调试器:

b task1
c
p *current
p/x current->tss
p &current->tss
quit

启动dbg调试器:

./rundbg

在dbg调试器中输入:

b 0x7985
c
sreg
x/14wx 0x5cc0

第2关:1 号进程的状态变化

编程要求

根据相关知识,回答问题:(将答案填写在/data/workspace/myshixun/第二关.txt中)1 号进程第一次由睡眠态变为就绪态时:

  • 系统处于几号进程的上下文(或者说,当前进程是几号进程)?

  • 内核的函数调用栈中的底层函数是什么?内核处于哪种控制流(选择:系统调用、中断、异常)?

  • 后续回到用户态时,恢复点的位置是什么?以前的断点位置是什么?

该版本内核使用与第一关相同的版本1内核,详细环境配置操作请移步本文章第一关~

在gdb调试器中:

b sys_pause if current->pid==1
b sched.c:120 if p->pid ==1
c
display current->state
n
c
p p->pid
p p->state
bt
disable
finish
list
finish
x/3i $eip
si
si

x/28i $eip
b *0x77dd
c
si
disassemble
info registers
quit

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐