【LiteOS】第 2 章

文章目录


LiteOS_华为云

  • 为何会有 IPC 初始化?IPC 通信不应该是基础内核部分?
  • slab 算法和 LiteOS 中使用的 slab 的区别?

内核架构

【LiteOS】第 2 章
LiteOS 包括不可裁剪的极小内核和其它模块,支持在单核(UP)和多核(SMP)上运行。

内存管理
+ 提供静态内存和动态内存两种算法,支持内存申请、释放。目前支持的内存管理算法有固定大小的BOX算法、动态申请的bestfit算法和bestfit_little算法。
+ 提供内存统计、内存越界检测功能。

调测
检测的内存问题包括缓冲区溢出(buffer overflow),释放后使用(use after free),多重释放(double free)和释放野指针(wild pointer)。

启动流程

初始化过程主要围绕极小内核完成,内存、任务、时钟、中断和异常。直至开启系统时钟和任务调度后,初始化工作完成。

【LiteOS】第 2 章

内存管理

内存利用率、使用效率、内存碎片
【LiteOS】第 2 章
【LiteOS】第 2 章

  • 静态内存管理:在静态内存池中分配用户初始化时预设的固定大小的内存块;

    • 分配和释放效率高,静态内存池中无碎片?
    • 只能申请到预设大小的内存块,不能按需申请;
  • 动态内存管理:在动态内存池中分配用户指定大小的内存块;

    • 按需分配;
    • 容易产生外部碎片;

动态内存运行机制

内存管理算法:

  • bestfit
  • bestfit_little

bestfit 算法

  • 一、堆内存(内存池)的起始地址及大小;
  • 二、数组(每个元素为双向链表的free节点控制头,链表上的元素为 used节点)每次申请内存的时候,会从这个数组检索最合适大小的free节点以分配内存。每次释放内存时,会将该内存作为free节点存储至这个数组以便下次再使用;
  • 三、存放各节点的实际区域,占用极大空间;
    【LiteOS】第 2 章
bestfit 动态内存管理结构图

【LiteOS】第 2 章

节点在内存中的位置如何记录?

【LiteOS】第 2 章

LosMemDynNode节点结构体图

保证数据空间首地址能够满足对齐要求,通过增加 Gap 域? 确保返回的指针符和对齐要求。
【LiteOS】第 2 章
bestfit_little算法

bestfit_little = bestfit(选择内存池中最小最合适的内存块进行分配) + slab(用于分配固定大小的内存块,减少产生内存碎片的可能性)

页框、buddy、slab

slab:把不同对象划分为高速缓存组,每个对象对应一个高速缓存,slab 由一个或者多个物理上连续的页组成。

  1. 减少伙伴算法在分配小块内存时所产生的碎片;
  2. 将频繁使用的对象缓存起来,减少分配、初始化和释放的开销;
  3. 通过着色技术调整对象更好地使用硬件高速缓存;
    【LiteOS】第 2 章

可以配置 slab class 数目以及每个 class 的大小。

首先按照 best_fit 算法申请 4 个 slab class,每个slab class 512 字节。

  • 第一个slab class被分为32个16字节的slab块;
  • 第二个slab class被分为16个32字节的slab块;
  • 第三个slab class被分为8个64字节的slab块;
  • 第四个slab class被分为4个128字节的slab块;

现在申请 20 字节,会在 32 字节的 slab 块中寻找,如果成功,则将 slab 块返回给用户,释放时整块回收。

如果32字节的slab块中没有可分配的内存块,那么从内存池中按照最佳适配算法申请,而不是从更大的slab块中申请。释放时,检查是否属于 slab class,如果是则还回对应的 slab class 中,否则还回内存池中。

【LiteOS】第 2 章

静态内存运行机制

实质是一个静态数组,静态内存池内的块大小在初始化时设定,初始化后块大小不可变更。

静态内存池有一个控制块和若干相同大小的内存块构成。
【LiteOS】第 2 章

上一篇:ngx学习——slab


下一篇:Linux内存之Slab