从内核代码的其他部分访问/ proc fs变量

时间:2011-02-18 20:09:12

标签: linux ubuntu kernel procfs

我正在尝试通过/ proc。

获取用户级程序与内核通信

我按照tldp上的说明操作,并成功创建了自定义proc文件,使用 insmod 动态加载并读取(cat)并写入(echo)到proc来自userland的文件。

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

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

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

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
}

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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

我编写了这个假设,它就像一个魅力。

答案 2 :(得分:0)

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