mmap用户调用mmap内核调用之间的连接

vin*_*dyz 7 c device-driver linux-device-driver linux-kernel

我试图了解mmap的工作原理.mmap的用户级调用如下所示.

void *mmap(void *addr, size_t len, int prot, int flags,
       int fildes, off_t off); 
Run Code Online (Sandbox Code Playgroud)

但特定设备驱动程序的内核级别mmap如下所示:

int <device_name>_mmap(struct file*fp, struct vm_area_struct *vma)
Run Code Online (Sandbox Code Playgroud)

我也查看了源代码,但我无法找到它们之间的连接.

特定设备的mmap如何获取其参数"struct vm_area_struct*vma"?你能帮我理解一下吗?感谢您的帮助.

caf*_*caf 15

mmap()库调用由libc中,其将在字节的页面中的偏移补偿来实现,然后调用mmap_pgoff()系统调用.

mmap_pgoff()系统调用将获取struct file *对应的文件描述符的说法,并要求do_mmap_pgoff().

do_mmap_pgoff()根据提示和可用地址空间计算将使用的实际地址和长度,将提供的标志转换为VM标志,并测试执行映射的权限.然后它打电话mmap_region().

mmap_region()删除被新映射替换的区域中的任何先前映射,执行内存记帐并创建struct vm_area_struct描述被映射的地址空间区域的新映射(这封装了映射的地址,长度,偏移和VM标志).然后它调用文件的->mmap()实现,传递struct file *struct vm_area_struct *.对于设备文件,这将是对设备的mmap实现功能的调用.