mmap 的原理
每一个进程都有一个列表 vm_area_struct
1 struct mm_struct { 2 struct vm_area_struct *mmap; /* list of VMAs */ 3 ...... 4 } 5 6 7 struct vm_area_struct { 8 /* 9 * For areas with an address space and backing store, 10 * linkage into the address_space->i_mmap interval tree. 11 */ 12 struct { 13 struct rb_node rb; 14 unsigned long rb_subtree_last; 15 } shared; 16 17 /* 18 * A file's MAP_PRIVATE vma can be in both i_mmap tree and anon_vma 19 * list, after a COW of one of the file pages. A MAP_SHARED vma 20 * can only be in the i_mmap tree. An anonymous MAP_PRIVATE, stack 21 * or brk vma (with NULL file) can only be in an anon_vma list. 22 */ 23 struct list_head anon_vma_chain; /* Serialized by mmap_sem & 24 * page_table_lock */ 25 struct anon_vma *anon_vma; /* Serialized by page_table_lock */ 26 27 28 29 30 /* Function pointers to deal with this struct. */ 31 const struct vm_operations_struct *vm_ops; 32 /* Information about our backing store: */ 33 unsigned long vm_pgoff; /* Offset (within vm_file) in PAGE_SIZE 34 units */ 35 struct file * vm_file; /* File we map to (can be NULL). */ 36 void * vm_private_data; /* was vm_pte (shared mem) */
内存映射不仅仅是物理内存和虚拟内存之间的映射,还包括将文件中的内容映射到虚拟内存空间。
这个时候,访问内存空间就能够访问到文件里面的数据。
而仅有物理内存和虚拟内存的映射,是一种特殊情况
申请小块内存 : brk。brk 函数之前已经解析过了,这里就不多说了。
申请一大块内存,就要用 mmap。对于堆的申请来讲,mmap 是映射内存空间到物理内存
mmap 的原理
来源:https://www.cnblogs.com/mysky007/p/12316485.html