一尘不染

程序寄存器和堆栈在Linux ARM上的初始状态

linux

我目前正在使用Linux上的ARM汇编作为学习练习。我正在使用“裸”程序集,即没有libcrt或libgcc。任何人都可以向我指出有关在调用第一条指令之前在程序开始时堆栈指针和其他寄存器处于什么状态的信息吗?显然,pc
/ r15指向_start,其余似乎已初始化为0,只有两个例外:sp / r13指向我程序之外的地址,而r1指向稍高的地址。

因此,提出了一些可靠的问题:

  • r1中的值是什么?
  • sp中的值是内核分配的合法堆栈吗?
  • 如果不是,那么分配堆栈的首选方法是什么?使用brk或分配一个静态.bss节?

任何指针将不胜感激。


阅读 204

收藏
2020-06-07

共1个答案

一尘不染

这是使我的编译器启动Linux / ARM程序的方法:

/** The initial entry point.
 */
asm(
"       .text\n"
"       .globl  _start\n"
"       .align  2\n"
"_start:\n"
"       sub     lr, lr, lr\n"           // Clear the link register.
"       ldr     r0, [sp]\n"             // Get argc...
"       add     r1, sp, #4\n"           // ... and argv ...
"       add     r2, r1, r0, LSL #2\n"   // ... and compute environ.
"       bl      _estart\n"              // Let's go!
"       b       .\n"                    // Never gets here.
"       .size   _start, .-_start\n"
);

如您所见,我只是从[sp]的堆栈中获取了argc,argv和环境材料。

一些澄清:堆栈指针指向进程内存中的有效区域。r0,r1,r2和r3是被调用函数的前三个参数。我分别用argc,argv和environ填充它们。

2020-06-07