我在一个驱动程序中声明了一个静态const int变量并导出了 那个变量符号。在另一个驱动程序中我正在修改该变量。 另一个驱动程序打印修改后的值但原始驱动程序 保留原始价值。当虚拟和物理地址都有 两个司机看到的变量是一样的,这是怎么回事 可能。这是一个内核错误吗?
[root@localhost bug]# uname -a
Linux localhost.localdomain 3.5.3 #3 SMP Mon Sep 3 21:52:12 IST 2012
i686 i686 i386 GNU/Linux
[root @ localhost bug] #cat 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);
[root @ localhost bug] #cat 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;
}
[root@localhost bug]# insmod driver.ko
基本驱动程序(init):value = 123 基本驱动程序(init):值的虚拟地址= f89d61c8 基本驱动程序(init):值的物理地址= 389d61c8
[root@localhost bug]# insmod hacker.ko
黑客驱动程序(init):value = 987 黑客基础驱动程序(init):值的虚拟地址= f89d61c8 黑客基础驱动程序(init):值的物理地址= 389d61c8
[root@localhost bug]# rmmod hacker.ko
黑客驱动程序(退出):值= 987 黑客驱动程序(退出):值的虚拟地址= f89d61c8 黑客驱动程序(退出):值的物理地址= 389d61c8
[root@localhost bug]# rmmod driver.ko
基本驱动程序(退出):value = 123 基本驱动程序(退出):值的虚拟地址= f89d61c8 基本驱动程序(退出):值的物理地址= 389d61c8
[root@localhost bug]# cat /proc/kallsyms | grep value
f89f91c8 R值[驱动程序] f89f9088 r __ksymtab_value [driver] f89f91cc r __kstrtab_value [driver]
有趣的是,当我将变量声明更改为“volatile”时 在driver.c中作为“static const volatile int”然后driver.ko打印 在rmmod期间修改值“987”,原始值“123”是 丢失。这个和之前的声明有什么区别?
答案 0 :(得分:5)
这与内核无关。这是基本的C行为。一旦声明了变量const,编译器就可以自由地内联在同一编译单元中访问它的任何位置分配给它的值。获取指向const变量的指针会强制编译器在数据部分中添加变量的副本,假设它是只读的。
如果你运行objdump -d
一个结果内核模块并查看init_module,你会看到在传递给printk
的参数中,它并没有真正访问变量,而是使用内联副本价值。