当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]在了解了Linux的常见命令之后,下面详细讲解Linux的启动过程。Linux的启动过程包含了Linux工作原理的精髓,而且在嵌入式开发过程中非常需要这方面的知识。

2.2Linux启动过程详解

在了解了Linux的常见命令之后,下面详细讲解Linux的启动过程。Linux的启动过程包含了Linux工作原理的精髓,而且在嵌入式开发过程中非常需要这方面的知识。

2.2.1概述

用户开机启动Linux过程如下:

(1)当用户打开PC(intelCPU)的电源时,CPU将自动进入实模式,并从地址0xFFFF0000开始自动执行程序代码,这个地址通常是ROM-BIOS中的地址。这时BIOS进行开机自检,并按BIOS中设置的启动设备(通常是硬盘)进行启动,接着启动设备上安装的引导程序lilo或grub开始引导Linux(也就是启动设备的第一个扇区),这时,Linux才获得了启动权。

(2)第二阶段,Linux首先进行内核的引导,主要完成磁盘引导、读取机器系统数据、实模式和保护模式的切换、加载数据段寄存器以及重置中断描述符表等。

(3)第三阶段执行init程序(也就是系统初始化工作),init程序调用了rc.sysinit和rc等程序,而rc.sysinit和rc在完成系统初始化和运行服务的任务后,返回init。

(4)第四阶段,init启动mingetty,打开终端供用户登录系统,用户登录成功后进入了shell,这样就完成了从开机到登录的整个启动过程。

Linux启动总体流程如图2.2所示,其中的4个阶段分别由同步棒隔开。第一阶段不涉及Linux自身的启动过程,下面分别对第二和第三阶段进行详细讲解。

图2.2Linux启动总体流程图

2.2.2内核引导阶段

在grub或lilo等引导程序成功完成引导Linux系统的任务后,Linux就从它们手中接管了CPU的控制权。用户可以从www.kernel.org上下载最新版本的源码进行阅读,其目录为:linux-2.6.*.*/arch/i386/boot。在启动过程中主要用到该目录下的几个文件:bootsect.S、setup.S以及compressed子目录下的head.S等。

Linux的内核通常是压缩过的,包括上述提到的那几个重要的汇编程序,它们都是在压缩内核vmlinuz中的。Linux中提供的内核包含了众多驱动和功能,容量较大,压缩内核可以节省大量的空间,压缩的内核在启动时可以对自身进行解包。

(1)bootsect阶段

当grub读入vmlinuz后,会根据bootsect(512字节)把它自身和setup程序段读到以不大于0x90000开始的的内存里(注意:在以往的引导协议里是放在0x90000,但现在有所变化),然后grub会跳过bootsect那512字节的程序段,直接运行setup里的第一跳指令。就是说bzImage里bootsect的程序没有再被执行了,而bootsect.S在完成了指令搬移以后就退出了。之后执行权就转到了setup.S的程序中。

(2)setup阶段。

setup.S的主要功能是利用ROMBIOS中断读取机器系统数据,并将系统参数(包括内存、磁盘等)保存到以0x90000~0x901FF开始的内存中。

此外,setup.S还将video.S中的代码包含进来,检测和设置显示器和显示模式。

最后,它还会设置CPU的控制寄存器CR0(也称机器状态字),从而进入32位保护模式运行,并跳转到绝对地址为0x100000(虚拟地址0xC0000000+0x100000)的位置。当CPU跳到0x100000时,将执行“arch/i386/kernel/head.S”中的startup_32。

(3)head.S阶段。

当运行到head.S时,系统已经运行在保护模式,而head.S完成的一个重要任务就是将内核解压。内核是通过压缩的方式放在内存中的,head.S通过调用misc.c中定义的decompress_kernel()函数,将内核vmlinuz解压到0x100000。

接下来head.S程序完成寄存器、分页表的初始化工作,但要注意的是,这个head.S程序与完成解压缩工作的head.S程序是不同的,它在源代码中的位置是arch/i386/kernel/head.S。

