RTOS内存管理

操作系统提供给用户的另一个重要的功能,就是对你硬件的有限容量内存进行管理,使得你每个任务运行态时,可以最合理地使用硬件平台的内存,这个是内存管理的最基本功能。

(一) “堆”和“栈”

学过微机原理的读者,可能都会知道,在x86架构的机器里面,有两个专门和堆栈管理相关的寄存器,一个叫堆栈段位寄存器SS,另一个叫堆栈指针寄存器SP。我想,这里是大家最早接触堆栈的地方。

但是,细心的读者可能会发现,我在这里的写法是将“堆”和“栈”进行分离,这也就是意味着,这里的“堆”和“栈”并不是指上述里面的“堆栈”。这里的堆栈,说简单点,就是指的操作系统里面的数据结构。我们将英文“Stack”称为“栈区”,将英文“Heap”称为“堆区”。我们再来强调一下,单片机里面或者处理器里面的“堆栈”,指的是一种特殊的存储器,而操作系统里面的“堆”和“栈”,是两种不同的数据结构。

以下例子都是假设在有操作系统基础上。假设,我们用C语言定义一个变量“int a = 0xfe;”,这条语句转到系统操作时,变量a到底存在哪里,并且给它多大的存储区,则由编译器自动分配释放,以上存储的地方,我们称为“栈区” 。另外,存放函数的参数值,局部变量的值等也是存放进入栈中。

而假设,你使用了“malloc”函数去开辟一块内存区,这块存储区,实际上是由一块块连续或者不连续的内存所构成的,其类似于一种链表式的数据存储区,这样的操作就是所谓的在“堆区”开辟内存。

另外,“栈区”存储的变量,系统会在每次使用时进行分配,不用时自动回收,因此为什么有static这种关键词,也是这个原因;而“堆区”的内存,开辟之后,如果不去用,一定要去手动释放它,因为系统不会自动去回收。如果多个任务都动态分配内存,而不去回收,则会容易造成内存溢出,进而产生严重的后果。“堆区”的内存,只有一种情况下是会被自动释放的,也就是强制将系统停止时就释放了。

有了以上知识之后,我们就可以解释操作系统任务的内存分配问题了,所有的操作系统内存管理,都是在系统将处于运行态时,在“堆区”分配给内存一块内存,具体内存的大小,在FreeRTOS里面,由用户自己去设定。这样一来,我们只要分配的合理,我们的任务在任何情况下,都可能分配给运行态的任务最合理的内存大小,因为非运行态的任务可以释放出大量的内存。

(二) 虚拟内存技术

都说Linux的移植性非常广的,你可以在几乎任何带MMU的平台上面移植Linux。这句话似乎有点问题,因为Linux要想移植,首先保证你的平台是带MMU的 。重点是,什么是“MMU”。

“MMU”,内存管理单元(Memory Manage Unit),它是实现“虚拟内存技术”的关键性硬件部件,那么什么是“虚拟内存技术”?为什么要用“虚拟内存技术”?

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。关于虚拟内存的详细说明,可以参考我们后一篇转载的文章。

虚拟内存真正的好处有两点:第一点,避开了应用程序直接访问物理内存,这样的话,即使哪个粗心的程序员忘记释放内存了,系统也只会回收相应的任务,而不会让整个系统奔溃。第二点,可以做到将有限的物理内存,扩展到最高,比如,你的计算机的地址总线是32位的,那就可以将2GB的物理内存,扩展成2^32.。

可惜的是,本来STM32上面跑一个Linux也不是什么大问题,只是由于了MMU的限制,只能遗憾地跑FreeRTOS了,这就是最远的距离。不过前几年,有些内核黑客改写了Linux的内存管理代码,将其MMU限制了,并用软件方式去模拟,命名为uCLinux,只不过,效果实在是不好,因此慢慢没落了。

(0)

