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实现功能的调用.
| 归档时间: |
|
| 查看次数: |
4498 次 |
| 最近记录: |