在完成了初始化之后,head.S就跳转到start_kernel()函数中去了。

(4)main.c阶段。

start_kernel()是“init/main.c”中定义的函数,start_kernel()调用了一系列初始化函数,进行内核的初始化工作。要注意的是,在初始化之前系统中断仍然是被屏蔽的,另外内核也处于被锁定状态,以保证只有一个CPU用于Linux系统的启动。

在start_kernel()的最后,调用了init()函数,也就是下面要讲述的init阶段。

2.2.3init阶段

在加载了内核之后,由内核执行引导的第一个进程是init进程,该进程号始终是“1”。init进程根据其配置文件“/etc/inittab”主要完成系统的一系列初始化的任务。由于该配置文件是init进程执行的惟一依据,因此先对它的格式进行统一讲解。

inittab文件中除了注释行外,每一行都有如下格式:

id:runlevels:action:process

(1)id。

id是配置记录标识符,由1~4个字符组成,对于getty或mingetty等其他login程序项,要求id与tty的编号相同,否则getty程序将不能正常工作。

(2)runlevels。

runlevels是运行级别记录符,一般使用0~6以及S和s。其中,0、1、6运行级别为系统保留:0作为shutdown动作,1作为重启至单用户模式,6为重启;S和s意义相同,表示单用户模式,且无需inittab文件,因此也不在inittab中出现。7~9级别也是可以使用的,传统的UNIX系统没有定义这几个级别。

runlevel可以是并列的多个值,对大多数action来说,仅当runlevel与当前运行级别匹配成功才会执行。

(3)action。

action字段用于描述系统执行的特定操作,它的常见设置有:initdefault、sysinit、boot、bootwait、respawn等。

initdefault用于标识系统缺省的启动级别。当init由内核激活以后,它将读取inittab中的initdefault项,取得其中的runlevel,并作为当前的运行级别。如果没有inittab文件,或者其中没有initdefault项,init将在控制台上请求输入runlevel。

sysinit、boot、bootwait等action将在系统启动时无条件运行,忽略其中的runlevel。

respawn字段表示该类进程在结束后会重新启动运行。

(4)process。

process字段设置启动进程所执行的命令。

以下结合笔者系统中的inittab配置文件详细讲解该配置文件完成的功能。

1.确定用户登录模式

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

#Defaultrunlevel.TherunlevelsusedbyRHSare:

#0-halt(DoNOTsetinitdefaulttothis)

#1-Singleusermode

#2-Multiuser,withoutNFS(Thesameas3,ifyoudonothavenetworking)

#3-Fullmultiusermode(文本界面启动模式)

#4-unused

#5-X11(图形界面启动模式)

#6-reboot(DoNOTsetinitdefaulttothis)

#

id:5:initdefault:

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

在确定了登录模式之后,就要开始将Linux的主机信息读入系统,其过程是通过运行“/etc/rc.d/rc.sysinit”脚本而完成的。查看此文件可以看出,在这里确定了默认路径、主机名称、“/etc/sysconfig/network”中所记录的网络信息等。以下是在“/etc/inittab”文件中运行该脚本的部分。

#Systeminitialization.

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

3.加载内核的外挂模块,执行各运行级别的脚本以及进入用户登录界面

在此,主要是读取模块加载配置文件(/etc/modules.conf),以确认需要加载哪些模块。接下来会根据不同的运行级(runlevel),通过带参数(运行级)运行“/etc/rc.d/rc”脚本,加载不同的模块,启动系统服务。init进程会等待(wait)“/etc/rc.d/rc”脚本的返回。系统还需要配置一些异常关机的处理部分,最后通过“/sbin/mingetty”打开几个虚拟终端(tty1~tty6),用于用户登录。如果运行级为5(图形界面启动),则运行xdm程序,给用户提供xdm图形界面的登录方式。如果在本地打开一个虚拟终端,当这个终端超时没有用户登录或者太久没有用户击键时,该终端会退出执行,脚本中的“respawn”即告诉init进程重新打开该终端,否则在经过一段时间之后,我们会发现这个终端消失了,无法利用ALT+Fn切换。

