从start_kernel函数开始,内核即进入了C语言部分,它完成了内核的大部分初始化工作。实际上,可以将start_kernel函数看做内核的main函数。
在start_kernel函数的最后调用了rest_init函数进行后续的初始化。
(1)rest_init中调用kernel_thread函数启动了2个内核线程,分别是:kernel_init和kthreadd
(2)调用schedule函数开启了内核的调度系统,从此linux系统开始转起来了。
rest_init最终调用cpu_idle函数结束了整个内核的启动。
kernel_init函数将完成设备驱动程序的初始化,并调用init_post函数启动用户空间的init进程。
到init_post函数为止,内核的初始化哪码饥已经进入尾声,第一个用户空间进程init将姗姗来迟
如果内核命令行中给出了到init进程的直接路径(或者别的可替代的程序),这里就李返试图执行init。
init:开始是内模槐核态,后来转变为用户态】
init进程完成了从内核态向用户态的转变
init进程在内核态下面时,通过一个函数kernel_execve来执行一个用户空间编译连接的应用程序就跳跃到用户态了。
在init/main.c中最后会通过kernel_execve()来调用用户空间的init进程(如/sbin/init, /etc/init, /bin/init等
uboot通过传参来告诉内核这些信息。
uboot传参中的root=/dev/mmcblk0p2 rw 这一句就是告诉内核根文件系统在哪里
uboot传参中的rootfstype=ext3这一句就是告诉内核rootfs的类型。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)