应用空间
返回一段映射好的虚拟地址,操作这个虚拟地址就能操作到设备的物理地址
void * mmap(void *start,size_t length,int port,int flags,int fd,offset)
系统调用syscall
内核
do_mmap_pgoff
mmap_region //在当前的进程空间分配一个mmap区域,分配一个struct vm_area_struct对象,mmap区域的长度为PAGE大小的整数倍
file->f_op->mmap(file,vma) //将分配的mmap区域映射到设备的内存上
remap_pfn_range(vma,addr,pfn,size,prot)//需要完成页目录表项的配置
remap_pfn_range(vma,addr,pfn,size,prot)
//将参数addr起始大小为size的虚拟地址空间映射到pfn表示的一组的连续的物理页面上
//pfn为物理地址的页帧号,在页面大小为4kb的系统中,一个物理地址右移12位可以得到,与mmu映射表有关系
//port 页表中的属性位,比如cache