2

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

我按照tldp上的说明,成功地创建了一个自定义 proc 文件,使用insmod动态加载它并从用户空间读取(cat)和写入(echo)到 proc 文件。

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

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

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

过程文件.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
}

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

4

3 回答 3

2

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

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

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

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

于 2011-02-22T08:26:33.340 回答
1

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

于 2011-02-21T08:01:22.043 回答
0

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

于 2011-02-19T06:39:03.383 回答