[我是设备驱动程序编程的新手,因此请求人们耐心等待]
我正在编写一个字符设备驱动程序,我正在尝试将驱动程序中已分配内存的某些部分映射到用户空间。
在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()中实际输入地址以解决此问题之外,还有其他方法吗?
答案 0 :(得分:2)
您几乎必须设计驱动程序接口,以便用户空间映射地址无关紧要。例如,这意味着不将指针存储在单个用户空间进程外部访问的mmap区域中。
通常,您将存储基本映射地址的偏移量而不是完整指针。内核驱动程序和用户空间代码都可以将这些偏移量添加到它们的基本指针中,并获得适合其各自上下文的虚拟地址。