在理解start_kernel做什么之前,我们需要先明确start_kernel是什么。start_kernel是Linux操作系统内核的启动函数,也是整个内核的入口点。当计算机开机时,BIOS会将控制权交给bootloader,接着bootloader会将控制权交给内核的start_kernel函数。因此,可以说start_kernel函数是Linux内核的开始。
在start_kernel函数中,第一步是初始化操作系统各个子系统。这包括内存管理、进程管理、文件系统等各个方面。具体来说,start_kernel会调用相应的初始化函数,例如mm_init初始化内存管理,vfs_caches_init初始化文件系统缓存等等。这些初始化函数会分别设置系统的各项参数和数据结构。
此外,初始化还包括硬件设备的初始化,如CPU、中断、时钟等设备。初始化完成后,系统才能正式运行。
在初始化系统后,start_kernel会加载内核模块。内核模块是一种动态加载的代码,可以在系统运行时加入和卸载。内核模块可以扩展内核的功能,为内核添加新的驱动程序、文件系统、网络协议等等。通过加载内核模块,可以让内核拥有更多的功能,也方便了开发和维护。
start_kernel会在系统初始化完成后,调用kernel_init函数,再调用do_initcalls函数来执行内核模块的初始化。内核模块的初始化函数可以通过特定的宏定义来注册到系统中。
最后,start_kernel会将控制权转移到用户空间,让用户空间的进程开始运行。具体来说,start_kernel会创建第一个用户态进程init,并将控制权交给init。init进程会进一步初始化系统环境,启动各个服务进程,包括网络服务、日志服务等等。此时,Linux操作系统已经启动完成,可以为用户提供服务了。