我在内核2.4.26中尝试了一些有趣的事情。
在mm/filemap.c
的第2367行左右,有一个语句如下:
struct inode * inode = file->f_dentry->d_inode;
我已经通过在此声明之前添加f_dentry
权限验证我已将NULL
设为printk
。由于这里struct inode * inode = file->f_dentry->d_inode;
取消引用空指针,内核会崩溃,对吧?但我的电脑仍然运作良好。我完全不知道。
这是我修改过的代码(只需添加printk
):
if(file->f_dentry == NULL) {
printk("file->f_dentry is null\n");
}
struct inode * inode = file->f_dentry->d_inode;
我希望内核在取消引用空指针时会完全崩溃,但事实并非如此。
答案 0 :(得分:0)
内核代码中的错误操作并不总是导致内核挂起(即整个机器变得不负责任)。有时,错误只会崩溃当前线程,就像你的情况一样。
此类"部分崩溃"并不意味着在错误之后恢复错误内核。在任何单个错误之后,没有人可以保证其他内核部分正常工作。
错误地挂起整个内核的主要原因是允许用户存储未保存的数据并收集信息,描述错误。同样,没有人可以保证用户能够在特定错误之后执行这些操作,但通常他是。
如果你想检查内核是否在某个时刻正常工作(直到那一刻都没有出现错误),你可以grep
dmesg输出单词" BUG& #34;