【问题标题】:Share memory from a Linux kernel module for a userspace process to access从 Linux 内核模块共享内存以供用户空间进程访问
【发布时间】:2012-12-26 16:18:41
【问题描述】:
我有一个 Linux 内核模块,它在初始化例程期间将一个 4KB 大小的结构写入内核内存。我想做的是共享此内存,以便单个用户空间进程可以对该结构具有只读访问权限。
我被告知要避免使用 IOCTLS,因为它们不是执行此操作的最佳方法,因此根据我所读到的最佳方法是使用函数 mmap,但是我对如何在 C 中实现我需要的东西有点困惑。
我确实看过使用函数shmget,但它似乎是为需要 IPC 功能的用户空间应用程序设计的。
任何建议,甚至是一个简单的例子都将不胜感激。
谢谢!
【问题讨论】:
标签:
c
linux
memory
kernel
【解决方案1】:
您不能使用像 mmap 这样的直接访问机制安全地执行此操作,因为这样任何人都可以使用它。
在 Linux 中,用户内存和内核内存是独立的,并且在不同的地址空间中实现。地址空间是虚拟化的,这意味着地址是从物理内存中抽象出来的。因为地址空间是虚拟化的,所以可以存在很多。实际上,内核本身驻留在一个地址空间中,每个进程都驻留在自己的地址空间中。这些地址空间由虚拟内存地址组成,允许许多具有独立地址空间的进程引用相当小的物理地址空间(机器中的物理内存)。这不仅方便,而且安全,因为每个地址空间都是独立且隔离的,因此是安全的。
但这种安全性需要付出一定的代价。 因为每个进程(和内核)可以有相同的地址来引用不同的物理内存区域,所以不可能立即共享内存。 (source)