【问题标题】:malloc in an embedded system without an operating system没有操作系统的嵌入式系统中的 malloc
【发布时间】:2012-03-09 05:58:09
【问题描述】:

这个查询是关于使用malloc分配内存的。

一般我们所说的malloc从堆中分配内存。

现在说我有一个普通的嵌入式系统(没有操作系统),我加载了正常的程序,我在我的程序中执行malloc

在这种情况下,内存是从哪里分配的?

【问题讨论】:

    标签: c embedded memory-management


    【解决方案1】:

    如您所说,从堆中。不同之处在于堆不是由操作系统提供的。您的应用程序的链接描述文件无疑将包括堆分配。运行时库将对此进行管理。

    对于Newlib C 库,该库通常用于不运行操作系统或至少不运行 Linux 的基于 GCC 的嵌入式系统中,该库有一个名为 sbrk() 的存根 syscall 函数。实现 sbrk() 是开发人员的责任,它必须根据请求为堆管理器提供更多内存。通常它只是增加一个指针并返回一个指向新块开始的指针,此后库的堆管理器管理和维护可能与先前块连续或不连续的新块。上一个链接包含一个示例实现。

    【讨论】:

      【解决方案2】:

      malloc() 是一个通常由运行时库实现的函数。没错,如果您在操作系统之上运行,那么 malloc 有时(但不是每次)会触发系统调用,使操作系统将一些内存映射到程序的地址空间中。

      如果您的程序在没有操作系统的情况下运行,那么您可以将您的程序视为操作系统。您可以访问所有地址,这意味着您只需将地址分配给指针,然后取消引用该指针以进行读/写。

      当然,您必须确保程序的其他部分不只是使用相同的内存,因此您编写自己的内存管理器:

      简单地说,您可以留出一个地址范围,您的 "memory-manager" 用来存储哪些地址范围已经在使用(存储在其中的数据结构可以是像链表一样容易或更复杂)。然后你将编写一个函数并调用它,例如ma​​lloc(),它构成了内存管理器的功能部分。它查看提到的数据结构以找到与参数指定的范围一样长的地址并返回指向它的指针。

      现在,如果您的程序中的每个函数都调用您的 malloc() 而不是随机写入自定义地址,那么您已经完成了第一步。您可以编写一个 free() 函数,该函数将查找它在提到的数据结构中给出的指针,并调整数据结构(在简单的链表中它将合并两个链接)。

      【讨论】:

      • 没有回答真正的问题:动态分配的内存在哪里。它进入堆。堆在哪里?它位于链接描述文件配置的地址范围内。
      • @fanl 你的问题和梅西的问题不同。你有-1这个答案吗?请撤消。如果您打开自己的问题,我会尝试回答。
      【解决方案3】:

      唯一真正的答案是“无论您的编译器/库实现放在哪里”。

      在我使用的嵌入式系统中,没有堆,因为我们还没有写过。

      【讨论】:

      • +1 并且当您启用优化时,编译器可以在确定分配是本地的(例如对函数)时选择堆栈。
      • 好的,没错,但也不是很有帮助。
      猜你喜欢
      • 2016-03-28
      • 2014-06-15
      • 2014-04-20
      • 2010-09-11
      • 2015-07-15
      • 2012-07-12
      • 2011-10-07
      • 1970-01-01
      • 2011-05-27
      相关资源
      最近更新 更多