相关背景知识
- 说到mmap的使用,我们首先要了解一下进程的虚拟进程地址空间的概念。Linux上为了作进程隔离,每个进程都运行在自己的单独的虚拟进程空间,同时物理机上内存有限,每个进程使用虚拟内存地址来隔离又共享物理内存。我们平时在代码里获取的地址就是虚拟地址;
- 放一张进程虚拟地址空间草图,网上也可以很容易找到更精美的
- 我们在程序中申请内存的操作,实际上只是在进程地址空间相应部分申请了一段虚拟地址,当实际对这段虚拟地址进行读写操作时,才会分配真正的物理内存;
- 通常x86 Linux采用段页式的内存管理模式,这块不具体展开,简单来说就是CPU访问的逻辑地址,然后经过分段机制转换成线性地址(你可以简单理解成等价于上面说的虚拟地址),再经过分页机制转换成物理地址,第一次访问的时候由于实现物理地址还没有分配,会产生缺页中断来分配物理地址,用它来填充对应的页表项;
- 通过 read 系统调用来读取磁盘上的文件时,文件内容会先被读到内存的page inode 部分,然后再从page cache中拷贝到应用层的读缓存buffer中;对于打开的文件,内核都会在内存中维护一个inode结构体(对于同一个文件,即使被open多次,内核也仅维护这一个inode),其有一个成员是 struct address_space *i_mapp