gpt4 book ai didi

c - 如何在c函数中访问堆起始地址和堆基地址

转载 作者:太空狗 更新时间:2023-10-29 15:28:07 24 4
gpt4 key购买 nike

对于我自己的malloc动态内存分配实现,我想在运行时访问堆基地址和堆限制地址。我知道它们在我的 startup.s 文件中作为全局变量导出。我怎样才能访问这些地址?目标平台是带有 GCC 的 ARM Cortex-M4。

.globl 声明的符号是链接器已知的,应该可以在 c 代码中使用 extern 符号访问。但是使用这种方法,我得到的值与生成的 .map 文件中的值不同。

下面是startup.s文件中定义的堆符号:

#ifdef __HEAP_SIZE
.equ Heap_Size, __HEAP_SIZE
#else
.equ Heap_Size, 0x00000C00
#endif
.globl __HeapBase
.globl __HeapLimit
__HeapBase:
.if Heap_Size
.space Heap_Size
.endif
.size __HeapBase, . - __HeapBase
__HeapLimit:
.size __HeapLimit, . - __HeapLimit

.section .vectors
.align 2
.globl __Vectors

这是我在我的 c 函数中的访问:

extern volatile __HeapBase;
extern volatile __HeapLimit;

static void heaptest(void) {
uint32_t limit;
uint32_t base;

base = __HeapBase;
limit = __HeapLimit;
}

调试此代码时,我得到了生成的 .map 文件中指定的地址以外的其他地址:

.heap           0x200317a0    0x40000
0x200317a0 __HeapBase = .
...
0x200717a0 __HeapLimit = .
...

因此,我希望 __HeapBase 的输出为 0x200317a0__HeapLimit 的输出为 0x200717a0,但实际输出我得到的是 0xf377aaa20xac69254

最佳答案

将它们声明为 extern char __HeapBase[]; 因为在 C 中,数组对象的名称转换为指针,而其他对象的名称被隐式取消引用。

也许还可以使用 #define HEAPBASE ((void*)__HeapBase) 来方便使用名称。或者将其转换为 (uintptr_t) 或其他任何内容。

有一个单独的全局 void *base = &__HeapBase; 会不太好:base 不是编译时常量值,因为它甚至没有声明为 常数。使用它的代码必须从静态存储加载指针,而不是拥有可以直接使用的链接时常量地址。

关于c - 如何在c函数中访问堆起始地址和堆基地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57709032/

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