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

问题描述 投票:1回答:1

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

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

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

[编辑]为了使画面更清晰:这是程序获取输入的方式。

./user_prog [filename] --prefetch

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

memory-management linux-kernel linux-device-driver kernel-module page-fault
1个回答
0
投票

您也可以使用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

某些非冲突标志将是0x2000x400

© www.soinside.com 2019 - 2024. All rights reserved.