取消引用空指针时内核崩溃
Kernel crash when dereferencing a null pointer
我有一个像这样的简单模块:
#define MODULE
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
int init_module(void) {
struct inode {
int i_ino;
};
struct dentry {
struct inode *d_inode;
};
struct dentry *f_dentry;
f_dentry = NULL;
struct inode * p = f_dentry->d_inode;
return 0;
}
void cleanup_module(void) {
printk("Goodbye world\n");
}
而我的Makefile
是这样的:
obj-m += oops.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules$(shell uname -r)/build M=$(PWD) clean
我预计内核会崩溃,因为 struct inode * p = f_dentry->d_inode;
取消引用了一个空指针,对吧?但事实并非如此。我的想法有什么问题吗?
好吧,现在我再试一次。如果我的模块是这样的:
#define MODULE
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
int init_module(void) {
*(int *)0 = 0;
return 0;
}
void cleanup_module(void) {
printk("Goodbye world\n");
}
我的电脑真的死机了。或者我以前的例子有什么问题吗?它不取消引用空指针?
如果您查看汇编代码(例如通过 objdump -D oops.ko),您所有的 init_module() 都被优化掉了,大概是因为它什么也没做。
如果你执行 p->i_ino = 1;
,您可能会看到不同的结果(尽管这是未定义的行为,因此无法直接推断代码将要执行的操作 - 在这种情况下最好也检查程序集)。
我有一个像这样的简单模块:
#define MODULE
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
int init_module(void) {
struct inode {
int i_ino;
};
struct dentry {
struct inode *d_inode;
};
struct dentry *f_dentry;
f_dentry = NULL;
struct inode * p = f_dentry->d_inode;
return 0;
}
void cleanup_module(void) {
printk("Goodbye world\n");
}
而我的Makefile
是这样的:
obj-m += oops.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules$(shell uname -r)/build M=$(PWD) clean
我预计内核会崩溃,因为 struct inode * p = f_dentry->d_inode;
取消引用了一个空指针,对吧?但事实并非如此。我的想法有什么问题吗?
好吧,现在我再试一次。如果我的模块是这样的:
#define MODULE
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
int init_module(void) {
*(int *)0 = 0;
return 0;
}
void cleanup_module(void) {
printk("Goodbye world\n");
}
我的电脑真的死机了。或者我以前的例子有什么问题吗?它不取消引用空指针?
如果您查看汇编代码(例如通过 objdump -D oops.ko),您所有的 init_module() 都被优化掉了,大概是因为它什么也没做。
如果你执行 p->i_ino = 1;
,您可能会看到不同的结果(尽管这是未定义的行为,因此无法直接推断代码将要执行的操作 - 在这种情况下最好也检查程序集)。