我试图了解mmap的工作原理.
mmap的用户级调用如下所示.
mmap的用户级调用如下所示.
void *mmap(void *addr,size_t len,int prot,int flags,int fildes,off_t off);
但特定设备驱动程序的内核级别mmap如下所示:
int <device_name>_mmap(struct file*fp,struct vm_area_struct *vma)
我也查看了源代码,但我无法找到它们之间的连接.
特定设备的mmap如何获取其参数“struct vm_area_struct * vma”?
你能帮我理解一下吗?感谢您的帮助.
解决方法
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实现功能的调用.