Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1764822
  • 博文数量: 76
  • 博客积分: 2175
  • 博客等级: 大尉
  • 技术积分: 2481
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-20 20:49
个人简介

欢迎光临我的博客

文章分类

全部博文(76)

文章存档

2018年(4)

2017年(1)

2016年(2)

2015年(2)

2013年(5)

2012年(29)

2010年(33)

分类: 系统运维

2012-04-19 20:07:29

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位(应为清除第515位,相当于开了中断)

郝:对,是个很大的失误,其实第152页已经意识到了,最下方的栈分布图中“当前PS(仅保留低5位)”谢谢
Steve
阅读(4329) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~