内核常见问题汇总
1. mmap
如何将物理地址返回给用户空间
可以从mmap实现原理来进行解答
mmap函数是一种内存映射文件的方法,他可以将一个文件或设备映射到进程的地址空间中,使得进程可以像访问内存一样访问文件或设备。
mmap分为:文件映射和匿名映射,该函数的主要工作是创建VMA
VMA是指虚拟内存区域,是Linux内核中用于管理进程虚拟内存的数据结构,每个进程有一个VMA链表,用于描述进程的虚拟地址空间的不用区域。
VMA可以表示进程代码段、数据段、堆、栈等不同的内存区域。
VMA用于指导虚拟内存映射物理内存,没有VMA指导无法完成虚拟地址和物理地址映射
过程中如果存在进程访问尚未建立映射关系的虚拟内存时,这是会触发Linux缺页中断,并根据页面的状态来分配物理页面并建立映射关系。
通过mmap创建VMA后,我们使用VMA内存映射区虚拟地址,但此时虚拟地址不能映射物理地址,原因是映射表还没有动态创建出来,
缺页中断发生后,中断处理函数会完成虚拟地址到物理地址隔各个映射表创建。映射表创建完成后,还需要PTE的创建。
PTE的创建涉及到文件映射,文件映射可以将文件的内容映射到进程的内存空间。
文件映射PTE指向文件的物理内存页,文件映射需要VMA指向对应的文件,由文件来生成物理页。</