如何从用户空间访问和更改内核空间的变量

时间:2010-04-08 10:54:38

标签: c linux linux-kernel

I,

我之前已发布过查询,我正在重复我要修改igmpv3(Linux) 这是在kernel2.6中内置的.--这样它从文件中读取一个值并适当地决定由主机发送的igmpv3 paket中的保留(res 1)值。

我想通过说这更像是改变变量的一般性问题来增加上述问题 来自用户空间的内核空间。

提前感谢您的帮助。

此致

Bhavin

2 个答案:

答案 0 :(得分:2)

从用户登陆程序的角度来看,您应该将驱动程序视为具有定义良好的接口的“黑匣子”,而不是具有您想要更改的变量的代码。使用此心理模型,有四种方法(即接口)将控制信息传递给您应该考虑的驱动程序:

  • 命令行选项。您可以将参数传递给初始化期间可用的内核模块。
  • 的IOCTL。这是将控制信息传递给驱动程序的传统方式,但这种机制比sysfs使用起来要麻烦一些。
  • proc进程信息伪文件系统。 proc/proc目录中创建用户登陆程序可以读取并有时写入的文件。在过去,这个界面也被用来与司机沟通。虽然proc看起来与sysfs类似,但较新的驱动程序(Linux 2.6)应使用sysfs,而proc的目的是报告进程的状态。
  • sysfs是一个伪文件系统,用于导出有关驱动程序和设备的信息。有关更多详细信息和代码示例,请参阅内核中的文档(Documentation/filesystems/sysfs.txt)。对于您的特定情况,请注意“存储”方法。

根据您需要与驱动程序通信的时间(即初始化,运行时),您应该添加新的命令行选项或新的sysfs条目以更改驱动程序如何处理保留字段的值在数据包中。

关于filp_open,函数的注释是

/**
 * This is the helper to open a file from kernelspace if you really
 * have to.  But in generally you should not do this, so please move
 * along, nothing to see here..
 */

意味着有更好的方法来做你想做的事。另请参阅this SO question以获取有关驱动程序通常不应打开文件的原因的详细信息。

答案 1 :(得分:1)

你通常不能。只能在用户空间中修改/proc/sys中或通过模块参数公开的结构。