嵌入式学习(内存管理)

硬件角度

固定分区/动态分区存在的问题:进程地址空间保护问题、内存使用效率低、程序运行地址重定位问题。

为解决问题,引入了分段机制和分页机制。

先有分段机制,在原有基础上增加虚拟内存,不同的进程访问不同的虚拟地址,由CPU将虚拟地址映射到物理地址。仍然以进程为单位导致内存使用效率低,从而引入分页机制。

软件角度

1. Free命令

作用:显

示当前系统已使用和空闲的内存情况(物理内存、交换内存、内核缓存区内存)

-m : 以MB为单位显示内存使用情况

total :系统总内存。 Mem:物理内存  Swap:交换磁盘

used:已使用

free:未被分配

shared:共享内存

buff/cache:缓存

available:= free + buffers + page cache - 不可回收部分

2. malloc()函数

常用的内存管理编程函数:

malloc函数是一种动态内存分配函数,它用于在程序运行时动态地分配一段指定大小的内存空间。malloc函数的返回值是一个指向分配的内存空间的指针,可以通过该指针来访问这段内存空间。malloc函数的使用可以帮助程序员更灵活地管理内存,避免静态内存分配带来的浪费和限制。需要注意的是,使用malloc函数分配的内存空间需要在使用完毕后及时释放,否则会导致内存泄露。

free函数是一种动态内存释放函数,它用于释放先前使用malloc函数或者calloc函数分配的内存空间。free函数的参数是一个指向先前分配的内存空间的指针,该指针指向的内存空间将被释放。使用free函数可以避免内存泄露,释放不再使用的内存空间,从而提高程序的性能和稳定性。需要注意的是,使用free函数释放的内存空间不能再次访问,否则会导致程序出现不可预知的行为。

mmap函数是一种内存映射文件的方法,它将一个文件或者其他对象映射到进程的地址空间中,从而使得进程可以像访问内存一样访问这个文件或者对象。mmap函数的功能包括将文件映射到内存中、将内存映射到文件中、创建匿名内存映射区域等。mmap函数的返回值是一个指向映射区域的指针,可以通过该指针来访问映射区域的内容。mmap函数的使用可以提高文件的访问速度,减少内存的使用,提高程序的性能。

munmap函数是一种内存释放函数,它用于释放先前使用mmap函数映射的内存区域。munmap函数的参数是一个指向先前映射的内存区域的指针和该内存区域的大小。使用munmap函数可以释放不再需要的内存区域,从而避免内存泄露和浪费。需要注意的是,使用munmap函数释放的内存区域不能再次访问,否则会导致程序出现不可预知的行为。另外,使用munmap函数释放的内存区域必须是使用mmap函数映射的内存区域,否则导致程序出现错误。

getpagesize函数是一种用于获取系统页面大小的函数。在Linux系统中,内存被划分为许多页面,每个页面的大小是固定的,通常为4KB或者8KB。getpagesize函数返回当前系统的页面大小,以字节为单位。程序可以使用getpagesize函数获取系统页面大小,并根据页面大小来进行内存操作,例如对齐内存分配、优化内存访问等。需要注意的是,getpagesize函数返回的页面大小可能因系统而异,因此程序应该避免硬编码页面大小,而应该使用getpagesize函数获取页面大小。

mprotect函数是一个系统调用,它用于更改内存区域的访问权限。该函数的原型如下:

int mprotect(void *addr, size_t len, int prot);

其中,参数addr指向要更改权限的内存区域的起始地址,len指定要更改的内存区域的长度,prot指定新的访问权限。

prot参数可以取以下值之一:

  • PROT_NONE:禁止访问该内存区域。
  • PROT_READ:允许读取该内存区域。
  • PROT_WRITE:允许写入该内存区域。
  • PROT_EXEC:允许在该内存区域中执行代码。

mprotect函数可以用于保护内存区域,防止其被意外修改或执行。它也可以用于实现内存保护机制,以防止恶意代码对系统造成破坏。

mlock函数是一个系统调用,用于锁定一个进程的部分或全部虚拟内存,防止其被换出到磁盘上的交换空间。这个函数的作用是将进程所需的内存锁定在物理内存中,从而提高程序的性能和响应速度。

当一个进程需要频繁访问某些内存区域时,如果这些内存区域被交换到磁盘上,每次访问都需要从磁盘上读取,会严重影响程序的性能。使用mlock函数可以将这些内存区域锁定在物理内存中,避免被交换到磁盘上,从而提高程序的运行效率。

