每个程序内部都有一个main.c
。在主函数内部,有一个main
在任何其他函数之前调用的函数。我记得在编译器内部,还有一个指令,它调用在 之前 main
定义的函数。
__attribute__ ((constructor))
大多数程序都是这样工作的。我确信 Linux 内核的情况有所不同。查看文件后main.c
,init/kernel
似乎没有函数main
。
函数通过指令声明__init
。参见以下示例:
asmlinkage __visible __init __no_sanitize_address __noreturn __no_stack_protector
void start_kernel(void)
main.c
Linux 的启动过程中代码的调用顺序是怎样的?
您正在寻找的术语是“入口点”。
正如您所强调的,在 C程序中,入口点是,
main()
尽管某些编译器可能会提供在其之前运行的代码。例如:是GCC__attribute__
的一个功能,而不是 C 本身。start_kernel
通过 Google 查看,我可以找到对名为(此处)的函数的引用。但是!我看过的文档清楚地表明,这不是要执行的第一个代码点。它只是作为第一个独立于体系结构的代码点。(参考)。
因此看来(从我读过的参考资料来看),真正的入口点可能因架构和可能的启动方法(EFI 存根,...)而异。