Steve,
如下:
From: quntmec@hotmail.com
To: qf.hao@hotmail.com
Subject: 关于《UNIX技术内幕》的勘误及遇到的问题_11
Date: Thu, 27 Oct 2011 19:45:47 +0800
郝先生,
一、对于149页的call()函数,我有以下疑问:
1、第10行(即 mfpi sp)。对于保存之前模式sp入栈的原因我认为是:
1)根据第10页对SP寄存器的介绍,从硬件角度看,系统只有2个SP指针,分别应用于内核栈和用户栈。
2)根据第103页 swtch() 函数,纵观该函数的代码,里面只有第11行涉及到栈指针的保存(即savu(u.u_rsav))。但savu()只将“内核栈指针”保存至u变量中,并不涉及“用户栈指针”;且只对当前栈指针进行保存,之前模式的栈指针并不涉及。
3)因此,如果中断到来时,当系统进入call()函数时,就只有通过(第149页)第10行(mfpi sp)对“之前模式”的栈指针进行保存。
我的理解是否正确?
郝:正确!
2、
第29行(即 jsr pc,
*(r0)+),在第150页中间第5段中对该句有解释(即第15句的解释)。里面认为r0为中断(自陷)服务函数C语言部分的入口地址。那我就觉得有些
疑惑了。原因是:在第151页第4段中提到,终端服务函数调用call()函数的指令是:jsr r0, call。那根据第17页对 jsr reg,
dst 的解释,r0里存放的应该是中断服务函数调用call 函数的指令的下一条指令的地址(即 jsr r0, call
这条指令的下一条指令的地址)。那r0怎么会是“中断(自陷)服务函数C语言部分的入口地址”?
郝:r0存放的是对应C处理函数的地址,请参照139页low.s代码。比如 kwlp:jsr r0,call; _clock,则当进入到call函数时,r0中存放的就是clock函数地址。3、第33行(即 tst (sp)+),不太理解书里的解释是“出栈”(第151页第4段第1行)。你的意思是否是该句的作用仅仅是sp往高地址移动了2个单元(+2)?并没有其他动作(如sp的内容弹出给哪个变量/地址)?
郝:是,否则你能想出更好的指令来完成此操作吗4、第35行(即 rtt),不太理解它如何能运行。我自己所理解的当前栈的内容如下(地址从低到高):
1)PS
2)SP
3)r1
4)PS
5)r0
当第34行(即 mov (sp)+ , r0)执行完后,栈指针应该指向 r0 (往高地址方向)的下一个单元(即示意例子: (SP(r0) + 2))。难道这里还保存有 PC 和 PS(按照 rtt 指令的要求,参看第18页)?
郝:请看第6.7.2节,里面有对时钟中断栈空间分布的解释。适用于其他中断二、勘误
150 |
3 |
1 |
再清除其低5位(应为清除第5~15位,相当于开了中断) |
郝:对,是个很大的失误,其实第152页已经意识到了,最下方的栈分布图中“当前PS(仅保留低5位)”。谢谢Steve
阅读(4801) | 评论(0) | 转发(0) |