Memory management 关于assy和堆的一些新问题

Memory management 关于assy和堆的一些新问题,memory-management,assembly,Memory Management,Assembly,最终,我只是想弄清楚如何从程序集中动态分配堆内存 如果我从汇编代码调用LinuxSBRK(),我是否可以像使用静态(即程序清单的.data部分)声明的内存块地址一样使用返回的地址 我知道Linux使用硬件MMU(如果有的话),所以我不确定sbrk返回的是指向真实RAM的“原始”指针,还是指向可能被Linux的VM系统修改的RAM的熟指针 我读到这个:。我怀疑我不能毫无顾虑地使用sbrk()的返回值:访问未分配地址时的MMU故障必须导致VM改变正在寻址的RAM中的实际位置。因此,assy,没有链接

最终,我只是想弄清楚如何从程序集中动态分配堆内存

如果我从汇编代码调用LinuxSBRK(),我是否可以像使用静态(即程序清单的.data部分)声明的内存块地址一样使用返回的地址

我知道Linux使用硬件MMU(如果有的话),所以我不确定sbrk返回的是指向真实RAM的“原始”指针,还是指向可能被Linux的VM系统修改的RAM的熟指针

我读到这个:。我怀疑我不能毫无顾虑地使用sbrk()的返回值:访问未分配地址时的MMU故障必须导致VM改变正在寻址的RAM中的实际位置。因此,assy,没有链接到libc或您拥有的东西,将不知道地址已更改


这有意义吗,还是我出去吃午饭了?

Unix用户进程存在,不管是用Fortran汇编语言编写的,都不应该关心物理地址。这就是内核的业务-内核设置和管理MMU。你不必担心。可以自动、透明地处理


返回特定于进程的虚拟地址(如果这是您所要求的)。

是否仍然存在真正的sbrk系统调用?我认为它早就被弃用了(赞成mmap)。例如,FreeBSD已经没有了。可能是linux的风格是针对x86的。x86Linux(OpenSUSE11.3)仍然有一个sbrk(2)和brk(2)的手册页。但它确实这样说:“符合4.3BSD;SUSv1,在SUSv2中标记为遗留,在POSIX.1-2001中删除。”所以不确定。我昨天才开始考虑调用比malloc()低级别的东西,如果我发现没有使用sbrk/brk,我会尝试发回这里。嗯,它还说:避免使用brk()和sbrk():malloc(3)内存分配包是一种可移植的、舒适的内存分配方式。不同的系统对sbrk()的参数使用不同的类型。常见的有int、ssize、ptrdiff、intptr。