当涉及进程的内存布局时,进程内的所有函数调用都会将新的堆栈帧放入堆栈中。
我不确定这对于main
函数来说是否正确,因为它似乎main
比作为入口点函数做更多的事情。
main
在新进程初始化时,函数是否也会获得自己的堆栈帧?
如果这是特定于实现的细节,那么对典型 Linux 实现的解释将会很有用。
答案1
通常_start
是入口点而不是主要点。
main
只是另一个子例程,它由 调用_start
。它在堆栈上获得一个堆栈帧,就像任何其他子例程一样。
然而内核并没有像你想象的那样做那么多。在main之前运行的进程中有一些代码(它_start
是由C编译器生成的,但不是C程序的一部分),做了很多事情。甚至还有之前运行的代码exec
(在 C 程序运行之前),例如设置stdin
、stdout
和stderr
。
内核可能会用一些技巧_start
,它不能像其他子例程一样运行,但它看起来像这样:内核将设置进程,就像_entry
刚刚被调用一样(但事实并非如此)。如果控制权传回_start
thenexit
则被调用。
(我可能掩盖了一些细节,包括_entry
)。