断断续续的研究了一段时间的Linux内存管理,大概能理出个框架。不过Cache那部分还是有点不太确定了(手头这三本书,只有《深入浅出DPDK》对Cache有提及),所以若有不正确的地方,还需大家提醒纠正
寻址方式
从图中可以看出,在Linux上,采用了虚拟地址的方式(而不是真实的物理地址),尽可能的利用有限的物理地址空间,并且为了硬件平台的可移植性,巧妙的绕过x86架构的段机制,统一采用分页机制,进行内存管理
内存的访问
先简单介绍下在Linux的内存管理中采取了哪些机制(这里顺便验证了下malloc是否可以申请到超过物理内存大小的空间,网上有人说可以,但是我实际测试却返回NULL,glibc中的malloc实现可能有答案,有空再去确认下)
下面,将以“页表项的建立与物理内存的映射”流程图为例,将Linux上的内存管理机制串接起来(在某些场景下,某些管理机制也可能单独被使用,例如:交换机制,就会在kswapd守护进程中所使用)
当获取到物理地址后,CPU又将如何获取到物理地址处存放的数据呢?这就需要了解Cache机制了
Cache
其他
大页内存(为什么说大页内存速度快呢,原因就在于它的TLB是可以做到100%命中的):
大页内存,又可称为大页框内存。
大页(框)的单位(2MB)越大,在Linux的分页机制中,页表项就越少,虚拟地址中的页内偏移量所占bit也就越多。正常页框单位是4KB,也就是页内偏移会占用虚拟地址的12个bit
可执行程序的加载流程(这部分也不太确定):
1、首先,通过mmap建立起磁盘中可执行程序和虚拟地址的映射关系(全映射)
2、然后执行“内存管理中的,页表项的建立与物理内存的映射”中的流程,获得虚拟地址与物理地址的映射(访问虚拟地址时才执行)
3、之后会检查该虚拟地址上是否有跟磁盘建立映射,若有,则将磁盘数据拷贝到物理地址页框中(访问虚拟地址时才执行)
4、最后通过虚拟地址运行可执行程序(访问虚拟地址时才执行)
最后再说下mmap:
1、mmap可以将磁盘地址映射至虚拟地址
2、mmap可以将多个虚拟地址映射至同一物理地址(用户空间可以利用此来访问内核空间)(内核空间访问用户空间,需使用内核空间的“高端内存”)
3、mmap可以将外设地址映射成虚拟地址(DPDK中用户态驱动,由此实现)