RT-Smart物理页内存管理详解

想要对 RT-Smart 的物理页内存管理功能有所了解,需要熟悉相关代码:

  • RT-Smart 页初始化相关功能

  • 物理页分配算法伙伴系统的实现


物理页管理初始化

在系统初始化早期,会先执行 rt_page_init 函数来对物理页管理所需要的数据结构进行初始化,下面是对这段代码的详细解释:

 1#define ARCH_PAGE_SHIFT     12
2#define ARCH_PAGE_SIZE      (1 << ARCH_PAGE_SHIFT)
3#define ARCH_PAGE_MASK      (ARCH_PAGE_SIZE - 1) /* b 1111 1111 1111  */
4/* 从这 PAGE_START PAGE_END 可以看出,分配给物理页的地址是从 KERNEL_VADDR_START 开始的第 16M 到 128M 之间  */
5#define HEAP_END        (void*)(KERNEL_VADDR_START + 16 * 1024 * 1024)
6#define PAGE_START      HEAP_END
7#define PAGE_END        (void*)(KERNEL_VADDR_START + 128 * 1024 * 1024)
8static struct page *page_list[ARCH_PAGE_LIST_SIZE];
9/* 传入给页初始化函数的结构体,存储了物理页管理的地址范围 */
10rt_region_t init_page_region = {
11    (uint32_t)PAGE_START,
12    (uint32_t)PAGE_END,
13};
14/* 物理页管理数据结构 */
15struct page
16{

17    struct page *next;  /* same level next */
18    struct page *pre;   /* same level pre  */
19    uint32_t size_bits; /* if is ARCH_ADDRESS_WIDTH_BITS, means not free */
20    int ref_cnt;        /* page group ref count */
21};
22static struct pagepage_start;
23static void*  page_addr;
24static size_t page_nr;
25/* 实际执行物理页管理数据结构的初始化,默认物理页大小为 4K */
26void rt_page_init(rt_region_t reg)
27
{
28    int i;
29    LOG_D("split 0x%08x 0x%08x\n", reg.start, reg.end);
30    /* 调整物理内存的起始地址为 4K 对齐 */
31    reg.start += ARCH_PAGE_MASK;
32    reg.start &= ~ARCH_PAGE_MASK;
33    reg.end &= ~ARCH_PAGE_MASK;
34    /* 计算管理物理页所需数据结构所占用的内存空间,以及可以有多少可以被分配的物理页 */
35    {
36        /* 计算一个物理页也就是 4k 可以存放多少个 page 结构体 */
37        int nr = ARCH_PAGE_SIZE / sizeof(struct page); 
38        /* 计算总共有多少个可用物理页 */
39        int total = (reg.end - reg.start) >> ARCH_PAGE_SHIFT;  
40        /* 计算需要多少个页的内存用于存放管理页数据结构 */
41        int mnr = (total + nr) / (nr + 1);      
42        LOG_D("nr = 0x%08x\n", nr);
43        LOG_D("total = 0x%08x\n", total);
44        LOG_D("mnr = 0x%08x\n", mnr);
45        page_start = (struct page*)reg.start;
46        /* 计算除去用于管理的内存页,可用于物理页分配的起始地址 */ 
47        reg.start += (mnr << ARCH_PAGE_SHIFT);  
48        page_addr = (void*)reg.start;
49        /* 计算有多少个物理页可供分配 */ 
50        page_nr = (reg.end - reg.start) >> ARCH_PAGE_SHIFT; 
51    }
52    LOG_D("align 0x%08x 0x%08x\n", reg.start, reg.end);
53    /* 初始化空闲 page 分配链表*/ 
54    for (i = 0; i < ARCH_PAGE_LIST_SIZE; i++)
55    {
56        page_list[i] = 0;
57    }
58    /* 初始化可供分配的物理页管理结构体 */
59    for (i = 0; i < page_nr; i++)
60    {
61        page_start[i].size_bits = ARCH_ADDRESS_WIDTH_BITS;
62        page_start[i].ref_cnt = 1;
63    }
64    /* 将所有可供分配的空闲页,使用伙伴算法加入到空闲链表 */
65    while (reg.start != reg.end)
66    {
67        struct page *p;
68        int align_bits;
69        int size_bits;
70        /* 计算合适的物理页大小 size_bits 值 */
71        size_bits = ARCH_ADDRESS_WIDTH_BITS - 1 - rt_clz(reg.end - reg.start);
72        align_bits = rt_ctz(reg.start);
73        if (align_bits < size_bits)
74        {
75            size_bits = align_bits;
76        }
77        /* 从实际物理页地址找到相应的管理页地址 */
78        p = addr_to_page((void*)reg.start);
79        p->size_bits = ARCH_ADDRESS_WIDTH_BITS;
80        p->ref_cnt = 1;
81        /* 将相应的管理页结构体加入到页空闲链表上,
82           由此可以知道物理页空闲链表上挂接的是物理页的管理结构体 */

83        _pages_free(p, size_bits - ARCH_PAGE_SHIFT);
84        reg.start += (1UL << size_bits);
85    }
86}

