内核是从哪里开始执行的呢?
几乎任何一本Linux内核源代码分析的书都会给出详细的答案。
不过,我试图从一个不同的角度(一个初学者的角度)来叙述,而不是一上来就给出答案。从熟悉的事物入手,慢慢接近陌生的事物,这是比较常见的思路。既然都是二进制代码,那么不妨从最简单的用户态C程序,hello world开始。说不定能找到共同点。恰好我是一个喜欢寻根究底的人。也许,理解了hello world程序的启动过程,有助于更好地理解内核的启动。
好,开始寻根究底吧。从普通的C语言用户态程序开始写。先写一个简单的hello world程序。
/*helloworld.c*/
#include <stdio.h>int main()
{
printf("hello world\n");
return 0;
}
然后gcc helloworld.c -o helloworld,一个最简单的hello world程序出现了。它是从哪里开始执行的呢?这还不简单?main函数么。地球人都知道。
为什么一定要从main函数开始呢?于是,我开始琢磨这个hello world程序。file helloworld可知,它是一个elf可执行文件。反汇编试试。
objdump -d helloworld
反汇编的结果令人吃惊,因为出现了_start()等一堆函数。一定是gcc编译时默认链接了一些库函数。
其实,只要运行