Pointers 取消引用空指针导致内核崩溃

Pointers 取消引用空指针导致内核崩溃,pointers,linux-kernel,crash,Pointers,Linux Kernel,Crash,我正在尝试内核2.4.26中有趣的东西。 在mm/filemap.c的第2367行附近,有这样一条语句: struct inode*inode=file->f\u dentry->d\u inode 我已经通过在该语句前面添加一个printk验证了我已将f\u dentry设为NULL。因为这里struct inode*inode=file->f\u dentry->d\u inode取消对空指针的引用,内核将崩溃,对吗?但我的电脑仍然运行良好。我完全不知道。 这是我修改过的代码(只需添加一个p

我正在尝试内核2.4.26中有趣的东西。 在
mm/filemap.c
的第2367行附近,有这样一条语句:
struct inode*inode=file->f\u dentry->d\u inode
我已经通过在该语句前面添加一个
printk
验证了我已将
f\u dentry
设为
NULL
。因为这里
struct inode*inode=file->f\u dentry->d\u inode取消对空指针的引用,内核将崩溃,对吗?但我的电脑仍然运行良好。我完全不知道。
这是我修改过的代码(只需添加一个
printk
):

以下是来自
dmesg


我预计内核在取消对空指针的引用时会完全崩溃,但事实并非如此。

内核代码中的错误操作并不总是导致内核挂起(也就是说,整个机器变得不负责任)。有时错误只会使当前线程崩溃,就像您的情况一样

这种“部分崩溃”并不意味着错误内核会在错误发生后恢复。在发生任何一个错误后,没有人能保证其他内核部件工作正常

错误时不挂起整个内核的主要原因是允许用户存储未保存的数据并收集信息,如错误所述。同样,没有人能够保证用户能够在特定错误之后执行这些操作,但通常他是这样的


如果您想检查内核在某个时刻是否正常工作(直到那个时刻才发生错误),您可以
grep
dmesg输出单词“BUG”。

请发布结果代码(您调用
printk
的确切方式和位置)。您不能直接将
printk
语句插入局部变量
inode
的定义之前,因为C89标准在内核中使用,禁止在定义之前放置任何内容(另一个定义除外)。@Tsyvarev感谢您的回复。我已经编辑了我的帖子。是否有一种机制可以防止内核在取消引用内核中的空指针时崩溃?非常感谢您的时间。我认为这个答案部分解决了我的问题。但它仍然存在于另一个问题中,我模拟了这个简单的问题。但我不明白为什么。
if(file->f_dentry == NULL) {
  printk("file->f_dentry is null\n");
}
struct inode * inode = file->f_dentry->d_inode;