我在一个驱动程序中声明了一个静态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

[根@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);

[根@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):值=123
基本驱动程序(init):值的虚拟地址=f89d61c8
基本驱动程序(init):值的物理地址=389d61c8
[root@localhost bug]# insmod hacker.ko

黑客驱动程序(init):值=987
黑客基础驱动程序(init):值为f89d61c8的虚拟地址
黑客基础驱动程序(init):物理地址值=389d61c8
[root@localhost bug]# rmmod hacker.ko

黑客驱动程序(出口):值=987
黑客驱动程序(出口):值的虚拟地址=F89D61C8
黑客驱动程序(出口):物理地址值=38 9D61C8
[root@localhost bug]# rmmod driver.ko

基本驱动程序(出口):值=123
基本驱动程序(出口):值的虚拟地址=F89D61C8
基本驱动器(出口):物理地址值=38 9D61C8
[root@localhost bug]# cat /proc/kallsyms | grep value

f89f91c8 R值[驱动器]
f89f9088 r}u ksymtab}u值[驱动程序]
f89f91cc r\uu kstrtab_值[驱动程序]
有趣的是,当我将变量的声明更改为“volatile”时
在driver.c中,作为“static const volatile int”,然后driver.ko打印
在rmmod期间修改值“987”,原始值“123”为
迷路的。这和以前的声明有什么区别?

最佳答案

这与内核无关。这是基本的C行为。一旦您声明了一个变量const,编译器就可以在同一个编译单元中访问它的任何地方内联您分配给它的值。将指针指向常量变量会强制编译器在数据节中添加变量的副本,假设该副本是只读的。
如果运行结果内核模块并查看in it_模块,您会发现在传递给objdump -d的参数中,它并不是真正访问变量,而是使用值的内联副本。

关于c - 为什么导出的const值被另一个驱动程序修改而未在原始驱动程序中更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12260909/

10-13 06:58