【问题标题】:Access /proc fs variable from other parts of Kernel code从内核代码的其他部分访问 /proc fs 变量
【发布时间】:2011-02-22 16:26:33
【问题描述】:

我正在尝试让用户级程序通过 /proc 与内核通信。

我按照tldp 上的说明操作,成功地创建了一个自定义 proc 文件,使用 insmod 动态加载它并从用户空间。

现在我的问题是如何从内核的另一部分访问 /proc 变量(它是一个字节缓冲区),比如系统调用基础架构?由于自定义的 proc 文件是动态加载和链接的,如何从静态编译的内核代码中引用它?

系统规格:在 MacBook Pro 13" (2009) 上运行 VMWare Fusion 的 Ubuntu 10.10。

编辑:相关代码(根据要求)-

procfile.c

//This function is called when the module is loaded
int init_module()
{
    /* create the /proc file */

    EXPORT_SYMBOL(procfs_buffer);
    EXPORT_SYMBOL(procfs_buffer_size);
...
...
}

get_procvariable.c(在内核的另一部分)

//The buffer used to store character for this module
extern char * procfs_buffer;

//The size of the buffer
extern unsigned long procfs_buffer_size;

int get_procvariable(void)
{
.. do something
return procfs_buffer; // LD Error: Undefined reference
}

如果您需要更多详细信息,请在 cmets 中告诉我。提前致谢。

【问题讨论】:

  • 回答了我自己的问题,从下面得到了一些提示:

标签: linux ubuntu kernel procfs


【解决方案1】:

回答了我自己的问题,从上面的答案中得到了一些提示:

我缺少的关键是我需要在内核本身中声明一个变量(比如 int kernel_var = 0;)(而不是在 procfs 开销模块中,因为我之前做错了)。之后使用 EXPORT_SYMBOL 将其导出,这会将其添加到全局模块符号表中,最后将其作为外部变量包含在开销 procfs 模块中。

所以本质上,开销变量已经存在于内核中,我只是使用 procfs 模块将其作为外部变量引用并修改其值。

我把这个假设编码出来,它就像一个魅力。

【讨论】:

    【解决方案2】:

    您不应从静态加载的代码(即系统调用)引用内核中动态加载的代码(即模块)。如果您将静态加载的代码放入内核中,则它所具有的任何配置都应该由其他静态加载的代码公开。但是,如果不知道您正在实现哪种功能,就很难给出更具体的建议。

    【讨论】:

      【解决方案3】:

      使用 EXPORT_SYMBOL 从模块中导出符号,然后在内核的其他部分使用它。

      【讨论】:

      • 你能告诉我更多细节吗?我是否需要在内核的另一部分将其声明为外部?我试过这个并且得到一个“未定义的引用”错误。
      • 代码的相关部分已添加到原帖中。
      猜你喜欢
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 2015-07-30
      • 2016-10-25
      • 2012-08-20
      相关资源
      最近更新 更多