以下是“/etc/inittab”文件中的相应部分。

l0:0:wait:/etc/rc.d/rc0

l1:1:wait:/etc/rc.d/rc1

l2:2:wait:/etc/rc.d/rc2

l3:3:wait:/etc/rc.d/rc3

l4:4:wait:/etc/rc.d/rc4

l5:5:wait:/etc/rc.d/rc5

l6:6:wait:/etc/rc.d/rc6

#TrapCTRL-ALT-DELETE

ca::ctrlaltdel:/sbin/shutdown-t3-rnow

#WhenourUPStellsuspowerhasfailed,assumewehaveafewminutes

#ofpowerleft.Scheduleashutdownfor2minutesfromnow.

#Thisdoes,ofcourse,assumeyouhavepowerdinstalledandyour

#UPSconnectedandworkingcorrectly.

pf::powerfail:/sbin/shutdown-f-h+2"PowerFailure;SystemShuttingDown"

#Ifpowerwasrestoredbeforetheshutdownkickedin,cancelit.

pr:12345:powerokwait:/sbin/shutdown-c"PowerRestored;ShutdownCancelled"

#Rungettysinstandardrunlevels

1:2345:respawn:/sbin/mingettytty1

2:2345:respawn:/sbin/mingettytty2

3:2345:respawn:/sbin/mingettytty3

4:2345:respawn:/sbin/mingettytty4

5:2345:respawn:/sbin/mingettytty5

6:2345:respawn:/sbin/mingettytty6

#Runxdminrunlevel5

x:5:respawn:/etc/X11/prefdm-nodaemon

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

为了满足日益增长的数据处理需求,铁威马NAS推出了全新的性能巅峰2024年旗舰之作F4-424 Pro,并搭载了最新的操作系统--TOS 6。这款高效办公神器的问世,无疑将为企业和专业人士带来前所未有的便捷与效率。

关键字: 存储 Linux 服务器

Windows Embedded Compact 7(简称WinCE)是一种专为嵌入式系统设计的操作系统,具有体积小、效率高、可定制性强的特点。在WinCE中设置自动运行软件,通常是为了满足设备在启动后自动执行特定任务的...

关键字: 嵌入式系统 软件 操作系统

双系统将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对双系统的相关情况以及信息有所认识和了解,详细内容如下。

关键字: 双系统 Windows Linux

今天,小编将在这篇文章中为大家带来Windows 11系统的有关报道,通过阅读这篇文章,大家可以对Windows 11系统具备清晰的认识,主要内容如下。

关键字: Windows 操作系统

全新随插即用方案简化虚拟化实时IIoT平台的设置

关键字: 计算机模块 IIoT 操作系统

目前,HarmonyOS NEXT星河预览版已经正式面向开发者开放申请,面向鸿蒙原生应用及元服务开发者提供的集成开发环境——DevEco Studio也迎来功能更细化的4.1版本。

关键字: HarmonyOS 操作系统

华为P40是一款备受关注的高端智能手机,搭载了华为自研的鸿蒙操作系统。鸿蒙系统作为华为自主研发的操作系统,具有高度的可定制性和扩展性,能够为用户带来全新的使用体验。本文将详细介绍华为P40鸿蒙系统的升级方法,帮助用户更好...

关键字: 华为P40 智能手机 操作系统

安装Linux操作系统并不复杂,下面是一个大致的步骤指南,以帮助您完成安装。1. 下载Linux发行版:首先,您需要从Linux发行版官方网站下载最新的ISO镜像文件。

关键字: Linux 操作系统 ISO镜像

计算机是由一堆硬件组成的,为了有限的控制这些硬件资源,于是就有了操作系统的产生,操作系统是软件子系统的一部分,是硬件基础上的第一层软件。

关键字: Linux 操作系统 计算机

Linux操作系统是一套免费使用和自由传播的类Unix操作系统,通常被称为GNU/Linux。它是由林纳斯·托瓦兹在1991年首次发布的,并基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。Lin...

关键字: Linux 操作系统
关闭
关闭