2012-09-04 74 views
0

我在一個驅動程序中聲明瞭一個靜態const int變量,並導出了 那個變量符號。在另一個驅動程序中我正在修改該變量。 另一個驅動程序打印修改後的值,但原始驅動程序 保留原始值。當兩個驅動程序看到的變量的虛擬地址和物理地址 都相同時,這是甚麼可能的 。這是一個內核錯誤嗎?爲什麼導出的const值被另一個驅動程序在原始驅動程序中未更新

[[email protected] bug]# uname -a 
Linux localhost.localdomain 3.5.3 #3 SMP Mon Sep 3 21:52:12 IST 2012 
i686 i686 i386 GNU/Linux 

[根@本地錯誤]#貓driver.c

#include <linux/module.h> 

static const int value = 123; 

int init_module() 
{ 
     printk("Base driver (init): value      = %d\n", value); 
     printk("Base driver (init): virtual address of value = %p\n", (void *)&value); 
     printk("Base driver (init): physical address of value = %p\n", (void 
*)__pa(&value)); 
     return 0; 
} 

void cleanup_module() 
{ 
     printk("Base driver (exit): value      = %d\n", value); 
     printk("Base driver (exit): virtual address of value = %p\n", (void *)&value); 
     printk("Base driver (exit): physical address of value = %p\n", (void 
*)__pa(&value)); 
} 
EXPORT_SYMBOL(value); 

[根@本地錯誤]#貓hacker.c

#include <linux/module.h> 

extern int value; 

int init_module() 
{ 
     value = 987; 
     printk("Hacker driver (init): value      = %d\n", value); 
     printk("Hacker Base driver (init): virtual address of value = %p\n", 
(void *)&value); 
     printk("Hacker Base driver (init): physical address of value = %p\n", 
(void *)__pa(&value)); 
     return 0; 
} 

void cleanup_module() 
{ 
     printk("Hacker driver (exit): value      = %d\n", value); 
     printk("Hacker driver (exit): virtual address of value = %p\n", 
(void *)&value); 
     printk("Hacker driver (exit): physical address of value = %p\n", 
(void *)__pa(&value)); 
     return; 
} 


[[email protected] bug]# insmod driver.ko 

基地驅動程序(INIT):值= 123 基本驅動程序(init):虛擬地址值= f89d61c8 基本驅動程序(init):物理地址值= 389d61c8

[[email protected] bug]# insmod hacker.ko 

哈克驅動程序(INIT):值= 987 哈克基地驅動程序(INIT):的值的虛擬地址= f89d61c8 哈克基地驅動程序(INIT):的值的物理地址= 389d61c8

[[email protected] bug]# rmmod hacker.ko 

哈克驅動器(出口):值= 987 哈克驅動器(出口):的值的虛擬地址= f89d61c8 哈克驅動器(出口):的值的物理地址= 389d61c8

[[email protected] bug]# rmmod driver.ko 

基本驅動器(出口):值= 123 基地驅動器(出口):的值的虛擬地址= f89d61c8 基地驅動器(出口):的值的物理地址= 389d61c8

[[email protected] bug]# cat /proc/kallsyms | grep value 

f89f91c8 R值[驅動] f89f9088ř__ksymtab_value [驅動] f89f91ccř__kstrtab_value [驅動]

有趣的是,當我改變變量的聲明在driver.c爲「靜態常量揮發性INT」,則driver.ko打印到「揮發性」 改性在rmmod中的值「987」和原始值「123」是 失蹤。這與以前的聲明有什麼區別?

回答

5

這與內核無關。這是基本的C行爲。一旦聲明瞭一個變量const,編譯器就可以自由地將您分配給它的值內聯到任何在同一編譯單元中訪問它的地方。假設一個const變量指針強制編譯器在數據部分添加一個變量副本,假設它是隻讀的。

如果您運行objdump -d一個結果內核模塊,並期待在init_module的,你會看到,在參數傳遞給printk,它是不是真的訪問變量,但使用的價值內嵌拷貝。

+0

是的正確,我沒有objdump,並檢查gcc優化const值並直接放置它。謝謝 –

相關問題