【发布时间】:2011-06-05 23:14:18
【问题描述】:
最终我只是想弄清楚如何从程序集中动态分配堆内存。
如果我从汇编代码中调用 Linux sbrk(),我能否像使用静态(即在我的程序列表的 .data 部分中)声明的内存块的地址一样使用返回的地址?
我知道 Linux 使用硬件 MMU(如果存在),所以我不确定 sbrk 返回的是指向真实 RAM 的“原始”指针,还是指向可能被 Linux 的 VM 系统修改的 RAM 的熟指针?
我读到这个:How are sbrk/brk implemented in Linux?。我怀疑我不能毫无顾虑地使用 sbrk() 的返回值:access-non-allocated-address 上的 MMU 错误必须导致 VM 更改正在寻址的 RAM 中的实际位置。因此,未与 libc 或 what-have-you 链接的 assy 不会知道地址已更改。
这有意义吗,还是我出去吃午饭?
【问题讨论】:
-
还有真正的 sbrk 系统调用吗?我认为它在很久以前就已被弃用(支持 mmap)。例如。 FreeBSD 没有了。可能是 linux 风格是特定于 x86 的。
-
x86 Linux (OpenSuSE 11.3) 仍然有 sbrk(2) 和 brk(2) 的手册页。但它确实这样说:“符合 4.3BSD;SUSv1,在 SUSv2 中标记为 LEGACY,在 POSIX.1-2001 中删除。”所以不确定。我昨天才开始考虑调用比 malloc() 级别更低的东西,如果我发现 sbrk/brk 没有被使用,我会尝试在这里发帖。
-
嗯,它还说:避免使用 brk() 和 sbrk():malloc(3) 内存分配包是一种可移植且舒适的内存分配方式。各种系统对 sbrk() 的参数使用各种类型。常见的有int、ssize_t、ptrdiff_t、intptr_t。
标签: memory-management assembly