Memory management vm_fault()中的预取,Linux驱动程序

Memory management vm_fault()中的预取,Linux驱动程序,memory-management,linux-kernel,linux-device-driver,kernel-module,page-fault,Memory Management,Linux Kernel,Linux Device Driver,Kernel Module,Page Fault,我正在实现一个简单的设备驱动程序。使用此驱动程序的程序接收用户提供的参数,以确定是使用请求分页还是预取(仅获取下一页)。但是当用户请求预取时,应该将此信息发送给驱动程序。问题在于vm_故障具有如下标准结构: int (*fault)(struct vm_area_struct *vma, struct vm_fault *vmf); 那么,如何将这些额外的预取信息合并到这些中,以便我可以使用它来编写不同的预取例程呢? 或者有没有其他方法来实现这一点 [编辑] 更清晰的描述: 这就是程序接受输入

我正在实现一个简单的设备驱动程序。使用此驱动程序的程序接收用户提供的参数,以确定是使用请求分页还是预取(仅获取下一页)。但是当用户请求预取时,应该将此信息发送给驱动程序。问题在于vm_故障具有如下标准结构:

int (*fault)(struct vm_area_struct *vma, struct vm_fault *vmf);
那么,如何将这些额外的预取信息合并到这些中,以便我可以使用它来编写不同的预取例程呢? 或者有没有其他方法来实现这一点

[编辑]
更清晰的描述:
这就是程序接受输入的方式

./user_prog [filename] --prefetch

用户_prog在其中设置了一些标志,现在知道如何将这些标志信息发送到dev.c(驱动程序文件),因为函数的所有参数都是固定的,如上面的fault()。我希望这能提供更多的说明。

您也可以使用
mmap()
中的
标志来传递自定义标志

void *mmap(void *addr, size_t length, int prot, int flags,
                  int fd, off_t offset);
确保自定义标志值使用的位与
mmap()
使用的标志值不同。从中,宏在
sys/mman.h
中定义。使用
echo'#include'|gcc-E--dM | grep MAP.*
查找准确值(可能因系统而异)。我的系统有以下功能:

#define MAP_32BIT 0x40
#define MAP_TYPE 0x0f
#define MAP_EXECUTABLE 0x01000
#define MAP_FAILED ((void *) -1)
#define MAP_PRIVATE 0x02
#define MAP_ANON MAP_ANONYMOUS
#define MAP_LOCKED 0x02000
#define MAP_STACK 0x20000
#define MAP_NORESERVE 0x04000
#define MAP_HUGE_SHIFT 26
#define MAP_POPULATE 0x08000
#define MAP_DENYWRITE 0x00800
#define MAP_FILE 0
#define MAP_SHARED 0x01
#define MAP_GROWSDOWN 0x00100
#define MAP_HUGE_MASK 0x3f
#define MAP_HUGETLB 0x40000
#define MAP_FIXED 0x10
#define MAP_ANONYMOUS 0x20
#define MAP_NONBLOCK 0x10000

一些非冲突标志将是
0x200
0x400

您是否使用
vma->vm_private_data
?是的,我正在使用它,但是如何从用户程序将这些标志插入private_data字段?在谷歌搜索之后,我发现,在将文件结构的private_数据字段传递给内核模块中的open方法之前,open系统调用会将其设置为NULL。那么,如果通过系统调用将其设置为NULL,我们如何提供信息呢?线索是,在调用驱动程序的
打开
文件操作处理程序之前,它被设置为NULL。您可以在
open
处理程序中将其设置为其他内容。您可以使用
ioctl
执行自定义操作,例如更改“预回迁”标志。