Linux操作系统启动过程详解
- 格式:doc
- 大小:207.50 KB
- 文档页数:9
Linuxreboot全过程⼀、版本说明嵌⼊式Linux 下⾯的reboot命令看似简单,但出问题时定位起来发现别有洞天。
下⾯就按在shell下执⾏reboot命令之后程序的执⾏过程进⾏解析。
Busybox:1.23.2 ——制作跟⽂件系统,/sbin/reboot程序的由来Libc:2.6.1 ——标准C库Linux kernel:2.6.35 ——内核版本⼆、流程简介如图所⽰是reboot的简要流程图。
普通的reboot是通过busybox为⼊⼝,进⼊halt_main函数,然后给init进程发送SIGTERM信号,init进程接收到信号后给其他进程发送终⽌信号,最后调⽤C库函数reboot,reboot通过系统调⽤sys_reboot进⼊内核,内核将整个系统重启。
其中在shell中执⾏reboot –f则通过halt_main直接调⽤C函数reboot,不经过init进程。
三、代码详解1.reboot命令端执⾏reboot命令,busybox检查当前命令为reboot,进⼊函数halt_main,reboot,halt和poweroff都会进⼊这个函数,不同的命令发送的信号和执⾏的操作不同。
现只分析reboot的情况。
代码如下1.int halt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;2.int halt_main(int argc UNUSED_PARAM, char **argv)3.{4.static const int magic[] = {RB_HALT_SYSTEM,6.RB_POWER_OFF,7.RB_AUTOBOOT8.};9.static const smallint signals[] = { SIGUSR1, SIGUSR2, SIGTERM };10.11.int delay = 0;12.int which, flags, rc;13.14./* Figure out which applet we're running */15.for (which = 0; "hpr"[which] != applet_name[0]; which++)16.continue;17.18./* Parse and handle arguments */19.opt_complementary = "d+"; /* -d N */20./* We support -w even if !ENABLE_FEATURE_WTMP,21.* in order to not break scripts.22.* -i (shut down network interfaces) is ignored.23.*/24.flags = getopt32(argv, "d:nfwi", &delay);25.26.sleep(delay);27.28.write_wtmp();29.30.if (flags & 8) /* -w */31.return EXIT_SUCCESS;32.33.if (!(flags & 2)) /* no -n */34.sync();35.36./* Perform action. */37.rc = 1;38.if (!(flags & 4)) { /* no -f *///TODO: I tend to think that signalling linuxrc is wrong 40.// pity original author didn't comment on it...41.if (ENABLE_FEATURE_INITRD) {42./* talk to linuxrc */43./* bbox init/linuxrc assumed */44.pid_t *pidlist = find_pid_by_name("linuxrc");45.if (pidlist[0] > 0)46.rc = kill(pidlist[0], signals[which]);47.if (ENABLE_FEATURE_CLEAN_UP)48.free(pidlist);49.}50.if (rc) {51./* talk to init */52.if (!ENABLE_FEATURE_CALL_TELINIT) {53./* bbox init assumed */54.rc = kill(1, signals[which]);55.} else {56./* SysV style init assumed */57./* runlevels:58.* 0 == shutdown59.* 6 == reboot */60.execlp(CONFIG_TELINIT_PATH,61.CONFIG_TELINIT_PATH,62.which == 2 ? "6" : "0",63.(char *)NULL64.);65.bb_perror_msg_and_die("can't execute '%s'",66.CONFIG_TELINIT_PATH);67.}68.}69.} else {70.rc = reboot(magic[which]);71.}72.if (rc)74.bb_perror_nomsg_and_die();75.return rc;76.}该函数判断reboot是否带了 -f 参数,如果带了,直接调⽤reboot调⽤C函数库如果没带,则通过kill(1, signals[which]);给init进程发送SIGTERM信号。
嵌入式linux系统的启动流程
嵌入式Linux系统的启动流程一般包括以下几个步骤:
1.硬件初始化:首先会对硬件进行初始化,例如设置时钟、中
断控制等。
这一步骤通常是由硬件自身进行初始化,也受到系统的BIOS或Bootloader的控制。
2.Bootloader引导:接下来,系统会从存储介质(如闪存、SD
卡等)的Bootloader区域读取引导程序。
Bootloader是一段程序,可以从存储介质中加载内核镜像和根文件系统,它负责进行硬件初始化、进行引导选项的选择,以及加载内核到内存中。
3.Linux内核加载:Bootloader会将内核镜像从存储介质中加载到系统内存中。
内核镜像是包含操作系统核心的一个二进制文件,它由开发者编译并与设备硬件特定的驱动程序进行连接。
4.内核初始化:一旦内核被加载到内存中,系统会进入内核初
始化阶段。
在这个阶段,内核会初始化设备驱动程序、文件系统、网络协议栈等系统核心。
5.启动用户空间:在内核初始化完毕后,系统将启动第一个用
户空间进程(init进程)。
init进程会读取并解析配置文件(如
/etc/inittab)来决定如何启动其他系统服务和应用程序。
6.启动其他系统服务和应用程序:在用户空间启动后,init进
程会根据配置文件启动其他系统服务和应用程序。
这些服务和应用程序通常运行在用户空间,提供各种功能和服务。
以上是嵌入式Linux系统的基本启动流程,不同的嵌入式系统可能会有一些差异。
同时,一些特定的系统也可以添加其他的启动流程步骤,如初始化设备树、加载设备固件文件等。
arm版本linux系统的启动流程ARM架构是一种常见的处理器架构,被广泛应用于嵌入式设备和移动设备中。
在ARM版本的Linux系统中,启动流程是非常重要的,它决定了系统如何从开机到正常运行。
本文将详细介绍ARM版本Linux系统的启动流程。
一、引导加载程序(Bootloader)引导加载程序是系统启动的第一阶段,它位于系统的固化存储器中,比如ROM或Flash。
在ARM版本的Linux系统中,常用的引导加载程序有U-Boot和GRUB等。
引导加载程序的主要功能是加载内核镜像到内存中,并将控制权转交给内核。
二、内核初始化引导加载程序将内核镜像加载到内存后,控制权被转交给内核。
内核初始化是系统启动的第二阶段,它主要完成以下几个步骤:1. 设置异常向量表:ARM架构中,异常是指硬件产生的中断或故障,比如系统调用、中断请求等。
内核需要设置异常向量表,以便正确处理异常。
2. 初始化处理器:内核对处理器进行初始化,包括设置页表、启用缓存、初始化中断控制器等。
3. 启动第一个进程:内核创建第一个用户进程(一般是init进程),并将控制权转交给它。
init进程是系统中所有其他进程的父进程,负责系统的初始化工作。
三、设备树(Device Tree)设备树是ARM版本Linux系统中的一种机制,用于描述硬件设备的相关信息。
在内核初始化过程中,内核会解析设备树,并建立设备树对象,以便后续的设备驱动程序使用。
设备树描述了硬件设备的类型、地址、中断等信息,以及设备之间的连接关系。
它使得内核能够在运行时自动识别和配置硬件设备,大大提高了系统的可移植性和灵活性。
四、启动初始化(Init)启动初始化是系统启动的第三阶段,它是用户空间的第一个进程(init进程)接管系统控制权后的操作。
启动初始化主要完成以下几个任务:1. 挂载根文件系统:启动初始化会挂载根文件系统,使得用户可以访问文件系统中的文件和目录。
2. 加载系统服务:启动初始化会加载并启动系统服务,比如网络服务、日志服务、时间同步服务等。
linux操作系统(第二版)课后习题答案Linux操作系统(第二版)课后习题答案在学习Linux操作系统的过程中,课后习题是非常重要的一部分。
通过做课后习题,我们可以更好地巩固所学的知识,加深对Linux操作系统的理解。
下面我将为大家总结一些常见的课后习题答案,希望对大家的学习有所帮助。
1. 什么是Linux操作系统?它有哪些特点?答:Linux操作系统是一种开源的Unix-like操作系统,具有多用户、多任务和多线程的特点。
它具有稳定性高、安全性好、性能优越等特点。
2. 请简要介绍Linux文件系统的组成结构。
答:Linux文件系统的组成结构包括根目录、用户目录、系统目录、设备文件、普通文件等。
其中根目录是整个文件系统的起点,用户目录是每个用户的个人目录,系统目录包括系统文件和程序文件,设备文件用于访问设备,普通文件包括文本文件、二进制文件等。
3. 请简要介绍Linux系统的启动过程。
答:Linux系统的启动过程包括硬件初始化、引导加载程序启动、内核初始化、用户空间初始化等步骤。
其中硬件初始化是指计算机硬件的自检和初始化,引导加载程序启动是指引导加载程序加载内核,内核初始化是指内核加载并初始化各种设备和服务,用户空间初始化是指启动系统的用户空间进程。
4. 请简要介绍Linux系统的文件权限管理。
答:Linux系统的文件权限管理包括文件所有者、文件所属组、文件权限等。
文件所有者是指文件的所有者,文件所属组是指文件所属的组,文件权限包括读、写、执行权限等。
5. 请简要介绍Linux系统的进程管理。
答:Linux系统的进程管理包括进程的创建、销毁、调度等。
进程的创建是指创建新的进程,进程的销毁是指销毁已有的进程,进程的调度是指对进程进行调度和管理。
通过以上课后习题的答案总结,我们可以更好地了解Linux操作系统的基本知识和常见操作。
希望大家在学习过程中多做课后习题,加深对Linux操作系统的理解,提高自己的操作技能。
Linux操作系统的配置流程和步骤如下:1. 打开终端,输入命令cd /opt,使用tar命令解压文件(tar -zxvf VMwareTools-10.0.0-2977863.tar.gz)。
2. 进入解压的目录(cd vmware-tools-distrib),安装vmware-install.pl文件(./vmware-install.pl)。
执行命令之后,一系列设置全部回车即可(安装需要一定的时间)。
3. 创建共享文件目录,比如在虚拟机中创建一个名为myshare 的文件夹。
右键虚拟机,点击设置:选择选项:点击添加:点击下一步,选择目标文件目录。
点击下一步:点击完成。
4. 在windows系统中的myshare目录下面创建文件hello.txt,并在文件里面输入hello。
5. 设置CPU和内存,CPU设置不能超过真机的一半,内存设置不要超过真机内存的一半1G-2G即可。
6. 设置网络类型,选择桥接。
7. 设置IO控制器和磁盘类型,选择默认推荐。
8. 创建虚拟机磁盘,设置磁盘大小,默认20G够用。
9. 点击CD/DVD,以ISO映像文件安装,点击浏览,选择系统镜像文件,点击确定。
10. 开启此虚拟机。
11. 点击第一行install,进行系统安装。
12. 选择语言,中文,完成后继续。
13. 软件选择带GUI的服务器。
14. KDUMP不启用。
15. 进入安装目标位置,下拉,选择我要配置分区,点击完成。
16. 进入磁盘分区界面,点击+号开始分区。
以上是Linux操作系统的配置流程和步骤,希望对解决您的问题有所帮助。
Linux系统引导过程及排除启动故障⼀、Linux操作系统引导过程⼆、系统初始化进程1、init进程2、Systemd3、Systemd单元类型三、排除启动类故障【1】、修复MBR扇区故障(含实验过程)【2】、修复GRUB引导故障●⽅法⼆:进⼊急救模式,恢复GRUB引导程序(与MBR 引导扇区类似)●⽅法三:引导界⾯进⼊急救模式,重建GRUB菜单配置⽂件⽅案三实验四、遗忘root⽤户的密码实验过程⼀、Linux操作系统引导过程1.开机⾃检服务器主机开机以后,将根据主板BIOS中的设置对CPU、内存、显卡、键盘等设备进⾏初步检测,检测成功后根据预设的启动顺序移交系统控制权,⼤多时候会移交给本机硬盘。
总结:检测出第⼀个能够引导系统的设备,⽐如硬盘或者光驱2.MBR 引导当从本机硬盘中启动系统时,⾸先根据硬盘第⼀个扇区中MBR(主引导记录)的设置,将系统控制权传递给包含操作系统引导⽂件的分区;或者直接根据MBR 记录中的引导信息调⽤启动菜单(如 GRUB)。
总结:运⾏放在MBR扇区⾥的启动GRUB引导程序3.GRUB 菜单对于Linux操作系统来说,GRUB(统⼀启动加载器)是使⽤最为⼴泛的多系统引导器程序。
系统控制权传递给GRUB以后,将会显⽰启动菜单给⽤户选择,并根据所选项(或采⽤默认值)加载Linux内核⽂件,然后将系统控制权转交给内核。
CentOS 7 采⽤的是 GRUB2 启动引导器。
总结:GRUB引导程序通过读取GRUB配置⽂件/boot/grub2/grub.cfg,来获取内核和镜像⽂件系统的设置和路径位置4.加载 Linux 内核Linux内核是⼀个预先编译好的特殊⼆进制⽂件,介于各种硬件资源与系统程序之间,负责资源分配与调度。
内核接过系统控制权以后,将完全掌控整个Linux操作系统的运⾏过程。
CentOS 7系统中,默认的内核⽂件位于“/boot/vmlinuz-3.10.0-514.el7.x86_64”。
Slackware Linux操作系统启动过程详解Joe Brockme IE r 研究了Slackware Linux init 进程。
他讨论了系统如何初始化服务、各种运行级别是什么,以及如何从缺省安装中添加或除去服务来定制系统。
我们的示例使用x86 平台上的Slackware Linux 发行版(请参阅本文后面的参考资料)。
大多数信息可用于其它Linux 发行版,但在细节处会略有不同。
尤其是,与其说Slackware 的init 结构类似于System V 结构,还不如说它更类似于BSD Unix结构,尽管Slackware 的最新发行版中的程序做了一些让步,它们要将服务添加到启动,但期望这些服务是System V 目录结构。
(请参阅侧栏,“BSD 和系统V init 脚本之间的差异”。
)所有进程的父代当Linux 机器引导时,究竟会发生什么?在计算机的BIOS 完成其任务后,系统会读取硬盘(或软盘,或CD-ROM,或Zip 驱动器……Linux 是非常灵活的)的第一位,并会遇到引导装入程序。
虽然GRUB 和其它装入程序也逐渐变得流行,但通常这就是Linux 装入程序(LInux LOader),一般称作LILO。
然后LILO 将Linux 内核装入内存,并开始展示它的魔力。
Linux 内核初始化了诸如SCSI 卡之类的设备,以及其它内核中内置的硬件设备。
然后内核运行init,它是除内核之外在系统运行的第一个进程。
如果执行ps ax | grep 1 ,就会看到init 的进程ID (PID) 是1。
装入init 之后,它会读取inittab 以查看下一步做什么。
inittab 告诉init 要进入什么运行级别,以及在哪里可以找到该运行级别的配置文件。
运行级别运行级别是由系统上的所有服务在某个给定时间定义的(基本上是操作方式)。
Linux 可以有几种操作方式:单用户方式、单用户联网方式、多用户方式、始于X 窗口的多用户方式,等等。
Linux操作系统启动过程详解TUNA 发表于2012-09-12分类: IT运维376 次阅读4 条评论如果你对Linux操作系统有一定的了解,想对其更深层次的东西做进一步探究。
这当中就包括系统的启动流程、文件系统的组成结构、基于动态库和静态库的程序在执行时的异同、协议栈的架构和原理、驱动程序的机制等等。
其中Linux操作系统启动过程肯定是大家最有兴趣了解的,这里在综合了现有网上大家智慧的基础上,基于2.6.32的内核的CentOS 6.0系统,对Linux的启动流程做了些分析,希望对大家有所帮助。
OK,我们言归正传。
对于一台安装了Linux系统的主机来说,当用户按下开机按钮时,一共要经历以下几个过程,如图:其中,每个过程都执行了自己该做的初始化部分的事情,有些过程又可分为好几个子过程。
接下来,我们就对每个阶段做一个详细分析和讲解。
一、BIOS自检稍有计算机基础的人都应该听过BIOS(Basic Input / Output System),又称基本输入输出系统,可以视为是一个永久地记录在ROM中的一个软件,是操作系统输入输出管理系统的一部分。
早期的BIOS芯片确实是”只读”的,里面的内容是用一种烧录器写入的,一旦写入就不能更改,除非更换芯片。
现在的主机板都使用一种叫Flash EPROM的芯片来存储系统BIOS,里面的内容可通过使用主板厂商提供的擦写程序擦除后重新写入,这样就给用户升级BIOS提供了极大的方便。
BIOS的功能由两部分组成,分别是POST码和Runtime服务。
POST阶段完成后它将从存储器中被清除,而Runtime服务会被一直保留,用于目标操作系统的启动。
BIOS两个阶段所做的详细工作如下:步骤1:上电自检POST(Power-on self test),主要负责检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)是否正常。
例如,最常见的是内存松动的情况,BIOS自检阶段会报错,系统就无法启动起来;步骤2:步骤1成功后,便会执行一段小程序用来枚举本地设备并对其初始化。
这一步主要是根据我们在BIOS中设置的系统启动顺序来搜索用于启动系统的驱动器,如硬盘、光盘、U盘、软盘和网络等。
我们以硬盘启动为例,BIOS此时去读取硬盘驱动器的第一个扇区(MBR,512字节),然后执行里面的代码。
实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行。
至此,BIOS的任务就完成了,此后将系统启动的控制权移交到MBR部分的代码。
PS: 在个人电脑中,Linux的启动是从0xFFFF0地址开始的。
二、系统引导我们首先来了解一下MBR,它是Master Boot Record的缩写。
硬盘的0柱面、0磁头、1扇区称为主引导扇区。
它由三个部分组成,主引导程序(Bootloader)、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA),其结构图如下所示:磁盘分区表包含以下三部分:1. Partition ID (5:延申82:Swap 83:Linux 8e:LVM fd:RAID)2. Partition起始磁柱3. Partition的磁柱数量通常情况下,诸如lilo、grub这些常见的引导程序都直接安装在MBR中。
我们以grub为例来分析这个引导过程。
grub引导也分为两个阶段stage1阶段和stage2阶段(有些较新的grub又定义了stage1.5阶段)。
1. stage1:stage1是直接被写入到MBR中去的,这样机器一启动检测完硬件后,就将控制权交给了GRUB的代码。
也就是上图所看到的前446个字节空间中存放的是stage1的代码。
BIOS将stage1载入内存中0x7c00处并跳转执行。
stage1(/stage1/start.S)的任务非常单纯,仅仅是将硬盘0头0道2扇区读入内存。
而0头0道2扇区内容是源代码中的/stage2/start.S,编译后512字节,它是stage2或者stage1_5的入口。
而此时,stage1是没有识别文件系统的能力的。
如果感觉脑子有些晕了,那么下面的过程就直接跳过,去看stage2吧!【外传】定位硬盘的0头0道2扇区的过程:BIOS将stage1载入内存0x7c00处并执行,然后调用BIOS INIT13中断,将硬盘0头0道2扇区内容载入内存0×7000处,然后调用copy_buffer将其转移到内存0×8000处。
在定位0头0道2扇区时通常有两种寻址方式:LBA和CHS。
如果你是刨根问底儿型的爱好者,那么此时去找谷哥打听打听这两种方式的来龙去脉吧。
2. stage2:严格来说这里还应该再区分个stage1.5的,就一并把stage1.5放在这里一起介绍了,免得大家看得心里乱哄哄的。
好的,我们继续说0头0到2扇区的/stage2/start.S文件,当它的内容被读入到内存之后,它的主要作用就是负责将stage2或stage1.5从硬盘读到内存中。
如果是stage2,它将被载入到0×820处;如果是stage1.5,它将被载入到0×2200处。
这里的stage2或者stage1_5不是/boot分区/boot/grub目录下的文件,因为这个时候grub还没有能力识别任何文件系统。
Ø如果start.S加载stage1.5:stage1.5它存放在硬盘0头0道3扇区向后的位置,stage1_5作为stage1和stage2中间的桥梁,stage1_5有识别文件系统的能力,此后grub才有能力去访问/boot分区/boot/grub目录下的stage2文件,将stage2载入内存并执行。
Ø如果start.S加载stage2:同样,这个stage2也不是/boot分区/boot/grub目录下的stage2,这个时候start.S读取的是存放在/boot分区Boot Sector的stage2。
这种情况下就有一个限制:因为start.S通过BIOS中断方式直接对硬盘寻址(而非通过访问具体的文件系统),其寻址范围有限,限制在8GB以内。
因此这种情况需要将/boot分区分在硬盘8GB寻址空间之前。
假如是情形2,我们将/boot/grub目录下的内容清空,依然能成功启动grub;假如是情形1,将/boot/grub目录下stage2删除后,则系统启动过程中grub会启动失败。
三、启动内核当stage2被载入内存执行时,它首先会去解析grub的配置文件/boot/grub/grub.conf,然后加载内核镜像到内存中,并将控制权转交给内核。
而内核会立即初始化系统中各设备并做相关的配置工作,其中包括CPU、I/O、存储设备等。
关于Linux的设备驱动程序的加载,有一部分驱动程序直接被编译进内核镜像中,另一部分驱动程序则是以模块的形式放在initrd(ramdisk)中。
Linux内核需要适应多种不同的硬件架构,但是将所有的硬件驱动编入内核又是不实际的,而且内核也不可能每新出一种硬件结构,就将该硬件的设备驱动写入内核。
实际上Linux的内核镜像仅是包含了基本的硬件驱动,在系统安装过程中会检测系统硬件信息,根据安装信息和系统硬件信息将一部分设备驱动写入initrd 。
这样在以后启动系统时,一部分设备驱动就放在initrd中来加载。
这里有必要给大家再多介绍一下initrd这个东东:initrd 的英文含义是bootloader initialized RAM disk,就是由boot loader 初始化的内存盘。
在linu2.6内核启动前,boot loader 会将存储介质中的initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的initrd 文件系统。
在boot loader 配置了initrd 的情况下,内核启动被分成了两个阶段,第一阶段先执行initrd 文件系统中的init,完成加载驱动模块等任务,第二阶段才会执行真正的根文件系统中的/sbin/init 进程。
另外一个概念:initramfsinitramfs 是在kernel 2.5中引入的技术,实际上它的含义就是:在内核镜像中附加一个cpio包,这个cpio包中包含了一个小型的文件系统,当内核启动时,内核将这个cpio包解开,并且将其中包含的文件系统释放到rootfs中,内核中的一部分初始化代码会放到这个文件系统中,作为用户层进程来执行。
这样带来的明显的好处是精简了内核的初始化代码,而且使得内核的初始化过程更容易定制。
疑惑的是:我的内核是2.6.32-71.el6.i686版本,但在我的/boot分区下面却存在的是/boot/initramfs-2.6.32-71.el6.i686.img类型的文件,没搞明白,还望高人解惑。
我只知道在2.6内核中支持两种格式的initrd,一种是2.4内核的文件系统镜像image-initrd,一种是cpio格式。
接下来我们就来探究一下initramfs-2.6.32-71.el6.i686.img里到底放了那些东西。
在tmp文件夹中解压initrd.img里的内容:如果initrd.img文件的格式显示为“initrd.img:ISO 9660 CD-ROM filesystem data”,则可直接输入命令“mount -o loop initrd.img /mnt/test”进行挂载。
通过上的分析和我们的验证,我们确实得到了这样的结论:grub的stage2将initrd加载到内存里,让后将其中的内容释放到内容中,内核便去执行initrd中的init脚本,这时内核将控制权交给了init文件处理。
我们简单浏览一下init脚本的内容,发现它也主要是加载各种存储介质相关的设备驱动程序。
当所需的驱动程序加载完后,会创建一个根设备,然后将根文件系统rootfs 以只读的方式挂载。
这一步结束后,释放未使用的内存,转换到真正的根文件系统上面去,同时运行/sbin/init程序,执行系统的1号进程。
此后系统的控制权就全权交给/sbin/init进程了。
四、初始化系统经过千辛万苦的跋涉,我们终于接近黎明的曙光了。
接下来就是最后一步了:初始化系统。
/sbin/init进程是系统其他所有进程的父进程,当它接管了系统的控制权先之后,它首先会去读取/etc/inittab文件来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设置网络等。
主要包括以下工作:1. 执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统算是基本运行起来了,后面需要进行运行级别的确定及相应服务的启动。