2015-10-20 83 views
0

時,我有一個簡單的模塊,像這樣:內核崩潰提領一空指針

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

我的電腦真的崩潰了。或者我之前的例子有什麼不對?它不取消引用空指針?

+0

@nos感謝您的回覆。但那不是重點。這沒有影響。 – HuangJie

回答

0

如果您查看彙編代碼(通過例如objdump -D oops.ko),您的所有init_module()都會被優化掉,大概是因爲它沒有做任何事情。

如果您做p->i_ino = 1;,你可能會看到不同的結果(雖然這是未定義的行爲,所以它不直接推斷代碼將要做什麼 - 在這種情況下更好地檢查程序集)。

+0

是的,如果我添加'p-> i_ino = 1;',我的電腦立即崩潰。謝謝你的時間。 – HuangJie