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

前端之家收集整理的这篇文章主要介绍了mmap用户调用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实现功能调用.

猜你在找的C&C++相关文章