Chinaunix

标题: 《linux内核源代码情景分析》阅读 [打印本页]

作者: 栏外人27    时间: 2013-10-10 13:53
标题: 《linux内核源代码情景分析》阅读
再看《linux内核源代码情景分析》(毛德操,胡希明著上册)这本书,在252页,看到“就是说,如果内核能够在一个“异常表“中找到发生异常的指令所在的地址,并得到相应的”修复“地址fixup,就将CPU在异常返回后将要重新执行的地址替换成这个”修复”地址。为什么要这样做呢?因为在这种情况下内核不能为当前进程补上一个页面(那样的话name所指的字符串就变成空白了)。”这一小段时,实在是不能理解最后一句话(因为在这种情况下内核不能为当前进程补上一个页面(那样的话name所指的字符串就变成空白了))以及()中的内容。而且这也不好查啊,所以在此发帖希望看过这本书的大牛或是明白这的大牛们解释下,非常感谢!!!
作者: 瀚海书香    时间: 2013-10-10 16:24
回复 1# 栏外人27
再看《linux内核源代码情景分析》(毛德操,胡希明著上册)这本书,在252页,看到“就是说,如果内核能够在一个“异常表“中找到发生异常的指令所在的地址,并得到相应的”修复“地址fixup,就将CPU在异常返回后将要重新执行的地址替换成这个”修复”地址。为什么要这样做呢?因为在这种情况下内核不能为当前进程补上一个页面(那样的话name所指的字符串就变成空白了)。”这一小段时,实在是不能理解最后一句话(因为在这种情况下内核不能为当前进程补上一个页面(那样的话name所指的字符串就变成空白了))以及()中的内容。而且这也不好查啊,所以在此发帖希望看过这本书的大牛或是明白这的大牛们解释下,非常感谢!!!


pagefault发生在内核态,并且地址不属于进程的线性空间。
在这种情况下,内核为了区分是由于用户态非法的参数还是内核的bug,通过异常表来解决。

if ((fixup = search_exception_table(regs->eip))! = 0) {
    regs->eip = fixup;
    return;
}

如果从异常表中查找到对应的指令,说明是用户态传入的非法的参数,重置eip为fixup地址,从而返回后执行修正代码,修正代码一般为发送SIGSEGV信号,终止当前进程等;

否则说明是内核的bug,那么就打印出oops信息了。。。

   
作者: Godbach    时间: 2013-10-10 17:13
回复 2# 瀚海书香

目测瀚海兄已经通吃内核了。赞一个!


   
作者: smalloc    时间: 2013-10-10 17:31
name是指前面的例子中的sethostname中的参数




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