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

Pointers 取消引用空指针时内核崩溃,pointers,module,linux-kernel,dereference,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;

我有一个简单的模块,如下所示:

#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"); 
}
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
#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"); 
}
我预计内核会崩溃,因为
struct inode*p=f\u dentry->d\u inode取消了对空指针的引用,对吗?但事实并非如此。我的想法有什么问题吗?
好吧,现在我再试一次。如果我的模块是这样的:

#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"); 
}
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
#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"); 
}
#定义模块
#包括
#包括
#包括
int init_模块(void){
*(int*)0=0;
返回0;
}
空洞清理_模块(空洞){
printk(“再见世界”);
}

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

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


例如,如果你做
p->i_ino=1,您可能会看到不同的结果(尽管这是未定义的行为,因此无法直接解释代码将要做什么-在这种情况下,最好也检查程序集)。

@nos谢谢您的回复。但这不是重点。这没有影响。是的,如果我加上
p->I_ino=1,我的计算机立即崩溃。谢谢你抽出时间。