0

我正在尝试使用 linux-kernel 中提供的 mamp() 功能。当我们在用户空间调用 mmap() 时,我们尝试将用户空间进程的虚拟内存区域映射到内核空间中的内存。

内核中 mamp() 的定义是在我的内核模块中完成的,它尝试在页面中分配一些内存并在 mmap 系统调用期间映射它。这个内核空间内存的内存内容可以被这个模块填充。

我想问的问题是,在内存映射之后,用户空间进程可以直接访问映射的内存而无需任何额外的内核过载,因此不会有像 read() 这样的系统调用,但是如果内存(分配在内核内部- space & mapped in the kernel-space) 包含指向在内核空间内分配的其他内存(未映射)的指针,那么用户空间进程能否借助映射内存的内容(指针)访问这个未映射的内存到这个未映射的内存。

4

3 回答 3

1

不,用户空间不能追逐映射内存中指向未映射内核内存的指针。

于 2013-01-24T07:51:44.353 回答
0

没有用户空间的进程不能访问未映射的内存。内核不允许您访问该内存。您只能访问通过 mmap 映射的那部分内存。我认为使用可以明确使用 remap_pfn_range 函数来重新映射区域。

来自Linux mmap 手册页

未指定更改与文件的添加或删除区域相对应的页面上映射的基础文件大小的效果。

于 2013-01-24T11:04:55.463 回答
0

不,你不能。

但是,如果您的目的是动态更改您的映射区域,这里有一些选项:

A. 在用户空间中,您可以使用 mremap 扩展(或缩小)现有内存映射。

B. 在内核空间,在你的驱动中,你需要实现 nopage() 方法或者 remap_pfn_range,但是 remap_pfn_range 有它的限制,Linux 只给出保留的页面,你甚至不能重新映射正常的地址,比如 get_free_page() 分配的那个

于 2015-05-04T22:04:39.443 回答