gpt4 book ai didi

gcc - 如何在数据部分(RAM)中保留一定范围的内存并防止使用该内存的同一应用程序的堆/堆栈?

转载 作者:行者123 更新时间:2023-12-04 13:49:35 26 4
gpt4 key购买 nike

我想在 RAM 中保留/分配内存范围,并且同一个应用程序不应覆盖或使用该内存范围用于堆/堆栈存储。如何在受堆栈/堆覆盖保护的 ram 中分配一定范围的内存?我考虑过向应用程序本身添加(或分配)一个数组并保留内存,但它被编译器优化掉了,因为它在应用程序的任何地方都没有被引用。

我正在使用 ARM GNU 工具链进行编译。

最佳答案

这个问题有多种解决方案。按从好到坏的顺序列出,

  1. 使用链接器
  2. 注释变量
  3. 全局范围
  4. 不稳定(可能)

链接脚本

您显然可以使用链接器文件来完成此操作。它是完成这项工作的合适工具。向链接器传递 --verbose 参数以查看默认脚本是什么。然后您可以修改它以精确保留内存。

变量属性

随着 gcc 的最新版本,attribute used也会做你想做的。 Most modern gcc版本将支持这一点。它也比链接器脚本简单得多;但只有链接器脚本才能以可靠的方式精确控制的位置。

全局范围

你也可以给你的数组全局范围,编译器不应该消除它。如果您使用 link time optimization,这可能不是真的.

volatile

理论上,编译器可以消除静态volatile 数组。当您的代码涉及数组时,volatile 就会发挥作用。它修改了访问行为,因此编译器永远不会缓存对该范围的访问。 Dr. Dobbs on volatile 至少我不清楚这种行为,我不会推荐这种方法。它可能适用于某些版本(和优化级别)的编译器,但不适用于其他编译器。

限制

此外,链接器选项 -gc-sections , 可以消除全局范围和 volatile 方法保留的空间,因为符号可能不会以任何方式在对象格式中注释;请参阅链接描述文件 (KEEP)

只有Linker script 绝对可以限制堆栈的覆盖。您需要将堆栈顶部放在保留区域之前。通常, 增长,堆栈 增长。所以这两者相互碰撞。这是特定于您的环境/C 库(例如 newlib 是典型的 ARM 裸机库)。查看链接器文件将对此提供最好的线索。

我的猜测是您想要一个休闲区 以在系统崩溃时保留某种调试信息?对您的问题进行更明确的解释会有所帮助。您似乎并不关心内存的位置,所以我猜这与硬件无关。

关于gcc - 如何在数据部分(RAM)中保留一定范围的内存并防止使用该内存的同一应用程序的堆/堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24118682/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com