相关推荐

  • 【嵌入式】内存管理,虚拟存储

    内存管理介绍 早期的计算机内存容量非常小,当时的PC主要使用DOS操作系统或者其它操作系统.早期的操作系统由于系统硬件的限制,无法支持内存管理,应用程序占用的空间和程序规模都比较小.随着计算机硬件性能 ...

  • 计算机操作系统原理

    最近准备i面试,抽时间回顾一下计算机操作系统原理.  -2018.10.1 1.硬件基础 计算机的构成: 处理器(CPU):主要包括运算器.控制器 内存(主存储器) 输入输出设备 详细的讲,CPU内部 ...

  • 按下电源后的几秒钟,CPU在干嘛?

    来电了 "来电了,来电了,起来干活了",一大早,我还在睡梦中就被吵醒了. 我是CPU一号车间的阿Q,好久不见,不知道大家有没有想我呢? "今天不是星期六吗?怎么还要工作& ...

  • 在操作系统的虚拟内存管理中 内存地址由页目录号 页号和页内偏移三个部分组成。如果页目录号占10

    在操作系统的虚拟内存管理中,内存地址由页目录号.页号和页内偏移三个部分组成.如果页目录号占10位.页号占10位.页内偏移占12位,那么(52). A.页大小是1K,一个页目录最多4K页 B.页大小是2 ...

  • Linux由哪几部分组成?Linux学习

    众所周知,Linux是一套免费使用和自由传播的类Unix操作系统,它拥有免费.开源.可靠.安全.稳定.多平台等特点,是服务器领域的首选系统.那么Linux操作系统由哪五个基本部分组成?以下是详细的内容 ...

  • 自学Java最起码要学到什么程度?

    首先,自学Java需要找到学习的节奏,今天学什么,明天学什么,具体内容如何判断是否掌握,把自己的目标一一整理. 自己一个人学习Java是一件非常枯燥且需要耐心的事情,但是也可以利用业余时间来做的事,所 ...

  • Cortex-M可以跑Linux操作系统吗?

    单片机.Cortex-M.Linux它们和嵌入式有什么区别? 跑 Linux 操作系统需要什么处理器?ARM9.ARM11? Cortex-M比ARM9更新,为什么不能跑Linux? 相信很多小伙伴都 ...

  • 万字整理,肝翻Linux内存管理所有知识点

    Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理的知识,也就打通了Linux的任督二脉,这一点不夸张.有人问网上有很多Linux内存管理的内容,为什 ...

  • 图解 Go 内存管理分配

    GCTT:dust347 Go语言中文网 今天 Illustration created for "A Journey With Go", made from the origin ...

  • Linux 内存管理之vmalloc

    走进vmalloc 根据前面的系列文章,我们知道了buddy system是基于页框分配器,kmalloc是基于slab分配器,而且这些分配的地址都是物理内存连续的.但是随着碎片化的积累,连续物理内存 ...

  • Python一切皆是对象,但这和内存管理有什么关系?

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取 Python免费学习资料 ...

  • Linux 内存管理之CMA

    什么是CMA CMA是reserved的一块内存,用于分配连续的大块内存.当设备驱动不用时,内存管理系统将该区域用于分配和管理可移动类型页面:当设备驱动使用时,此时已经分配的页面需要进行迁移,又用于连 ...

  • HBase原理|HBase内存管理之MemStore进化论

    Java工程中内存管理总是一个绕不过去的知识模块,无论HBase.Flink还是Spark等,如果使用的JVM堆比较大同时对读写延迟等性能有较高要求,一般都会选择自己管理内存,而且一般都会选择使用部分 ...

  • 看完这篇你还能不懂C语言/C 内存管理?

    C 语言内存管理指对系统内存的分配.创建.使用这一系列操作.在内存管理中,由于是操作系统内存,使用不当会造成毕竟麻烦的结果.本文将从系统内存的分配.创建出发,并且使用例子来举例说明内存管理不当会出现的 ...

  • 操作系统的内存管理算法

    本文主要介绍内存的基本概念以及操作系统的内存管理算法. 嵌入式专栏 1 内存的基本概念 内存是计算机系统中除了处理器以外最重要的资源,用于存储当前正在执行的程序和数据.内存是相对于CPU来说的,CPU ...

  • 操作系统~内存管理之覆盖与交换、连续内存分配

    文章目录 内存保护 内存覆盖 内存交换技术 内存分配 单一连续分配 固定分区分配 动态分区分配 动态分配算法 进程的运行原理 - 指令 逻辑地址VS物理地址 什么是内存?有何作用 内存管理 什么是内存 ...