Kernel 从用户级空间访问内核空间中的变量

Kernel 从用户级空间访问内核空间中的变量,kernel,global-variables,shared-memory,Kernel,Global Variables,Shared Memory,让我们来看一个我想从内核空间中定义的用户级空间读取的结构,但是用户级空间有多个进程 例如: 在内核模块中,我有一个全局结构。 结构{ INTA; int b; }试验 在用户级模块中,我已经“外部化”了该全局结构 外部结构{ INTA; int b; }试验 编译器不会抱怨,链接编辑器也不会抱怨。但是,如果用户有多个进程,那么是否为每个进程克隆该结构?如果我和extern一起使用共享内存,那么我可以访问内核的结构,如果我有n个进程,那么自共享以来只有1个结构。我可以使用1个用户级进程访问内核级变

让我们来看一个我想从内核空间中定义的用户级空间读取的结构,但是用户级空间有多个进程

例如:

在内核模块中,我有一个全局结构。 结构{ INTA; int b; }试验

在用户级模块中,我已经“外部化”了该全局结构

外部结构{ INTA; int b; }试验

编译器不会抱怨,链接编辑器也不会抱怨。但是,如果用户有多个进程,那么是否为每个进程克隆该结构?如果我和extern一起使用共享内存,那么我可以访问内核的结构,如果我有n个进程,那么自共享以来只有1个结构。我可以使用1个用户级进程访问内核级变量,但如果我有更多进程,那么我会为每个“外部化”的结构获取克隆


我的问题是,多个用户级进程能否读取内核级变量?

在大多数操作系统上,您无法从用户空间访问内核空间变量。

您需要通过操作系统提供的机制公开数据。这可能是一个自定义系统调用,一个通过vfs或任何其他形式的IPC公开的文件。

在大多数操作系统上,您无法从用户空间访问内核空间变量。

您需要通过操作系统提供的机制公开数据。这可能是一个自定义系统调用,通过vfs或任何其他形式的IPC公开的文件。

在Unix上,这通常是通过
mmap
-ing一些特殊的设备文件,如
/dev/kmem
来完成的。在Unix上,这通常是通过
mmap
-ing一些特殊的设备文件,如
/dev/kmem
来完成的。用户空间在任何情况下都不能直接看到内核rammmap'ing/dev/kmem也不是一个好的解决方案(在我看来,它真的很难看,应该只用于内核调试)

我认为最好的方法是通过/proc中的文件(非常简单)或带有IOCTL的字符设备(稍微复杂一点)公开它


(注意:这是Linux/Unix特有的)

用户空间在任何情况下都不能直接看到内核ram——而mmap'ing/dev/kmem也不是一个好的解决方案(在我看来,它真的很难看,应该只用于内核调试)

我认为最好的方法是通过/proc中的文件(非常简单)或带有IOCTL的字符设备(稍微复杂一点)公开它


(注意:这是Linux/Unix特有的)

您能发布编译器和链接器不会抱怨的用户级代码吗?另外,在这个问题上,操作系统的选择是否重要?你能发布编译器和链接器不会抱怨的用户级代码吗?另外,在这个问题上,操作系统的选择是否重要?