物理页管理算法简介

伙伴系统在现代操作系统中被广泛地用于分配连续的物理内存页。其基本思想是将物理内存划分成连续的块,以块作为基本单位进行分配。不同块的大小可以不同,但每个块都由一个或多个连续的物理页组成,物理页的数量必须是 2 的 n 次幂( 0 <= n < 预设的最大值),其中预设的最大值将决定能够分配的连续物理内存区域的最大大小,一般由开发者根据实际需要指定。

当一个请求需要分配 m 个物理页时,伙伴系统将寻找一个大小合适的块,该块包含 $2^n$ 个物理页,且满足 $2^{n-1} < m < 2^n$。在处理分配请求的过程中,大的块可以分裂成两半,即两个小一号的块,这两个块互为伙伴。分裂得到块可以继续分裂,直到得到一个大小合适的块去服务相应的分配请求。在一个块被释放后,分配器会找到其伙伴块,若伙伴块页处于空闲的状态,则将这两个伙伴块进行合并没形成一个大一号的空闲块,然后继续尝试向上合并。由分裂操作和合并操作都是级联的,因此能够很好地缓解外部碎片的问题。

下图表达了伙伴系统的基本思想,基于伙伴块进行分裂与合并。

伙伴系统实现

在 RT-Smart 系统中,使用空闲链表数组来实现伙伴系统。具体来说,全局有一个有序数组,数组的每一项指向一条空闲链表,每条链表将其对应大小的空闲块连接起来,一条链表中的空闲块大小相同。当接收到分配请求后,伙伴分配器首先算出应该分配多大的空闲块,然后查找对应的空闲链表。

想要了解物理页算法的实现过程,那就要熟悉物理页的申请和释放算法,也就是页面释放函数 _pages_free 和物理页申请函数 _pages_alloc

物理页释放

 1static int _pages_free(struct page *p, uint32_t size_bits)
2{
3    /* 根据 size_bits 获取当前物理页的大小 */
4    uint32_t level = size_bits;
5    uint32_t high = ARCH_ADDRESS_WIDTH_BITS - size_bits - 1;
6    struct page *buddy;
7    RT_ASSERT(p->ref_cnt > 0);
8    RT_ASSERT(p->size_bits == ARCH_ADDRESS_WIDTH_BITS);
9     /* 将该物理页的引用计数减一,如果引用计数不为 0 则直接返回 */
10    p->ref_cnt--;
11    if (p->ref_cnt != 0)
12    {
13        return 0;
14    }
15    /* 判断当前页大小是否比最大空闲页小,如果大小为最大空闲页,则直接将该页插入到最大空闲页链表 */
16    while (level < high)
17    {
18        /* 根据当前物理页的信息和级别,判断它的 buddy 是否存在 */
19        buddy = buddy_get(p, level);
20        /* 如果当前物理页的 buddy 存在且级别与当前物理页相同,则将他们合并成为更高一级别的物理页 */
21        if (buddy && buddy->size_bits == level)
22        {
23            page_remove(buddy, level);
24            p = (p < buddy) ? p : buddy;
25            level++;
26        }
27        else
28        {
29            /* buddy 不存在,则退出查找 */
30            break;
31        }
32    }
33    /* 将指定级别的空闲页插入到空闲链表中 */
34    page_insert(p, level);
35    return 1;
36}

