在 vm_fault()、Linux 驱动程序中预取

Prefetching in vm_fault(), Linux drivers

我正在实现一个简单的设备驱动程序。使用此驱动程序的程序接受用户的参数是使用请求分页还是预取(仅获取下一页)。但是当用户请求预取时应该将此信息发送给驱动程序。问题是 vm_fault 的标准结构如下:

int (*fault)(struct vm_area_struct *vma, struct vm_fault *vmf);

那么如何将预取的附加信息合并到这些中,以便我可以使用它来编写不同的预取例程? 或者还有其他方法可以实现吗?

[编辑]
给个更清晰的图:
这是程序接受输入的方式。

./user_prog [filename] --prefetch

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

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

void *mmap(void *addr, size_t length, int prot, int flags,
                  int fd, off_t offset);

确保您的自定义标志值使用的位与 mmap() 使用的标志值不同。从 manpage 开始,宏定义在 sys/mman.h 中。使用 echo '#include <sys/mman.h>' | 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

一些不冲突的标志是 0x2000x400