我正在实现一个简单的设备驱动程序。使用此驱动程序的程序从用户处接收是使用按需分页还是预取(仅获取下一页)的参数。但是,当用户请求预取时,应将此信息发送给驱动程序。问题是vm_fault具有如下标准结构:
int (*fault)(struct vm_area_struct *vma, struct vm_fault *vmf);
那么如何将这些预取的附加信息合并到其中,以便我可以使用它编写不同的预取例程?还是有其他方法可以实现这一目标?
[编辑]为了使画面更清晰:这是程序获取输入的方式。
./user_prog [filename] --prefetch
user_prog在其中设置了一些标志,现在如何将这些标志信息发送到dev.c(驱动程序文件),因为函数的所有参数都是固定的,就像上面fault()一样。我希望这能提供更多的说明。
您也可以使用flags
中的mmap()
传递自定义标志。
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
某些非冲突标志将是0x200
和0x400
。