物理页申请

通过上面的物理页释放与分配过程,就实现了 RT-Smart 系统中的物理页管理过程。

————————————————

版权声明:本文为RT-Thread论坛用户「我夏了夏天」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://club.rt-thread.org/ask/article/3e3a9a0b6d3e2105.html

- END -



点击 阅读原文”进入论坛

RTThread物联网操作系统 帮助您了解RT-Thread相关的资讯.
评论
  •           近日受某专业机构邀请,参加了官方举办的《广东省科技创新条例》宣讲会。在与会之前,作为一名技术工作者一直认为技术的法例都是保密和侵权方面的,而潜意识中感觉法律有束缚创新工作的进行可能。通过一个上午学习新法,对广东省的科技创新有了新的认识。广东是改革的前沿阵地,是科技创新的沃土,企业是创新的主要个体。《广东省科技创新条例》是广东省为促进科技创新、推动高质量发展而制定的地方性法规,主要内容包括: 总则:明确立法目
    广州铁金刚 2025-02-28 10:14 111浏览
  • 更多生命体征指标风靡的背后都只有一个原因:更多人将健康排在人生第一顺位!“AGEs,也就是晚期糖基化终末产物,英文名Advanced Glycation End-products,是存在于我们体内的一种代谢产物” 艾迈斯欧司朗亚太区健康监测高级市场经理王亚琴说道,“相信业内的朋友都会有关注,最近该指标的热度很高,它可以用来评估人的生活方式是否健康。”据悉,AGEs是可穿戴健康监测领域的一个“萌新”指标,近来备受关注。如果站在学术角度来理解它,那么AGEs是在非酶促条件下,蛋白质、氨基酸
    艾迈斯欧司朗 2025-02-27 14:50 426浏览
  • 1,微软下载免费Visual Studio Code2,安装C/C++插件,如果无法直接点击下载, 可以选择手动install from VSIX:ms-vscode.cpptools-1.23.6@win32-x64.vsix3,安装C/C++编译器MniGW (MinGW在 Windows 环境下提供类似于 Unix/Linux 环境下的开发工具,使开发者能够轻松地在 Windows 上编写和编译 C、C++ 等程序.)4,C/C++插件扩展设置中添加Include Path 5,
    黎查 2025-02-28 14:39 151浏览
  • 美国加州CEC能效跟DOE能效有什么区别?CEC/DOE是什么关系?美国加州CEC能效跟DOE能效有什么区别?CEC/DOE是什么关系?‌美国加州CEC能效认证与美国DOE能效认证在多个方面存在显著差异‌。认证范围和适用地区‌CEC能效认证‌:仅适用于在加利福尼亚州销售的电器产品。CEC认证的范围包括制冷设备、房间空调、中央空调、便携式空调、加热器、热水器、游泳池加热器、卫浴配件、光源、应急灯具、交通信号模块、灯具、洗碗机、洗衣机、干衣机、烹饪器具、电机和压缩机、变压器、外置电源、消费类电子设备
    张工nx808593 2025-02-27 18:04 128浏览
  • 在2024年的科技征程中,具身智能的发展已成为全球关注的焦点。从实验室到现实应用,这一领域正以前所未有的速度推进,改写着人类与机器的互动边界。这一年,我们见证了具身智能技术的突破与变革,它不仅落地各行各业,带来新的机遇,更在深刻影响着我们的生活方式和思维方式。随着相关技术的飞速发展,具身智能不再仅仅是一个技术概念,更像是一把神奇的钥匙。身后的众多行业,无论愿意与否,都像是被卷入一场伟大变革浪潮中的船只,注定要被这股汹涌的力量重塑航向。01为什么是具身智能?为什么在中国?最近,中国具身智能行业的进
    艾迈斯欧司朗 2025-02-28 15:45 243浏览
  • 振动样品磁强计是一种用于测量材料磁性的精密仪器,广泛应用于科研、工业检测等领域。然而,其测量准确度会受到多种因素的影响,下面我们将逐一分析这些因素。一、温度因素温度是影响振动样品磁强计测量准确度的重要因素之一。随着温度的变化,材料的磁性也会发生变化,从而影响测量结果的准确性。因此,在进行磁性测量时,应确保恒温环境,以减少温度波动对测量结果的影响。二、样品制备样品的制备过程同样会影响振动样品磁强计的测量准确度。样品的形状、尺寸和表面处理等因素都会对测量结果产生影响。为了确保测量准确度,应严格按照规
    锦正茂科技 2025-02-28 14:05 155浏览
  • 在物联网领域中,无线射频技术作为设备间通信的核心手段,已深度渗透工业自动化、智慧城市及智能家居等多元场景。然而,随着物联网设备接入规模的不断扩大,如何降低运维成本,提升通信数据的传输速度和响应时间,实现更广泛、更稳定的覆盖已成为当前亟待解决的系统性难题。SoC无线收发模块-RFM25A12在此背景下,华普微创新推出了一款高性能、远距离与高性价比的Sub-GHz无线SoC收发模块RFM25A12,旨在提升射频性能以满足行业中日益增长与复杂的设备互联需求。值得一提的是,RFM25A12还支持Wi-S
    华普微HOPERF 2025-02-28 09:06 166浏览
  •         近日,广电计量在聚焦离子束(FIB)领域编写的专业著作《聚焦离子束:失效分析》正式出版,填补了国内聚焦离子束领域实践性专业书籍的空白,为该领域的技术发展与知识传播提供了重要助力。         随着芯片技术不断发展,芯片的集成度越来越高,结构也日益复杂。这使得传统的失效分析方法面临巨大挑战。FIB技术的出现,为芯片失效分析带来了新的解决方案。它能够在纳米尺度上对芯片进行精确加工和分析。当芯
    广电计量 2025-02-28 09:15 141浏览
  • 一、VSM的基本原理震动样品磁强计(Vibrating Sample Magnetometer,简称VSM)是一种灵敏且高效的磁性测量仪器。其基本工作原理是利用震动样品在探测线圈中引起的变化磁场来产生感应电压,这个感应电压与样品的磁矩成正比。因此,通过测量这个感应电压,我们就能够精确地确定样品的磁矩。在VSM中,被测量的样品通常被固定在一个震动头上,并以一定的频率和振幅震动。这种震动在探测线圈中引起了变化的磁通量,从而产生了一个交流电信号。这个信号的幅度和样品的磁矩有着直接的关系。因此,通过仔细
    锦正茂科技 2025-02-28 13:30 108浏览
  • RGB灯光无法同步?细致的动态光效设定反而成为产品客诉来源!随着科技的进步和消费者需求变化,电脑接口设备单一功能性已无法满足市场需求,因此在产品上增加「动态光效」的形式便应运而生,藉此吸引消费者目光。这种RGB灯光效果,不仅能增强电脑周边产品的视觉吸引力,还能为用户提供个性化的体验,展现独特自我风格。如今,笔记本电脑、键盘、鼠标、鼠标垫、耳机、显示器等多种电脑接口设备多数已配备动态光效。这些设备的灯光效果会随着音乐节奏、游戏情节或使用者的设置而变化。想象一个画面,当一名游戏玩家,按下电源开关,整
    百佳泰测试实验室 2025-02-27 14:15 140浏览
  • 应用趋势与客户需求,AI PC的未来展望随着人工智能(AI)技术的日益成熟,AI PC(人工智能个人电脑)逐渐成为消费者和企业工作中的重要工具。这类产品集成了最新的AI处理器,如NPU、CPU和GPU,并具备许多智能化功能,为用户带来更高效且直观的操作体验。AI PC的目标是提升工作和日常生活的效率,通过深度学习与自然语言处理等技术,实现更流畅的多任务处理、实时翻译、语音助手、图像生成等功能,满足现代用户对生产力和娱乐的双重需求。随着各行各业对数字转型需求的增长,AI PC也开始在各个领域中显示
    百佳泰测试实验室 2025-02-27 14:08 267浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