嵌入式操作系统知识分享:linux内存管理概览

参考来源:

  • 《内核设计与实现》
  • 一步一图带你深入理解 Linux 物理内存管理 - bin的技术小屋 - 博客园 (cnblogs.com)
  • Linux内存管理宏观篇(五)物理内存:页面分配和释放页面-阿里云开发者社区 (aliyun.com)

首先有个宏观的认识:内存是cpu的内存,在多cpu中使用的NUMA架构,一个或多个cpu就是一个node,再将node中包含的一部份内存中区分出zone,在zone中又使用多种策略进行内存页分配。

注意和inode区分,文件系统的inode是存在固态上的,而这里的node是cpu的内存

zone

由于一些硬件的缺陷

  • 有些硬件DMA必须对应特殊的地址
  • 一些架构内存的物理寻址比虚拟寻址范围大得多,存在永久不能映射的地址

这样,linux将每个node又会划分出多个zone管理多个页,用来在逻辑上进行一些分组(没有任何物理意义).

  • ZONE_DMA:其中的页可以使用DMA
  • ZONE_DMA32:类似于ZONE_DMA,但是只有32位的设备可以访问
  • ZONE_NORMAL:正常映射的页
  • ZONE_HIGHEM:并不能永久的映射到内核地址的空间
  • ZONE_MOVALBE:内部的页都是可以迁移的
  • ZONE_DEVICE:支持热插拔设备的非易失性内存

图中的ZONE分布不是物理意义上的分布

其中每个zone有可能会有自己的伙伴管理系统等方式管理着页。

同样先给一个页的大致概念:每个页都会有 struct page结构描述。并且page与物理页有关,并不是虚拟页。通过这个结构来查看是否空闲,以及所有者是谁(进程、内核数据、静态代码、高速缓存等)。

一般来说页是4k,这是经过权衡和优化的结果,页太大会导致碎片化,页太小会导致页表寻址TLB的负担加重。但其实可以使用更大的内存页,只不过4k从上世纪默认延续下来了。

可能这时候会疑惑,为什么页的所有者还有可能是数据或者代码或者缓存,而不仅仅是某个进程。其实每个页在分配后,会由伙伴系统或者slab或者其他的方式统一管理,这时候这些页就存着不同的内容,而不仅仅是某个进程独有,有可能是每个进程的pcb在某一页中被slab统一的管理

为了后续更好的理解,这里先大致了解一下每个进程所占用的空间以及对应的内存管理的关系。对于每个进程,其虚拟地址都是通过MMU向物理地址转换,如果发现进程所使用的物理地址不够了,那么就会触发 page fault ,从而向内核申请出物理页,然后做好映射后放回到MMU中,供进程使用。所申请的物理页可以被伙伴算法或者其他的算法管理,总之就是由内核做统一的管理。

内存分配管理方法

伙伴算法

处理, 每个页是4k,将页面数目凑成(4k 8k 16k...4M)大页分别用

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

1. 自我介绍:高通、Oppo(sp)、vivo(sp)、小米(ssp)、荣耀(26k*12+80k)、华子(报批中)、美团、韶音、经纬恒润、乐鑫、中兴、TP 2. 内容: 1.嵌入式学习的资料和路径 2.所有面试的题目和解答(持续更新)、对评论的快速解答 3.各种碎碎念 3.整理不易,buy me coffee☕️,为了回馈牛客和各个粉丝,文章都会先试读几天,热度过了再收录~

全部评论

相关推荐

评论
点赞
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务