【问题标题】:Connection between mmap user call to mmap kernel callmmap 用户调用与 mmap 内核调用之间的连接
【发布时间】:2012-03-21 02:53:13
【问题描述】:

我正在尝试了解 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”? 你能帮我理解吗?感谢您的帮助。

【问题讨论】:

  • 其实我找到了但是找不到连接
  • vm_area_struct 包含有关要在用户进程中映射的虚拟地址范围以及应用程序要映射的设备上的偏移量的信息。 file参数对应用户端的文件描述符。
  • 最小可运行内核模块示例:stackoverflow.com/questions/10760479/…

标签: c linux-kernel device-driver linux-device-driver


【解决方案1】:

mmap() 库调用由 libc 实现,它将字节偏移量转换为页偏移量,然后调用mmap_pgoff() 系统调用。

mmap_pgoff()系统调用获取文件描述符参数对应的struct file *,并调用do_mmap_pgoff()

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

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

【讨论】:

  • 解释得很好。我在哪里可以找到其他内核函数的解释。除了源代码还有什么可以参考的。
  • @vinay:我认为你只需要练习阅读源代码——这真的没那么难。 lxr.linux.no 有利于溯源。对于系统调用入口点,请查找 SYSCALL_DEFINE
  • @caf - 因此,推断如果文本文件保存在磁盘上,文件的->mmap() 实现由文件系统完成是正确的吗?例如,如果保存在磁盘上的文件(使用 ext4 格式化)被 mmaped,则 mmap_region() 将调用 ext4 mmap 实现?
  • @bornfree:是的,对于ext4上的普通文件,使用ext4_file_mmap()
猜你喜欢
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 2020-12-04
  • 2016-03-10
  • 2013-09-13
  • 1970-01-01
相关资源
最近更新 更多