文件映射mmap

时间:2023-03-09 15:57:29
文件映射mmap

磁盘与内存的映射就是文件映射,说这个问题之前我们先说下swap,因为

 
这个问题让我很容易想起swap,linux swap 是交换分区的意思,在内存不
 
够的情况下,操作系统先把内存与磁盘的swap区进行一个“映射”,然后把
 
这些内存解放出来放入内存中,为之后的进程的腾出一块内存空间,等到自
 
己的进程再次被唤醒时候,再把磁盘里面的内存换进来。这里有文件和内存之间
 
的映射奥,可是mmap与swap设计思想上是完全不同的,一个针对的物理内存
 
一个针对的是虚拟内存。
 
 
在说mmap之前我们先说一下普通的读写文件的原理,进程调用read或是write
 
后会陷入内核,因为这两个函数都是系统调用,进入系统调用后,内核开始读写
 
文件,假设内核在读取文件,内核首先把文件读入自己的内核空间,读完之后
 
进程在内核回归用户态,内核把读入内核内存的数据再copy进入进程的用户态内
 
存空间。实际上我们同一份文件内容相当于读了两次,先读入内核空间,再从内核
 
空间读入用户空间。
 
 
mmap是系统调用,mmap的作用是将进程的虚拟地址空间和文件在磁盘的位置做一一
 
映射,做映射之后,读写文件虽然同样是调用read和write但是触发的机制已经不一
 
样了(mmap是file_operations中的成员这么一说是不是了然了),实际上我们这么
 
说是不太合理的因为一一映射并不是mmap一开始就全部完成映射的。
 
 
mmap只会返回来一个指针,指向进程逻辑地址空间的一个位置。这个时候的过程是这
 
样的,首先read会改写为读内存操作,读内存的时候,系统发现该地址对应的物理内存
 
是空的,触发缺页机制,缺页机制先在swap寻找对应的页面,发现没有然后再去通过mmap
 
建立的映射关系,从硬盘上将文件读入物理内存。也就是说mmap把文件直接映射到了用户
 
空间,没有经历内核空间。
 
 
mmap可以映射文件进入用户的虚拟内存,实际上,他也可以把设备的内存映射入用户的
 
虚拟内存,因为我们一般都需要内核去读写设备,如果把设备的物理内存直接映射入空间
 
就跟上述一样,省去一次的内核copy。