最终我只想弄清楚如何从程序集内动态分配堆内存。
如果我从汇编代码中调用Linux sbrk(),我可以使用返回的地址,因为我会使用静态地址(即在我的程序列表的.data部分中)声明的内存块吗?
我知道Linux使用硬件MMU(如果存在),所以我不确定sbrk返回的是指向真实RAM的“原始”指针,还是它是指向RAM的指针,可以由Linux的VM系统修改? / p>
我读到了这个:How are sbrk/brk implemented in Linux?。我怀疑我不能无需担心sbrk()的返回值:访问非分配地址的MMU故障必须导致VM改变被寻址的RAM中的实际位置。因此,没有与libc或者你有什么联系的assy,不会知道地址已经改变了。
这有意义,还是我出去吃午饭?
答案 0 :(得分:1)
Unix用户进程存在于virtual memory中,无论是用Fortran汇编编写的,都不应该关心物理地址。这是内核的业务 - 内核设置和管理MMU。你不必担心它。 Page faults会自动且透明地处理。
sbrk(2)
会返回特定于该流程的虚拟地址,如果这就是您所要求的。