需要注意的是,mlock函数只能在具有足够权限的进程中使用。如果一个进程没有足够的权限,调用mlock函数会失败。

munlock函数是一个系统调用,用于解锁一个进程的部分或全部虚拟内存,允许其被换出到磁盘上交换空间。这个函数的作用是释放先前由mlock函数锁定的内存区域,从而使其可以被交换到磁盘上。

当一个进程不再需要访问某些内存区域时,可以使用munlock函数将这些内存区域解锁,从而释放物理内存资源。这样做可以避免占用过多的物理内存资源,同时也可以避免系统出现内存不足的情况。

需要注意的是munlock函数只能在具有足够权限的进程中使用。如果一个进程没有足够的权限,调用munlock函数会失败。另外,munlock函数只能解锁先前由mlock函数锁定的内存区域,如果一个内存区域没有被锁定,调用munlock函数也会失败。

madvise函数是一个系统调用,用于向内核提供有关进程虚拟内存使用方式的建议。这个函数的作用是告诉内核如何管理进程的虚拟内存,以便提高程序的性能和响应速度。

madvise函数可以接受多种不同的建议标志,包括:

  • MADV_NORMAL:默认标志,表示内存使用方式正常,不需要特别的处理。
  • MADV_RANDOM:表示内存访问模式是随机的,内核可以采取相应的优化措施。
  • MADV_SEQUENTIAL:表示内存访问模式是顺序的,内核可以采取相应的优化措施。
  • MADV_WILLNEED:表示进程将来会需要某些内存区域,内核可以提前将这些区域加载到内存中,以提高程序的响应速度。
  • MADV_DONTNEED:表示进程不再需要某些内存区域,内核可以将这些区域从内存中释放,以节省物理内存资源。

需要注意的是,madvise函数只是向内核提供建议,内核不一定会采取相应的优化措施。另外,madvise函数只能在具有足够权限的进程中使用。如果一个进程没有足够的权限,调用madvise函数会失败。

mremap函数是一个Linux系统调用,用于重新映射一个已经映射的内存区域,可以用来改变内存区域的大小或位置。它的函数原型为:

#include <sys/mman.h>

void *mremap(void *old_address, size_t old_size, size_t new_size, int flags, ... /* void *new_address */);

其中,old_address是原始内存区域的起始地址,old_size是原始内存区域的大小。new_size是新的内存区域大小,flags是标志位,可以指定内存区域的访问权限和其他选项。可变参数new_address是可选的,它指定了新的内存区域的起始地址。

mremap函数可以用来实现动态内存管理,比如在需要时增加内存区域的大小,或者在不需要时释放内存区域。它还可以用于实现内存映射文件等功能。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
内存管理机制是嵌入式系统研究中的一个重点和难点的问题,它必须满足以下几个特性: ①实时性。从实时性的角度出发,要求内存分配过程要尽可能地快。因此,在嵌入式系统中,不可能采用通用操作系统的一些复杂而完善的内存分配策略,一般没有段页式的虚存管理机制;而是采用简单、快速的内存分配方案,其分配方案也因程序对实时性的要求而异。例如,VxWorks系统采用简单的“首次适应,立即聚合”方法;VRTX中采用多个固定尺寸存储块的binning方案。 ②可靠性。嵌入式系统应用的环境千变万化,在有些特定情况下,对系统的可靠性要求极高,内存分配的请求必须得到满足,如果分配失败则可能会带来灾难性的后果。比如,飞机的燃油检测系统。在飞机飞行过程中,如果燃料发生泄漏,系统应该立即检测到,并发出相应的警报等待飞行员及时处理。如果因为内存分配失败而不能相应地操作,就可能发生机毁人亡的事故。 ③高效性。内存分配要尽可能地减少浪费。不可能为了保证满足所有的内存分配请求而将内存配置得很大。一方面,嵌入式系统对成本的要求使得内存在其中只是一种很有限的资源;另一方面,即使不考虑成本的因素,系统硬件环境有限的空间和有限的板面积决定了可配置的内存容量是很有限的。 针对以上三个约束条件,市场上主流的嵌入式操作系统,如VxWorks、嵌入式Linux 等均提出了一套有效的解决方案;但是,这些系统只提供了应用开发的接口,其底层的实现方案不可见。本文以开源的嵌入式操作系统RTEMS为例,分析了嵌入式系统内存管理所面临的问题,研究了其底层实现的解决方案。一般的嵌入式系统中最基本的内存管理方案有两种——静态分配和动态分配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值