Chinaunix

标题: 单处理器下,异常处理程序和内核态的进程之间需要锁么? [打印本页]

作者: spt_zeus    时间: 2008-08-14 18:17
标题: 单处理器下,异常处理程序和内核态的进程之间需要锁么?
在ULK2的1.6.5.1节中,看到下面这段话:

Therefore, on a uniprocessor system, all kernel data structures that are not updated by interrupts or exception handlers are safe for the kernel to access.

这里为什么要说"or exception handler"? 我觉得不需要吧?


bow!
作者: flw2    时间: 2008-08-14 21:07
看得真仔细,ulk3的话
我也觉得是纯属多余的,可能作者就是想说别的路径
中断和异常除了异步性很相似,经常放在一起说,不过只听说在访问都会访问数据时要禁止中断,但没有说禁止异常的说法
作者: zx_wing    时间: 2008-08-15 09:26
这句话不多余啊。
当你的程序在临界区执行的时候,要访问一个关键数据。而在临界区执行时发生一个异常,且异常的处理函数也要访问这个关键数据,当然就是不安全的了。
当然异常无法关闭,但这种风险理论上是存在的。虽然我觉得目前内核中没有这种内核路径要访问并且会在引起异常,且异常也要访问的数据结构,但书中提出来这种风险也是对写代码的人一种警示。
作者: flw2    时间: 2008-08-15 09:50
原帖由 zx_wing 于 2008-8-15 09:26 发表
这句话不多余啊。
当你的程序在临界区执行的时候,要访问一个关键数据。而在临界区执行时发生一个异常,且异常的处理函数也要访问这个关键数据,当然就是不安全的了。
当然异常无法关闭,但这种风险理论上是存 ...

我更相信作者是随意在中断后接了个异常
因为对于中断,我们会说如果临界区和中断共享数据,要禁止中断,但是没有要和异常共享然后禁止异常
比如问: 如果和异常共享数据怎么办?
作者: gvim    时间: 2008-08-15 09:54
不多余,中断表示处理器外部异常,异常表示处理器内部异常。你可以拒绝别人的想法(关中断),但是没法阻止自己的想法(内部异常)。

all kernel data structures that are not updated by interrupts or exception handlers are safe for the kernel to access.

这句话的另一个意思是,all other kernel data structures that updated by interrupts or exception handlers are NOT safe for the kernel to access. 意思是三楼zx_wing 的话“当你的程序在临界区执行的时候,要访问一个关键数据。而在临界区执行时发生一个异常,且异常的处理函数也要访问这个关键数据,当然就是不安全的了。”

[ 本帖最后由 gvim 于 2008-8-15 09:56 编辑 ]
作者: gvim    时间: 2008-08-15 09:55
原帖由 flw2 于 2008-8-15 09:50 发表

但是没有要和异常共享然后禁止异常
比如问: 如果和异常共享数据怎么办?


没错,所以作者告诉你,面对你思考的情形,是unsafe的。
作者: zx_wing    时间: 2008-08-15 10:00
原帖由 flw2 于 2008-8-15 09:50 发表

我更相信作者是随意在中断后接了个异常
因为对于中断,我们会说如果临界区和中断共享数据,要禁止中断,但是没有要和异常共享然后禁止异常
比如问: 如果和异常共享数据怎么办?

我还是觉得这个是作者向读者提出这个风险。

>> 如果和异常共享数据怎么办?
我认为没有办法,特别是在单处理器上。但我觉得和异常共享数据是种错误的程序设计方法。并不是所有情况都可以处理掉,例如异常引起异常是double fault,double fault再引起异常是triple fault,CPU就重启了。就是认为这种情况处理不掉。我认为“和异常共享数据”也是一种处理不掉的情况。
作者: zx_wing    时间: 2008-08-15 10:02
原帖由 gvim 于 2008-8-15 09:54 发表
不多余,中断表示处理器外部异常,异常表示处理器内部异常。你可以拒绝别人的想法(关中断),但是没法阻止自己的想法(内部异常)。

all kernel data structures that are not updated by interrupts or except ...

刚才看第一次回复是说三楼,回了帖子一看变成zx_wing了。
是不是怕出现昨天xpl兄弟说楼上某人的情况?
我昨天那是个失误,回帖的时候忘了谁说的,又懒得去翻了,确实很失礼啊
作者: gvim    时间: 2008-08-15 10:12
异常一定会有一个修改全局状态(包括但不限于内存变量或处理器状态机)的步骤,否则0输入0输出的程序没有任何意义,大不了处理不了的就重启嘛-_-;
作者只是告诉你,异常修改的东西,接着访问是不安全的。如果无聊到在内核里弄一个全局的 int testifexceptionarise_ofcauseitistrival = 0,那么你永远可以安全的访问这个东西。

to: zx_wing ,我是觉得技术牛人是应该被我尊敬的,虽然我不知道你的名字,可是知道你的id。简单的用“三楼”来指代,是不尊敬的表现,呵呵。
作者: flw2    时间: 2008-08-15 10:24
原帖由 gvim 于 2008-8-15 09:55 发表


没错,所以作者告诉你,面对你思考的情形,是unsafe的。

那意思就是说要不就不共享,要不就在访问的时候保证别产生该异常吧
作者: zx_wing    时间: 2008-08-15 11:19
原帖由 flw2 于 2008-8-15 10:24 发表

那意思就是说要不就不共享,要不就在访问的时候保证别产生该异常吧

是的,要么别这样做,要做就自己保证冲突的情况不会发生
作者: spt_zeus    时间: 2008-08-15 11:31
原帖由 zx_wing 于 2008-8-15 09:26 发表
这句话不多余啊。
当你的程序在临界区执行的时候,要访问一个关键数据。而在临界区执行时发生一个异常,且异常的处理函数也要访问这个关键数据,当然就是不安全的了。
当然异常无法关闭,但这种风险理论上是存 ...



"在临界区执行时发生一个异常,且异常的处理函数也要访问这个关键数据"
这种情况应该不可能存在吧? 请指教!
作者: zx_wing    时间: 2008-08-15 12:10
原帖由 spt_zeus 于 2008-8-15 11:31 发表



"在临界区执行时发生一个异常,且异常的处理函数也要访问这个关键数据"
这种情况应该不可能存在吧? 请指教!

是啊,这种情况应该不存在。
所以我们认为作者这里是在提醒读者存在的风险,而不要写这样的程序。
作者: gvim    时间: 2008-08-15 12:31
原帖由 spt_zeus 于 2008-8-15 11:31 发表



"在临界区执行时发生一个异常,且异常的处理函数也要访问这个关键数据"
这种情况应该不可能存在吧? 请指教!


为什么不可能存在?
作者: xpl    时间: 2008-08-15 12:42
看帖子,发现说到我了。
我是来做俯卧撑的,关我什么事啊。


异常虽然不能明确的禁止,但是要在处理临界区数据的时候去避免可能产生异常的情况。

因为异常也有可能去访问临界区的数据的。

另外 to zx_xing: 某人是一种尊称,你没发现梁冬老爱说梁某人。^_`
作者: flw2    时间: 2008-08-15 12:51
原帖由 gvim 于 2008-8-15 12:31 发表


为什么不可能存在?

存在就是BUG了
作者: gvim    时间: 2008-08-15 12:56
原帖由 flw2 于 2008-8-15 12:51 发表

存在就是BUG了


恩,临界区,三个字看漏了。呵呵。
作者: xpl    时间: 2008-08-15 13:49
所以,如果存在是bug。

那么就是“不应该存在”;而不是“不可能存在”




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2