首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么导出的常量值被其他动因修改但未在原始动因中更新

为什么导出的常量值被其他动因修改但未在原始动因中更新
EN

Stack Overflow用户
提问于 2012-09-04 17:52:10
回答 1查看 121关注 0票数 0

我在一个驱动程序中声明了一个静态常量int变量,并导出了该变量符号。在另一个驱动程序中,我正在修改该变量。另一个驱动程序打印修改后的值,但原始驱动程序保留原始值。当两个驱动程序看到的变量的虚拟和物理地址都相同时,这怎么可能呢?它是一个内核bug吗?

代码语言:javascript
复制
[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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

基础驱动程序(初始化):值= 123基础驱动程序(初始化):值的虚拟地址= f89d61c8基础驱动程序(初始化):值的物理地址= 389d61c8

代码语言:javascript
复制
[root@localhost bug]# insmod hacker.ko

黑客驱动程序(初始化):值= 987黑客基础驱动程序(初始化):值的虚拟地址= f89d61c8黑客基础驱动程序(初始化):值的物理地址= 389d61c8

代码语言:javascript
复制
[root@localhost bug]# rmmod hacker.ko

黑客驱动程序(退出):值= 987黑客驱动程序(退出):值的虚拟地址= f89d61c8黑客驱动程序(退出):值的物理地址= 389d61c8

代码语言:javascript
复制
[root@localhost bug]# rmmod driver.ko

基本驱动程序(退出):值= 123基本驱动程序(退出):值的虚拟地址= f89d61c8基本驱动程序(退出):值的物理地址= 389d61c8

代码语言:javascript
复制
[root@localhost bug]# cat /proc/kallsyms | grep value

f89f91c8 r值驱动程序f89f9088 r __ksymtab_value驱动程序f89f91cc r __kstrtab_value驱动程序

有趣的是,当我在driver.c中将变量的声明更改为"static const volatile int“时,driver.ko会在rmmod期间打印修改后的值"987”,原始值"123“也会丢失。这个声明和之前的声明有什么不同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-04 20:29:32

这与内核无关。这是基本的C语言行为。一旦你声明了一个变量const,编译器就可以自由地内联你赋给它的值,只要它在同一个编译单元中被访问。获取指向const变量的指针会强制编译器在数据段中也添加该变量的副本,假设该变量是只读的。

如果您运行objdump -d作为结果内核模块并查看init_module,您将看到在传递给printk的参数中,它并没有真正访问该变量,而是使用值的内联副本。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12260909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档