1

【我是设备驱动程序编程的新手,所以请大家耐心等待】

我正在编写一个字符设备驱动程序,并且我正在尝试将驱动程序中分配的内存的某些部分映射到用户空间。

在 init_module() 函数中,我像这样分配一些缓冲区空间 -

buf = (char*)vmalloc_user(SIZE_OF_BUFFER);

buf 现在指向某个地址。

现在,在驱动程序的 mmap 函数中,我设置了 VM_RESERVED 标志,然后调用

remap_vmalloc_range(vma, (void*)buf, 0);

然后我在 /dev 中使用正确的主设备号创建一个字符设备文件。

现在我在用户空间创建一个简单的程序来打开字符设备文件,然后调用 mmap() 并从这个 mmap 的内存中读取数据。

在用户空间中对 mmap() 的调用中,我知道有一个选项可以传递该区域的起始地址。但是有没有办法让用户空间 mmap 指向与驱动程序空间中的 buf 相同的地址?

我认为由于驱动程序空间中 buf 的地址与用户空间中 mmap() 返回的地址不同,我的用户空间程序最终会读取垃圾值。除了在用户空间的mmap()中实际输入地址之外,还有什么办法可以解决这个问题吗?

4

1 回答 1

2

您几乎必须设计您的驱动程序接口,以便用户空间映射地址无关紧要。这意味着,例如,不在单个用户空间进程之外访问的 mmap 区域中存储指针。

通常,您将存储来自基映射地址的偏移量,而不是完整的指针。内核驱动程序和用户空间代码都可以将这些偏移量添加到它们的基指针中,并获得适合它们各自上下文的虚拟地址。

于 2012-11-02T01:05:47.147 回答