查看原文
其他

嵌入式Linux启动过程到底发生了什么?

嵌入式ARM 2021-01-31


内核引导阶段


1、bootsect阶段2、setup阶段3、head.S阶段4、main.c阶段   

init阶段(1) 


1.确定用户登录模式


在“/etc/inittab”中列出了如下所示的登录模式,主要有单人维护模式、多用户无网络模式、文字界面多用户模式、X-Windows多用户模式等。
其中的单人维护模式(runlevel为1)是类似于Windows中的“安全模式”,在这种情况下,系统不加载复杂的模式从而使系统能够正常启动。在这些模式中最为常见的是3或5,其中本系统中默认的为5,也就是X-Windows多用户模式。

#Default runlevel. Therunlevels usedby RHS are:#   0 - halt (Do NOT set initdefault tothis)#   1 - Single user mode#   2 - Multiuser, without NFS (The same as 3,if you do not have networking)#   3 - Full multiuser mode (文本界面启动模式)#   4 - unused#   5 - X11 (图形界面启动模式)#   6 - reboot (Do NOT set initdefault tothis)#id:5:initdefault:

init阶段(2)


2.执行脚本/etc/rc.d/rc.sysinit


在确定了登录模式之后,就要开始将Linux的主机信息读入Linux系统,其内容就是文件“/etc/rc.d/rc.sysinit”中的。查看此文件可以看出,在这里确定了默认路径、主机名称、“/etc/sysconfig/network”中所记录的网络信息等。


#System initialization.

si::sysinit:/etc/rc.d/rc.sysinit

 

init阶段(3)


3.启动内核的外挂模块及各运行级的脚本


在此,主要是读取模块加载配置文件(/etc/modules.conf),以确认需要加载哪些模块。接下来会根据不同的运行级(runlevel),通过带参数(运行级)运行“/etc/rc.d/rc”脚本,加载不同的模块,启动系统服务。init进程会等待(wait)“/etc/rc.d/rc”脚本的返回。

l0:0:wait:/etc/rc.d/rc 0l1:1:wait:/etc/rc.d/rc 1l2:2:wait:/etc/rc.d/rc 2l3:3:wait:/etc/rc.d/rc 3l4:4:wait:/etc/rc.d/rc 4l5:5:wait:/etc/rc.d/rc 5l6:6:wait:/etc/rc.d/rc 6
 

init阶段(4)


4. 进入用户登录界面


系统还需要配置一些异常关机的处理部分。最后通过“/sbin/mingetty”打开几个虚拟终端(tty1~tty6),用于用户登录。如果运行级为5(图形界面启动),则运行xdm程序,给用户提供xdm图形界面的登录方式。如果在本地打开一个虚拟终端,当这个终端超时没有人登录或者太久没有人击键时,该终端会退出执行,脚本中的“respawn”即告诉init进程重新打开该终端,否则在经过一段时间之后,我们会发现这个终端消失了,无法利用ALT+Fn切换。 

init阶段(5)



#Trap CTRL-ALT-DELETEca::ctrlaltdel:/sbin/shutdown-t3 -r now#When our UPS tells us power has failed, assume we have a few minutespf::powerfail:/sbin/shutdown-f -h +2 "Power Failure; System Shutting Down"#If power was restored before the shutdown kicked in, cancel it.pr:12345:powerokwait:/sbin/shutdown-c "Power Restored; Shutdown Cancelled"#Run gettysin standard runlevels1:2345:respawn:/sbin/mingettytty12:2345:respawn:/sbin/mingettytty23:2345:respawn:/sbin/mingettytty34:2345:respawn:/sbin/mingettytty45:2345:respawn:/sbin/mingettytty56:2345:respawn:/sbin/mingettytty6#Run xdmin runlevel5x:5:respawn:/etc/X11/prefdm-nodaemon


程序流程如下: 


-END-


推荐阅读

【01】看到这些代码,我自叹不如……【02】操作系统生态战争【03】C++开发这一步必不可少:C++创建线程的方法【04】感触极深!二十年的编程,教会我的五件事!【05】天下之大无奇不有!20种最奇怪的编程语言!


免责声明:整理文章为传播相关技术,版权归原作者所有,如有侵权,请联系删除

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存