取消引用空指针时内核崩溃

时间:2015-10-20 10:25:38

标签: pointers module linux-kernel dereference

我有一个像这样的简单模块:

#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"); 
}

我的电脑真的崩溃了。或者我以前的例子有什么问题?它没有取消引用空指针?

1 个答案:

答案 0 :(得分:0)

如果查看汇编代码(例如通过objdump -D oops.ko),所有的init_module()都会被优化掉,大概是因为它没有做任何事情。

如果你是做p->i_ino = 1;,你可能会看到不同的结果(虽然这是未定义的行为,因此不能直接推断代码将要做什么 - 在这种情况下也更好地检查程序集。)