Linux开机启动顺序分析
嵌入式linux系统的启动流程
嵌入式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版本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. 加载系统服务:启动初始化会加载并启动系统服务,比如网络服务、日志服务、时间同步服务等。
3、linux系统启动过程分析(下)
例子的解释
上面两个汇编程序采用的语法虽然完全不同, 但功能却都是调用 Linux 内核提供的 sys_write 来显示一个字符串,然后再调用 sys_exit 退出 程序。 Linux系统有效的系统调用列表安装在: /usr/man/man2/unistd.h /usr/include/sys/syscall.h. /usr/include/asm/unistd.h ,可以找到所有系统 调用的定义
操作系统引导流程
0.01版内核,以软盘启动为例:
1 开机 2 BIOS 加电自检 ( Power On Self Test,POST ),内存地址为 0ffff:0000 3 将软盘第一个扇区 (0头0道1扇区, 也就是Boot Sector)读入内存地址 0000:7c00 处。 4 检查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于则转去尝试其他启动 介质, 如果没有其他启动介质则显示"No ROM BASIC" 然后死机。 5 跳转到 0000:7c00 处执行 MBR 中的程序。 6 MBR将自己移动到9000:0000 7 将内核模块从软盘读入到1000:0000 8 将内核模块移动到0000:0000 9 进入保护模式 10 读取COMS信息,设置有关表格,然后调用操作系统初始化程序MAIN.C 1-5完全由BIOS完成,6-10由 BOOT\BOOT.S HEAD.S完成 其中BOOT.S的目标代码就是MBR(主引导记录Master Boot Record)中的程序
计算机加电过程
当机算机的电源键被按下时,同这个键相联的电信号线就会送出 一个电信号给主板,主板将此电信号传给供电系统,供电系统开 始工作,为整个系统供电,并送出一个电信号给BIOS,通知 BIOS 供电系统已经准备完毕。随后BIOS 启动一个程序,进行主 机自检,主机自检的主要工作是确保系统的每一个部分都得到了 电源支持,内存储器、主板上的其它芯片、键盘、鼠标、磁盘控 制器及一些I/O 端口正常可用,此后,自检程序将控制权还给 BIOS。 接下来BIOS 读取BIOS 设置,得到引导驱动器的顺序,然后依次 检查,直到找到可以用来引导的驱动器(或说可以用来引导的磁 盘,包括软盘、硬盘、光盘等),然后调用这个驱动器上磁盘的 引导扇区进行引导。
剖析Linux系统引导流程
MB ManB o cr 主引导扇 区 R( i o t o Re d)
①位置: 道 0面第一扇区。 0 ②产生时间 : 硬盘分区时创建。 ③读取方法 :
一
’
步 : N 8启动 盘启 动 A D B G 回车 WI 9 EU
MOV AX,2 0 01 MOV BX,0 1 0 MOV CX, 1
MOV DX,0 8 I 3 NT 1
回 车
. oE 回 车 G_
一
D2 0 显 示 数 据 B
④主引导扇区内容(1 字节) 52
●主 引导扇 区引导程序 (4 4 6字节 ) ● 分 区 表 数 据 ( " 6字 节 ) 41 ● 分 区 表 标 志 5 A 2字 节 ) 5 A(
重 新 引 导 系 统 。 C U执 行 1H 号 中 断 的初 始 引 导 程 P 9
序 ,以便从 启动 盘 读 取 加 载 操 作 系 统 的 引 导 程 序
B osc.。 初始 引导程序是 按照 C S里 设置 的启 ot t 该 e S MO
动盘启 动顺序查 找相 应盘 的 MB R.如找 到 了引导 程 序, 则将 MB R中的引导程序 读到 内存 0 0 7 0 0 0:C 0处 , 并执行这个 引导程序 再将 内核 代码全 部装人 内存 。 这 里 主要 涉及 与 系统 启 动 有关 的 概 念是 MB R,
维普资讯
研 究 与开 发
数据 数据 数据 数据 6 分区结束 磁道号 : 7 分 区结束 扇区号 : 8 1 :2位本 分 区之 前的扇 区数 - 13 1— 5 3 2 1 :2位本分 区之后 的扇区数
2 第二阶段 : B — L 0 H L — 活动分 区引导 R I
Linux命令行使用技巧如何查看和管理系统进程优先级
Linux命令行使用技巧如何查看和管理系统进程优先级在Linux操作系统中,进程优先级是指操作系统对运行中的进程进行调度和分配资源的重要参数之一。
通过合理地设置进程优先级,能够有效地提高系统的性能和稳定性。
本文将介绍一些Linux命令行使用技巧,帮助你查看和管理系统进程优先级。
一、查看系统进程1. top命令:top命令是Linux下常用的查看系统进程的命令。
通过top命令,你可以实时地查看各个进程的运行情况、进程ID、CPU使用率等信息。
2. ps命令:ps命令也是查看系统进程的常用命令。
通过ps命令,你可以查看当前用户的进程情况、各个进程的状态、进程ID等信息。
二、了解进程优先级在Linux系统中,进程的优先级用一个范围为-20到19的数值表示,其中-20表示最高优先级,19表示最低优先级。
默认情况下,普通用户创建的进程的优先级为0,系统进程的优先级通常较高。
三、修改进程优先级1. renice命令:renice命令用于修改已经运行的进程的优先级。
通过renice命令,你可以提高或降低进程的优先级。
假设你想将进程ID为12345的进程的优先级提高到10,你可以使用以下命令:```renice 10 12345```2. nice命令:nice命令用于在启动进程时指定进程的优先级。
通过nice命令,你可以创建一个具有较高或较低优先级的进程。
假设你想在运行一个新的进程时将其优先级设置为5,你可以使用以下命令:```nice -n 5 command```其中,command表示你要运行的命令或程序。
四、管理系统进程优先级1. taskset命令:taskset命令用于将进程绑定到指定的CPU或CPU 集。
通过taskset命令,你可以管理进程的调度情况。
假设你想将进程ID为12345的进程绑定到CPU 0上,你可以使用以下命令:```taskset -p 0x1 12345```2. chrt命令:chrt命令用于修改进程的调度策略和优先级。
Linux命令行中的系统启动和服务管理
Linux命令行中的系统启动和服务管理在Linux操作系统中,系统启动和服务管理是非常重要的任务。
正确地管理系统启动和服务可以保证系统的稳定性和安全性。
本文将介绍Linux命令行中的系统启动和服务管理的方法和技巧。
一、系统启动1. 启动顺序系统启动的顺序是按照一定的步骤进行的。
首先是UEFI/BIOS进行硬件自检,然后加载引导程序(如GRUB),然后引导程序加载内核,并且初始化系统的第一个进程init。
在init进程中,根据配置文件(如/etc/inittab)来启动其他进程和服务。
2. 系统运行级别Linux系统有不同的运行级别,每个运行级别对应着一组不同的服务。
根据需要,用户可以在运行级别之间切换。
常见的运行级别有:- 运行级别0:关机- 运行级别1:单用户模式(救援模式)- 运行级别2:多用户模式(没有NFS)- 运行级别3:完全的多用户模式- 运行级别4:保留(不常用)- 运行级别5:图形模式- 运行级别6:重启要切换运行级别,可以使用命令`init <运行级别>`或者`telinit <运行级别>`。
3. 查看系统启动日志系统启动过程中的日志信息被记录在/var/log目录下的一些文件中。
要查看启动日志,可以使用命令`dmesg`或者查看相关日志文件(如/var/log/messages)。
二、服务管理1. 查看服务状态要查看当前系统上正在运行的服务,可以使用命令`systemctl list-units`。
该命令将列出所有正在运行的服务及其状态。
2. 启动和停止服务要启动一个服务,可以使用命令`systemctl start <服务名>`。
要停止一个服务,可以使用命令`systemctl stop <服务名>`。
例如,要启动Apache Web服务器,可以使用命令`systemctl start httpd`。
3. 设置服务开机启动要设置一个服务在系统启动时自动启动,可以使用命令`systemctl enable <服务名>`。
grub启动过程
第二阶段:
BIOS通过下面两种方法之一来传递引导记录:
第一, 将控制权传递给initial program loader(IPL),该程序安装在磁盘主引导记录(MBR)中
/boot/grub/stage2 /etc/rc.d/rc<#>.d
/etc/rc.d/init.d/*
stage 1:MBR(512 字节,0头0道1扇区),前446字节存放的是 stage1,后面存放硬盘分区表信息,BIOS将stag1载入内存中0x7c00处并跳转执行。stage1(/stage1/start.S)的任务非常单纯,仅仅是将硬盘0头0道2扇区读入内存。0头0道2扇区内容是源代码中的/stage2/start.S,编译后512字节,它是stage2或者stage1_5的入口。
BIOS启动引导阶段 GRUB启动引导阶段 内核阶段 /init/sysinit阶段
==================================================================================================
读取/boot/grub.conf文件并显示启动菜单;
装载所选的kernel和initrd文件到内存中
第三阶段:内核阶段:
运行内核启动参数;
解压initrd文件并挂载initd文件系统,装载必须的驱动;
start.S的主要功能是将stage2或stage1_5从硬盘载入内存,如果是stage2,则载入0x820处;如果是 stage1_5,则载入0x2200处。
linux_mips启动流程_存储相关
Linux-mips启动流程-存储相关linux内核启动的第一个阶段是从/arch/mips/kernel/head.s文件开始的。
而此处正是内核入口函数kernel_entry(),该函数定义在/arch/mips/kernel/head.s文件里。
kernel_entry()函数是体系结构相关的汇编语言,它首先初始化内核堆栈段,来为创建系统中的第一个进程进行准备,接着用一段循环将内核映像的未初始化数据段(bss段在_edata和_end之间)清零,最后跳转到/arch/mips/kernel/setup.c 中的start_kernel()初始化硬件平台相关的代码。
下面讲述start_kernel() 函数。
在这个函数中跟内存初始化的函数是setup_arch()。
第一部分:以函数调用关系为线索下面是函数之间调用关系的框图:(1):start_kenel()->setup_arch()setup_arch(&command_line);每种体系结构都有自己的setup_arch() 函数,这些是体系结构相关的。
【如何确定编译那个体系结构的setup_arch() 函数呢?主要由linux 源码树顶层Makefile 中ARCH 变量来决定的。
例如:MIPS 体系结构的SUBARCH := mipsARCH ?= $(SUBARCH)】。
void __init setup_arch(char **cmdline_p){cpu_probe();调用函数cpu_probe(),该函数通过MIPS CPU的PRID寄存器来确定CPU类型,从而确定使用的指令集和其他一些CPU参数,如TLB等prom_init();prom_init() 函数是和硬件相关的,做一些低层的初始化,接受引导装载程序传给内核的参数,确定mips_machgroup,mips_machtype 这两个变量,这两个变量分别对应着相应的芯片组合开发板;cpu_report();打印cpu_probe() 函数检测到的CPU 的Processor ID。
Linux命令行中的进程调度和优先级设置技巧
Linux命令行中的进程调度和优先级设置技巧一、引言在Linux系统中,进程调度和优先级设置是提高系统性能和资源管理的重要手段。
通过合理分配进程的CPU时间片和优先级,可以有效提高系统的响应速度和资源利用率。
本文将介绍Linux命令行中的进程调度和优先级设置技巧。
二、进程调度技巧1. 查看进程列表通过使用ps命令,可以查看系统中运行的所有进程及其状态。
例如,输入以下命令:```ps -ef```该命令将列出所有进程的详细信息,包括进程ID、父进程ID、状态等。
2. 杀死进程如果某个进程出现问题或者需要终止运行,可以使用kill命令进行进程终止。
例如,输入以下命令:```kill 进程ID```其中,进程ID为需要终止的进程的标识符。
3. 修改进程优先级在Linux中,可以使用nice命令或renice命令来调整进程的优先级。
优先级范围从-20到19,-20表示最高优先级,19表示最低优先级。
- 使用nice命令nice命令可以在启动新进程时设置其优先级。
例如,输入以下命令:```nice -n 10 command```其中,-n 10表示设置新进程的优先级为10。
- 使用renice命令renice命令可以修改已经运行的进程的优先级。
例如,输入以下命令:```renice 10 进程ID```该命令将进程ID为进程ID的进程的优先级设置为10。
4. 实时进程调度Linux系统支持实时进程调度,可以通过使用chrt命令设置进程为实时进程。
例如,输入以下命令:```chrt -r 99 command```该命令将启动一个实时进程,并将其优先级设置为99。
三、进程优先级设置技巧1. 进程优先级调整原则在进行进程优先级设置时,需要遵循以下原则:- 重要性高的进程应该具有较高的优先级,以确保系统服务的响应速度。
- CPU密集型进程可以设置较低的优先级,以充分利用CPU资源。
- I/O密集型进程可以设置较高的优先级,以提高IO操作的效率。
linux启动顺序讲解
linux启动顺序讲解⼀、简单介绍RHEL开机时的先后顺序BIOS —> MBR —> Kernel —> init1、当电脑⼀打开电源时电脑就会进⼊BIOS(BIOS的⼯作主要是检测⼀些硬件设备);2、检测完后会进⼊MBR也就是boot loader(MBR位于硬盘的第⼀个扇区总共512bytes,其中前446bytes⾥⾯的编码是在选择引导分区也就是决定要由哪个分区来引导);3、载⼊系统的Kernel(核⼼),在Kernel⾥主要是载⼊电脑设备的驱动程序,以便可以控制电脑上的设备,并且以只读⽅式来挂载根⽬录,也就是⼀开始只能读取到根⽬录所对应的那个分区,所以/etc、/bin、/sbin、/dev、/lib这五个⽬录必须同根⽬录在⼀个分区中;4、最后启动init这个程序,所以init这个程序的进程编号为1,是Linux中第⼀个执⾏的程序;init这个程序会根据Run level来执⾏以下这些程序:·/etc/rc.d/rc.sysinit;·/etc/rc.d/rc 和etc/rc.d/rc?.d/·/etc/rc.d/rc.local·如果有适当的图形界⾯管理程序⼆、BIOS初始化时主要的三个任务BIOS(B asic I nput/O utput S ystem)1、电脑周边设备的检测,加电⾃检POST (Power on self test);2、BIOS会选择要由哪⼀个设备来开机,例如:软盘启动、光盘启动、⽹络启动、最常见的从硬盘启动;3、选择好由哪个设备开机后,就开始读取这个设备的MBR 引导扇区;三、介绍Boot Loader中的主要⼯作1、Boot Loader可以安装在两个地⽅:·安装在硬盘的MBR中;·当有时候MBR中被其他开机管理程序占⽤就可以将Boot Loader 安装在硬盘中的其中⼀个分区的引导扇区上,;2、Boot Loader的程序码分为两个阶段:(1)Boot Loader第⼀阶段的程序码⾮常⼩,只有446bytes,可以存⼊在MBR或是某⼀个分区的引导扇区⾥,(2)Boot Loader第⼀阶段的程序码是从boot 分区来载⼊的,就是说Boot Loader 第⼆阶段程序码存放在/boot 这个分区中;3、下⾯来看三个Boot Loader 的开机流程范例,如在⼀块硬盘中安装了两个系统分别为:windows 2003 和Red hat linux当电脑开机后,会先载⼊MBR通过第⼀阶段程序码来载⼊第⼆阶段程序码,进⼊GRUB开机菜单这⾥选择哪个系统就会载⼊相应的核⼼;四、介绍GRUB和grub.conf 这个配置⽂件的内容其实从MBR载⼊Boot Loader开始,载⼊Kernel,载⼊init这些程序之间都是由GRUB这个多重开机管理程序所负责的。
计算机及Linux操作系统开机启动过程详解
计算机及Linux操作系统开机启动过程详解从按下开机键开始的计算机启动过程:(主要包括从主板加载BIOS并执⾏、从磁盘加载启动区并执⾏、从磁盘加载操作系统并执⾏三步,是依次递进的,详情参阅)加载BIOS:按下开机键,主板ROM的BIOS被(被谁?)加载到到内存0xffff0处,CPU 将 PC 寄存器的值强制初始化为 0xffff0(⼀跳)。
执⾏BIOS代码:阶段1(0xffff0 处的内容):该⼊⼝地址处存的是⼀个跳转指令,跳转的⽬的地是内存0xfe05b位置,该位置存了BIOS的真正内容。
执⾏该跳转(⼆跳)。
阶段2(0xfe05b 处的内容):执⾏硬件检测、硬件初始化、建⽴中断向量表等⼯作后,找到磁盘上的启动区(或称引导区)加载到内存0x7c00位置,并跳转到该位置(三跳)。
执⾏启动区代码(0x7c00 处的内容):从磁盘加载OS内核到内存,与上⾯不同这⾥内存位置不是固定的了,并跳转到OS内核代码处(四跳)。
执⾏OS内核代码:包括开启分段机制、进⼊保护模式、开启中断机制等,执⾏完后系统由OS接⼿管理。
具体过程见下⽂“操作系统启动过程”部分。
整体过程概要:补充:BIOS位于主板ROM,启动时被加载到内存;启动区、OS位于磁盘,被先后加载到内存。
BIOS、启动区在内存的位置是固定的(为啥是这三个值?早期定死的);⽽OS在内存位置不是固定的。
启动区:若⼀个磁盘上0盘0道1扇区的内容(512B)的末两个字节为0x55、0xaa,则这该扇区会被BIOS识别为启动区,该磁盘会被当做可启动盘。
往⼀个磁盘烧录OS后之所以可以当做启动盘就是因为往该位置写⼊了这些特殊数据。
若装了多系统,则启动时会列出并让⽤户选择要启动的系统,这些系统就是根据上述条件被识别得到。
可见,⼀个程序只要其虚拟内存以0x7c00作为段地址,且按上述条件烧录到磁盘,则就可以被BIOS识别为启动区加载到内存执⾏。
因此,如果该程序逻辑中不是去加载OS⽽是直接输出数据,则该程序⾃⾝就是⼀个简洁的"操作系统"。
Linux操作系统启动流程图文详解
Linux操作系统启动流程图⽂详解理解Linux操作系统启动流程,能有助于后期在企业中更好的维护Linux服务器,能快速定位系统问题,进⽽解决问题。
上图为Linux操作系统启动流程1.加载BIOS计算机电源加电质检,⾸先加载基本输⼊输出系统(Basic Input Output System,BIOS),BIOS中包含硬件CPU、内存、硬盘等相关信息,包含设备启动顺序信息、硬盘信息、内存信息、时钟信息、即插即⽤(Plug-and-Play,PNP)特性等。
加载完BIOS信息,计算机将根据顺序进⾏启动。
2.读取MBR读取完BIOS信息,计算机将会查找BIOS所指定的硬盘MBR引导扇区,将其内容复制到0x7c00地址所在的物理内存中。
被复制到物理内存的内容是Boot Loader,然后进⾏引导。
3.GRUB引导GRUB启动引导器是计算机启动过程中运⾏的第⼀个软件程序,当计算机读取内存中的GRUB配置信息后,会根据其配置信息来启动硬盘中不同的操作系统。
4.加载Kernel计算机读取内存映像,并进⾏解压缩操作,屏幕⼀般会输出“Uncompressing Linux”的提⽰,当解压缩内核完成后,屏幕输出“OK, booting the kernel”。
系统将解压后的内核放置在内存之中,并调⽤start_kernel()函数来启动⼀系列的初始化函数并初始化各种设备,完成Linux核⼼环境的建⽴。
5.设定Inittab运⾏等级内核加载完毕,会启动Linux操作系统第⼀个守护进程init,然后通过该进程读取/etc/inittab⽂件,/etc/inittab⽂件的作⽤是设定Linux的运⾏等级,Linux常见运⾏级别如下:•0:关机模式•1:单⽤户模式•2:⽆⽹络⽀持的多⽤户模式•3:字符界⾯多⽤户模式•4:保留,未使⽤模式•5:图像界⾯多⽤户模式•6:重新引导系统,重启模式6.加载rc.sysinit读取完运⾏级别,Linux系统执⾏的第⼀个⽤户层⽂件/etc/rc.d/rc.sysinit,该⽂件功能包括:设定PATH运⾏变量、设定⽹络配置、启动swap分区、设定/proc、系统函数、配置Selinux等。
简要分析linux系统的启动过程
简要分析linux系统的启动过程接触linux系统运维已经好⼏年了,常常被问到linux系统启动流程问题,刚好今天有空来梳理下这个过程:⼀般来说,所有的操作系统的启动流程基本就是:总的来说,linux系统启动流程可以简单总结为以下⼏步:1)开机BIOS⾃检,加载硬盘。
2)读取MBR,进⾏MBR引导。
3)grub引导菜单(Boot Loader)。
4)加载内核kernel。
5)启动init进程,依据inittab⽂件设定运⾏级别6)init进程,执⾏rc.sysinit⽂件。
7)启动内核模块,执⾏不同级别的脚本程序。
8)执⾏/etc/rc.d/rc.local9)启动mingetty,进⼊系统登陆界⾯。
linux系统安装时,如果要想设置开启启动项,可以:开机到BIOS提醒界⾯,按键F11(Dell服务器的做法)进⼊BIOS设置BOOT MENU,继⽽设置启动项:硬盘HD启动,光盘CD/DVD启动,还是U盘USB启动。
下⾯就linux操作系统的启动过程做⼀详细解析记录:加载内核操作系统接管硬件以后,⾸先读⼊ /boot ⽬录下的内核⽂件。
[root@bastion-IDC ~]# ll /boot/total 21668-rw-r--r--. 1 root root 105195 Nov 22 2013 config-2.6.32-431.el6.x86_64drwxr-xr-x. 3 root root 1024 Aug 22 16:31 efidrwxr-xr-x. 2 root root 1024 Aug 22 16:32 grub-rw-------. 1 root root 15217153 Aug 22 16:32 initramfs-2.6.32-431.el6.x86_64.imgdrwx------. 2 root root 12288 Aug 22 16:24 lost+found-rw-r--r--. 1 root root 193758 Nov 22 2013 symvers-2.6.32-431.el6.x86_64.gz-rw-r--r--. 1 root root 2518236 Nov 22 2013 System.map-2.6.32-431.el6.x86_64-rwxr-xr-x. 1 root root 4128368 Nov 22 2013 vmlinuz-2.6.32-431.el6.x86_64启动初始化进程内核⽂件加载以后,就开始运⾏第⼀个程序 /sbin/init,它的作⽤是初始化系统环境。
linux-start
/etc/rc.d/rc.sysinit
主要做在各个运行模式中相同的初始化工作,包括: ➢ ➢ ➢ ➢ ➢ ➢ ➢ ➢ ➢
调入keymap以及系统字体 启动swapping 设置主机名 设置NIS域名 检查(fsck)并mount文件系统 打开quota 装载声卡模块 设置系统时钟 等等。
●
/etc/rc.d/rc
可以设置)来执行相应目录下的脚本。凡是以Kxx开头的 , 都以stop为参数来调用;凡是以Sxx开头的,都以start为参 数来调用。调用的顺序按xx 假设缺省的运行模式是3,/etc/rc.d/rc就会按上述方式调 用
➢ /etc/rc.d/rc3.d/下的脚本。 ➢ linux中的运行模式2、3、5都把/etc/rc.d/rc.local做为
# 0 - 停机(千万不能把initdefault 设置为0 ) # 1 - 单用户模式
# # # # # #
s 2 3 4 5 6
-
init s = init 1 多用户,没有 NFS 完全多用户模式(标准的运行级) 没有用到 X11 多用户图形模式(xwindow) 重新启动(千万不要把initdefault设置为6 )
Linux开机流程
1
linux开机顺序总览
启动方式和执行 /etc/rc.d/rc.sysinit # 由init执行的第一个脚本 ➢ /etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模 式 ➢ /etc/rc.d/rc.local #相应级别服务启动之后、 在执 行该文件(其实也可以把需要执行的命令写到该文件 中) /sbin/mingetty # 等待用户登录
chkconfig(续)
LinuxBoot,Kernel和Service介绍
LinuxBoot,Kernel和Service介绍Linux 启动过程是初始化系统的过程。
它包括从第⼀次打开计算机电源到⽤户界⾯完全可操作时发⽣的所有事情。
充分了解引导过程中的步骤可能有助于您解决问题,以及根据您的需要调整计算机的性能。
另⼀⽅⾯,启动过程可能相当技术性,您可以在不了解所有细节的情况下开始使⽤ Linux。
第⼀个步骤:BIOS启动基于 x86 的 Linux 系统涉及许多步骤。
当计算机开机时,基本输⼊/输出系统 (BIOS) 会初始化硬件,包括屏幕和键盘,并测试主内存。
此过程也称为 POST(开机⾃检)。
BIOS 软件存储在主板上的 ROM 芯⽚上。
此后,引导过程的其余部分由操作系统 (OS) 控制。
Master Boot Record (MBR) and Boot Loader⼀旦 POST 完成,系统控制就会从 BIOS 传递到引导加载程序。
引导加载程序通常存储在系统中的硬盘之⼀上,或者在引导扇区(对于传统BIOS/MBR 系统)或 EFI 分区(对于更新的(统⼀)可扩展固件接⼝或 EFI/UEFI 系统)。
到此阶段为⽌,机器不会访问任何⼤容量存储介质。
此后,有关⽇期、时间和最重要外围设备的信息从 CMOS 值中加载(在使⽤电池供电的内存存储技术后,即使系统断电也能跟踪⽇期和时间) .有许多⽤于 Linux 的引导加载程序;最常见的是 GRUB(⽤于 GRand Unified Boot loader)、ISOLINUX(⽤于从可移动媒体启动)和DAS U-Boot(⽤于在嵌⼊式设备/设备上启动)。
⼤多数 Linux 引导加载程序可以提供⼀个⽤户界⾯,⽤于选择引导 Linux 的替代选项,甚⾄可能安装的其他操作系统。
在引导 Linux 时,引导加载程序负责将内核映像和初始 RAM 磁盘或⽂件系统(其中包含启动系统所需的⼀些关键⽂件和设备驱动程序)加载到内存中。
Boot Loader in Action引导加载程序有两个不同的阶段:对于使⽤ BIOS/MBR ⽅法的系统,引导加载程序位于硬盘的第⼀个扇区,也称为主引导记录 (MBR)。
简述linux启动流程
简述linux启动流程Linux系统启动的过程可以分为以下几个步骤:BIOS自检、引导加载程序、内核初始化、系统初始化和登录。
当计算机启动时,BIOS(Basic Input/Output System,基本输入/输出系统)会自检硬件设备,确保它们正常工作。
BIOS还会检查启动设备的设置,并寻找引导加载程序。
接下来,引导加载程序(Boot Loader)会被加载到计算机的内存中。
引导加载程序的作用是在计算机启动时加载操作系统内核。
常用的引导加载程序有GRUB(GRand Unified Bootloader)和LILO(LInux LOader)。
引导加载程序加载内核后,内核开始初始化。
内核是操作系统的核心,负责管理计算机的硬件和软件资源。
内核初始化的过程包括设置内核参数、初始化进程、加载驱动程序等。
在这个阶段,内核还会挂载根文件系统,以便后续的系统初始化和运行。
系统初始化是Linux启动过程的下一个阶段。
在系统初始化过程中,Linux会启动各种系统服务和进程,包括网络服务、文件系统服务、用户管理服务等。
此外,系统还会进行一些配置操作,如加载配置文件、设置环境变量等。
系统初始化的过程可能会涉及到一些启动脚本和配置文件,以确保系统能够正确地启动和运行。
当系统初始化完成后,用户可以通过登录界面或命令行界面登录到Linux系统。
在登录之前,系统可能会要求用户输入用户名和密码进行身份验证。
一旦验证通过,用户就可以开始使用Linux系统提供的各种功能和应用程序了。
总结起来,Linux启动流程包括BIOS自检、引导加载程序、内核初始化、系统初始化和登录。
这个过程确保了Linux操作系统能够正常启动并提供各种功能和服务。
通过了解Linux启动流程,我们可以更好地理解Linux系统的运行机制,并能够更好地管理和使用Linux操作系统。
CentOS系列--linux启动顺序
系统加电之后,首先进行的硬件自检,然后是bootloader对系统的初始化,加载内核。
内核被加载到内存中之后,就开始执行了。
一旦内核启动运行,对硬件的检测就会决定需要对哪些设备驱动程序进行初始化。
从这里开始,内核就能够挂装根文件系统(这个过程类似于Windows识别并存取C盘的过程)。
内核挂装了根文件系统,并已初始化所有的设备驱动程序和数据结构等之后,就通过启动一个叫init的用户级程序,完成引导进程。
系统首先启动init进程,该进程先会执行/etc/rc.d/rc.sysinit,然后去读/etc/inittab文件决定运行模式,根据默认运行模式读取/etc/rc.d/rc $RUNLEVEL文件夹下的执行程序连接,这些文件以K或S开头,它们都是指向init.d/的一些软连接。
Init进程是系统启动之后的第一个用户进程,所以它的pid(进程编号)始终为1。
init进程上来首先做的事是去读取/etc/目录下inittab文件中initdefault id值,这个值称为运行级别(run-level)。
它决定了系统启动之后运行于什么级别。
运行级别决定了系统启动的绝大部分行为和目的。
这个级别从0到6 ,具有不同的功能。
不同的运行级定义如下:# 0 - 停机(千万别把initdefault设置为0,否则系统永远无法启动)# 1 - 单用户模式# 2 - 多用户,没有NFS# 3 - 完全多用户模式(标准的运行级)# 4 –系统保留的# 5 - X11 (x window)# 6 - 重新启动(千万不要把initdefault 设置为6,否则将一直在重启)rc.d的内容如下:init.d/ :各种服务器和程序的二进制文件存放目录。
rc $RUNLEVEL.d/: 各个启动级别的执行程序连接目录。
里头的东西都是指向init.d/的一些软连接。
具体的后边叙述。
还有三个脚本:rc.sysinit, rc, rc.local如图:redhat的启动方式和执行次序是:加载内核执行init程序/etc/rc.d/rc.sysinit # 由init执行的第一个脚本/etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模式/etc/rc.d/rc.local/sbin/mingetty # 等待用户登录在Redhat中,/etc/rc.d/rc.sysinit主要做在各个运行模式中相同的初始化工作,包括:调入keymap以及系统字体启动swapping设置主机名设置NIS域名检查(fsck)并mount文件系统打开quota装载声卡模块设置系统时钟等等。
linux启动流程
centos6启动流程•硬件启动阶段o Power on打开电源o BIOS▪POST: power on self test开机自检•初始化硬件设备,检测系统外围主要设备:cpu,memory,硬盘、显卡等▪确定启动设备•启动设备:硬盘、网络、U盘、光盘•如果启动设备是硬盘,则读取硬盘第一个扇区MBR,512字节•控制权交给bootloadero MBR▪MBR512字节• 1.446字节bootloadero启动加载器bootloader▪windows: ntloader仅仅启动os▪GRUB: GRand Unified Bootloader,CentOS 6 GRUB 0.97: GRUBLegacy, CentOS 7 以后使用GRUB 2.02• 2.64字节分区信息o16字节x4 partitions• 3.55aa标志位表示分区是否有效•grub启动阶段o stage1▪ 1.446字节bootloader•这是二进制的0101,写在MBR扇区的前446字节。
o单纯为了找到1.5阶段生成的bootloader上o stage1.5▪第一阶段446字节的bootloader无法存放内核位置,/boot/grub/grub.config里面有内核位置,但是/boot的文件系统需要加载,即想办法识别/boot的文件系统来读取config文件加载内核。
MBRbootloader太小无法容下文件系统的驱动代码,而且文件系统的类型有很多种,比如ext2 xfsext4 fat32等,MBRbootloader无法容下这么多种文件系统的驱动,所以,只能提供一个中间的过度bootloader即stage1_5 bootloader▪ 1.5阶段是MBR后面的分区,grub-install 时候,会将/boot/grub所在文件系统类型对应的stage1_5硬编码到MBR扇区后第一个分区前15个扇区中,因此这段空间位于MBR分区后,第一个分区之前。
linux-mips启动分析
linux-mips启动分析(1)系统加电起动后,MIPS 处理器默认的程序入口是0xBFC00000,此地址在无缓存的KSEG1的地址区域内,对应的物理地址是0x1FC00000,即CPU从0x1FC00000开始取第一条指令,这个地址在硬件上已经确定为FLASH的位置,Bootloader将Linux 内核映像拷贝到RAM 中某个空闲地址处,然后一般有个内存移动操作,目的地址在arch/mips/Makefile 内指定:load-$(CONFIG_MIPS_PB1550) += 0xFFFFFFFF80100000,则最终bootloader定会将内核移到物理地址0x00100000 处。
上面Makefile 里指定的的load 地址,最后会被编译系统写入到arch/mips/kernel/vmlinux.lds 中:OUTPUT_ARCH(mips)ENTRY(kernel_entry)jiffies = jiffies_64;SECTIONS{. = 0xFFFFFFFF80100000;/* read-only */_text = .; /* Text and read-only data */.text : {*(.text)...这个文件最终会以参数-Xlinker --script -Xlinker vmlinux.lds 的形式传给gcc,并最终传给链接器ld 来控制其行为。
ld 会将 .text 节的地址链接到0xFFFFFFFF80100000 处。
关于内核ELF 文件的入口地址(Entry point),即bootloader 移动完内核后,直接跳转到的地址,由ld 写入ELF的头中,其会依次用下面的方法尝试设置入口点,当遇到成功时则停止:a. 命令行选项-e entryb. 脚本中的ENTRY(symbol)c. 如果有定义start 符号,则使用start符号(symbol)d. 如果存在 .text 节,则使用第一个字节的地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
开机过程指的是从打开计算机电源直到LINUX显示用户登录画面的全过程。
分析LINUX开机过程也是深入了解LINUX核心工作原理的一个很好的途径。
启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。
这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。
在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。
在BIOS将系统的控制权交给硬盘第一个扇区之后,就开始由Linux来控制系统了。
启动第二步--读取MBR硬盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,可里面却存放了预启动信息、分区表信息。
可分为两部分:第一部分为引导(PRE-BOOT)区,占了446个字节;第二部分为分区表(PARTITION PABLE),共有66个字节,记录硬盘的分区信息。
预引导区的作用之一是找到标记为活动(ACTIVE)的分区,并将活动分区的引导区读入内存。
系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0×7c00地址所在的物理内存中。
其实被复制到物理内存的内容就是Boot Loader,而具体到你的电脑,那就是lilo或者grub了。
启动第三步--Boot LoaderBoot Loader 就是在操作系统内核运行之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。
通常,BootLoade:是严重地依赖于硬件而实现的,不同体系结构的系统存在着不同的Boot Loader。
Linux的引导扇区内容是采用汇编语言编写的程序,其源代码在arch/i386 /boot中(不同体系的CPU有其各自的boot目录),有4个程序文件:◎bootsect.S,引导扇区的主程序,汇编后的代码不超过512字节,即一个扇区的大小。
◎setup.S,引导辅助程序。
◎edd.S,辅助程序的一部分,用于支持BIOS增强磁盘设备服务。
◎video.S,辅助程序的另一部分,用于引导时的屏幕显示。
Boot Loader有若干种,其中Grub、Lilo和spfdisk是常见的Loader,这里以Grub为例来讲解吧。
系统读取内存中的grub配置信息(一般为menu.lst或grub.lst),并依照此配置信息来启动不同的操作系统。
启动第四步--加载内核根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。
此时,屏幕一般会输出“Uncompressing Linux”的提示。
当解压缩内核完成后,屏幕输出“OK, booting the kernel”。
系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。
至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了。
start_kenrel()定义在init/main.c中,它就类似于一般可执行程序中的mai n()函数,系统在此之前所做的仅仅是一些能让内核程序最低限度执行的初始化操作,真正的内核初始化过程是从这里才开始。
函数start_kerenl()将会调用一系列的初始化函数,用来完成内核本身的各方面设置,目的是最终建立起基本完整的Linux核心环境。
start_kernel()中主要执行了以下操作:(1) 在屏幕上打印出当前的内核版本信息。
(2) 执行setup_arch(),对系统结构进行设置。
(3)执行sched_init(),对系统的调度机制进行初始化。
先是对每个可用CP U上的runqueque进行初始化;然后初始化0号进程(其task struct和系统空M堆栈在startup_32()中己经被分配)为系统idle进程,即系统空闲时占据CPU的进程。
(4)执行parse_early_param()和parsees_args()解析系统启动参数。
(5)执行trap_initQ,先设置了系统中断向量表。
0-19号的陷阱门用于C PU异常处理;然后初始化系统调用向量;最后调用cpu_init()完善对CPU的初始化,用于支持进程调度机制,包括设定标志位寄存器、任务寄存器、初始化程序调试相关寄存器等等。
(6)执行rcu_init(),初始化系统中的Read-Copy Update互斥机制。
(7)执行init_IRQ()函数,初始化用于外设的中断,完成对IDT的最终初始化过程。
(8)执行init_timers(), softirq_init()和time_init()函数,分别初始系统的定时器机制,软中断机制以及系统日期和时间。
(9)执行mem_init()函数,初始化物理内存页面的page数据结构描述符,完成对物理内存管理机制的创建。
(10)执行kmem_cache_init(),完成对通用slab缓冲区管理机制的初始化工作。
(11)执行fork_init(),计算出当前系统的物理内存容量能够允许创建的进程(线程)数量。
(12)执行proc_caches_init() , bufer_init(), unnamed_dev_init() ,vfs_cac hes_init(), signals_init()等函数对各种管理机制建立起专用的slab缓冲区队列。
(13 )执行proc_root_init()Wl数,对虚拟文件系统/proc进行初始化。
在start_kenrel()的结尾,内核通过kenrel_thread()创建出第一个系统内核线程(即1号进程),该线程执行的是内核中的init()函数,负责的是下一阶段的启动任务。
最后调用cpues_idle()函数:进入了系统主循环体口默认将一直执行default_idle()函数中的指令,即CPU的halt指令,直到就绪队列中存在其他进程需要被调度时才会转向执行其他函数。
此时,系统中唯一存在就绪状态的进程就是由kerne_hread()创建的init进程(内核线程),所以内核并不进入default_idle()函数,而是转向init()函数继续启动过程。
启动第五步--用户层init依据inittab文件来设定运行等级内核被加载后,第一个运行的程序便是/sbin/init,该文件会读取/etc/initta b文件,并依据此文件来进行初始化工作。
其实/etc/inittab文件最主要的作用就是设定Linux的运行等级,其设定形式是“:id:5:initdefault:”,这就表明Linux需要运行在等级5上。
Linux的运行等级设定如下:0:关机1:单用户模式2:无网络支持的多用户模式3:有网络支持的多用户模式4:保留,未使用5:有网络支持有X-Window支持的多用户模式6:重新引导系统,即重启启动第六步--init进程执行rc.sysinit在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/r c.sysinit脚本程序,它做的工作非常多,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。
如果你有兴趣,可以到/etc/rc.d中查看一下rc.sysinit文件。
线程init的最终完成状态是能够使得一般的用户程序可以正常地被执行,从而真正完成可供应用程序运行的系统环境。
它主要进行的操作有:(1) 执行函数do_basic_setup(),它会对外部设备进行全面地初始化。
(2) 构建系统的虚拟文件系统目录树,挂接系统中作为根目录的设备(其具体的文件系统已经在上一步骤中注册)。
(3) 打开设备/dev/console,并通过函数sys_dup()打开的连接复制两次,使得文件号0,1 ,2 全部指向控制台。
这三个文件连接就是通常所说的“标准输入”stdin,“标准输出”stdout和“标准出错信息”stderr这三个标准I/O通道。
(4) 准备好以上一切之后,系统开始进入用户层的初始化阶段。
内核通过系统调用execve()加载执T子相应的用户层初始化程序,依次尝试加载程序"/sbin/initl"," /etc/init"," /bin/init',和“/bin/sh。
只要其中有一个程序加载获得成功,那么系统就将开始用户层的初始化,而不会再回到init()函数段中。
至此,init()函数结束,Linux内核的引导部分也到此结束。
启动第七步--启动内核模块具体是依据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。
启动第八步--执行不同运行级别的脚本程序根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。
启动第九步--执行/etc/rc.d/rc.local你如果打开了此文件,里面有一句话,读过之后,你就会对此命令的作用一目了然:# This script will be executed *after* all the other init scripts.# You can put your own initialization stuff in here if you don’t# want to do the full Sys V style init stuff.rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。
你可以把你想设置和启动的东西放到这里。
启动第十步--执行/bin/login程序,进入登录状态此时,系统已经进入到了等待用户输入username和password的时候了,你已经可以用自己的帐号登入系统了。