内核启动流程
initramfs初始化过程 -回复
initramfs初始化过程-回复标题:Linux内核启动流程详解——Initramfs的初始化过程一、引言在Linux系统启动过程中,Initramfs(Initial RAM file system)扮演着非常重要的角色。
它是一个临时的根文件系统,用于引导加载程序加载Linux内核并完成初始化工作。
本文将详细介绍Initramfs的初始化过程。
二、什么是InitramfsInitramfs是Linux内核的一项功能,它允许将一个小型的CPIO格式的文件系统映射到内存中,并作为系统的初始根文件系统。
这样,在内核初始化阶段,就可以访问到一些必要的驱动和工具,以便完成磁盘设备的识别、挂载以及进一步的系统初始化工作。
三、Initramfs的创建在实际操作中,我们通常会使用mkinitcpio这个工具来生成Initramfs镜像。
以下是具体的步骤:1. 首先,我们需要配置mkinitcpio.conf文件,指定需要包含在Initramfs中的模块和脚本。
2. 然后,运行mkinitcpio命令,传入目标内核版本和要生成的Initramfs 文件名作为参数。
3. 最后,更新grub.cfg文件,将新生成的Initramfs文件添加到内核启动参数中。
四、Initramfs的加载与解压当计算机启动时,BIOS会加载引导加载程序(如GRUB),然后引导加载程序会加载Linux内核和Initramfs镜像。
内核在初始化阶段会找到Initramfs,并将其解压到内存中,形成一个临时的根文件系统。
五、Initramfs的工作原理Initramfs的主要任务是在真正的根文件系统被挂载之前,提供必要的驱动和工具,以便完成以下工作:1. 设备识别:通过udev或者mdev识别并挂载设备。
2. 文件系统识别:根据/etc/fstab文件,识别并挂载文件系统。
3. 用户空间初始化:执行/sbin/init程序,开始用户空间的初始化工作。
系统启动流程范文
系统启动流程范文系统启动是指将计算机或其他电子设备从关机状态转变为可操作状态的过程。
在系统启动过程中,系统会按照一定的流程进行硬件自检、加载操作系统和其他必要的软件程序,最终将系统准备好以供用户使用。
下面将详细介绍一个典型的系统启动流程。
一、固件初始化系统启动的第一步是固件初始化。
当用户按下电源按钮,系统的固件(例如BIOS或UEFI)会开始执行。
固件是系统的底层软件,用于控制硬件设备和引导操作系统。
在固件初始化过程中,固件会自动进行一系列的硬件自检(POST)以确保硬件设备的正常工作。
如果发现硬件设备故障,固件会通过发出警告声音或显示错误信息来提示用户。
二、固件引导固件初始化完成后,固件将根据预设的启动顺序(例如硬盘、光盘、USB等)在可启动设备上操作系统的引导程序。
一般情况下,固件会首先检查硬盘,如果没有找到合适的引导程序,再依次检查其他可启动设备。
当固件找到合适的引导程序时,它会将控制权转交给引导程序。
三、引导程序加载引导程序是指负责加载操作系统内核的软件。
根据不同的系统和引导方式,引导程序可能是GRUB、LILO、Windows Boot Manager等。
引导程序会首先读取系统的分区表(MBR、GPT等)以找到操作系统所在的分区。
然后,它会加载操作系统内核和必要的驱动程序等系统组件到内存中。
四、操作系统启动一旦引导程序加载完毕,它会将控制权交给操作系统内核。
操作系统内核是系统的核心部分,负责管理系统资源、提供服务和执行用户程序。
内核启动后,首先会初始化各种硬件设备、创建初始化进程和初始化其他系统进程。
接下来,内核会加载并初始化设备驱动程序,以保证操作系统能够正确和稳定地管理硬件设备。
最后,内核会启动系统服务和用户界面,使系统准备好以供用户使用。
五、用户环境准备系统启动完成后,用户可以进入操作系统的图形界面或命令行界面,开始使用计算机。
在图形界面中,用户可以通过鼠标和键盘与系统交互,运行应用程序、浏览互联网、管理文件等。
操作系统启动的流程
操作系统启动的流程操作系统启动是计算机系统中非常重要的一个过程,它负责将计算机硬件初始化并加载操作系统内核,使计算机能够正常运行。
操作系统启动的流程一般包括以下几个步骤:首先是BIOS自检。
当计算机开机时,BIOS(基本输入/输出系统)会首先进行自检,检测计算机硬件是否正常工作。
这个过程包括检测内存、硬盘、显卡等硬件设备,以确保它们能够正常工作。
接着是引导加载程序。
BIOS会在自检完成后,根据设定的启动顺序(通常是先从硬盘启动)来加载引导加载程序。
引导加载程序通常存储在硬盘的引导扇区中,它的作用是加载操作系统内核并将控制权交给操作系统。
然后是加载操作系统内核。
引导加载程序会读取操作系统内核的镜像文件,并将其加载到内存中。
操作系统内核是操作系统的核心部分,负责管理计算机的资源、调度任务、提供系统调用等功能。
接着是初始化操作系统。
一旦操作系统内核加载到内存中,操作系统会开始初始化各种系统服务和驱动程序,以确保计算机能够正常运行。
这个过程包括初始化文件系统、网络服务、设备驱动程序等。
最后是启动用户界面。
一旦操作系统初始化完成,用户界面就会被启动,用户可以通过键盘、鼠标等输入设备与计算机进行交互。
用户界面通常包括桌面、任务栏、应用程序等,用户可以通过它们来操作计算机。
总的来说,操作系统启动的流程是一个复杂而精密的过程,它涉及到硬件初始化、引导加载、内核加载、系统初始化等多个环节。
只有这些步骤都顺利完成,计算机才能够正常启动并运行。
操作系统启动的流程虽然在用户看来是透明的,但却是计算机系统中至关重要的一环。
嵌入式linux系统的启动流程
嵌入式linux系统的启动流程
嵌入式Linux系统的启动流程一般包括以下几个步骤:
1.硬件初始化:首先会对硬件进行初始化,例如设置时钟、中
断控制等。
这一步骤通常是由硬件自身进行初始化,也受到系统的BIOS或Bootloader的控制。
2.Bootloader引导:接下来,系统会从存储介质(如闪存、SD
卡等)的Bootloader区域读取引导程序。
Bootloader是一段程序,可以从存储介质中加载内核镜像和根文件系统,它负责进行硬件初始化、进行引导选项的选择,以及加载内核到内存中。
3.Linux内核加载:Bootloader会将内核镜像从存储介质中加载到系统内存中。
内核镜像是包含操作系统核心的一个二进制文件,它由开发者编译并与设备硬件特定的驱动程序进行连接。
4.内核初始化:一旦内核被加载到内存中,系统会进入内核初
始化阶段。
在这个阶段,内核会初始化设备驱动程序、文件系统、网络协议栈等系统核心。
5.启动用户空间:在内核初始化完毕后,系统将启动第一个用
户空间进程(init进程)。
init进程会读取并解析配置文件(如
/etc/inittab)来决定如何启动其他系统服务和应用程序。
6.启动其他系统服务和应用程序:在用户空间启动后,init进
程会根据配置文件启动其他系统服务和应用程序。
这些服务和应用程序通常运行在用户空间,提供各种功能和服务。
以上是嵌入式Linux系统的基本启动流程,不同的嵌入式系统可能会有一些差异。
同时,一些特定的系统也可以添加其他的启动流程步骤,如初始化设备树、加载设备固件文件等。
=5内核启动流程之(init_post())[在rest_init()中被调用]
韦东山342页init进程是由内核启动的第一个(也是唯一一个)用户进程(进程号ID=1),它根据配置文件决定启动哪些程序,比如执行某些脚本、启动shell、运行用户指定的程序等。
Init进程是后续所有进程的发起者,也是后续进程的父进程。
比如在init进程启动/bin/sh程序后,才能够在控制台上输入各种命令。
init进程的执行程序通常是/sbin/init程序,上面讲述的init进程的作用只不过是/sbin/init 这个程序的功能。
我们完全可以编写自己的/sbin/init,或者传入命令行参数“init=xxxxx”指定某个程序作为init进程运行。
一般而言,在Linux系统有两种init程序:BSD init和System V init。
BSD和System V 是两种版本的UNIX系统。
这两种init程序各有优缺点,现在大多Linux的发行版本使用System V init。
但是在嵌入式领域,通常使用BusyBox集成的init程序,下面基于它进行讲解。
【busybox-1.7.0也是一套源码树,进入后可以执行make menuconfig调用Config.in文件进行配置,然后便已安装到指定的目录下[你做的根文件系统目录]。
】1 内核如何启动init进程[第771行---第774行来个四选一]内核启动的最后一步就是启动init进程,代码在[busybox-1.7.0/init/main.c]文件中,如下所示:顺便罗列一下内核启动流程:/arch/arm/boot/compressed/head.S:Start:Decompressed_kernel()//位于/arch/arm/boot/compressed/misc.c[解压缩内核]Call_kernel()Stext:/init/main.cStart_kernel()Setup_arch()…Rest_init()Init()Do_basic_setup()Prepare_namespace()看到了这里,我已激动得说不出话了,因为来到我与挂载根文件系统最重要的接口函数。
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. 加载系统服务:启动初始化会加载并启动系统服务,比如网络服务、日志服务、时间同步服务等。
android启动流程
android启动流程Android启动流程。
Android系统启动流程是指Android设备在开机时,系统从无到有的整个启动过程。
了解Android启动流程对于开发者和系统维护者来说都是非常重要的,因此本文将对Android启动流程进行详细介绍。
1. 加电启动。
当用户按下设备的电源按钮时,电源管理芯片开始为设备供电,同时CPU开始执行启动代码。
此时,设备进入了启动阶段。
2. Bootloader启动。
在加电启动后,设备会首先运行Bootloader,Bootloader是设备的引导程序,负责初始化硬件并加载操作系统。
Bootloader会检查设备的硬件情况,然后加载操作系统内核。
3. 内核启动。
一旦Bootloader加载了操作系统内核,内核开始初始化设备的硬件,包括CPU、内存、外设等。
内核还会挂载根文件系统,并启动init进程。
4. init进程启动。
init进程是Android系统的第一个用户空间进程,它负责启动系统的其他进程和服务。
init进程会读取init.rc文件,根据文件中的配置启动系统服务和应用程序。
5. 系统服务启动。
在init进程启动后,系统服务会被依次启动。
这些系统服务包括SurfaceFlinger、Zygote、AMS(Activity Manager Service)、PMS(Package Manager Service)等,它们负责管理系统的各个方面,如界面显示、应用程序管理、包管理等。
6. Launcher启动。
当系统服务启动完成后,Launcher会被启动,用户可以看到设备的桌面界面。
Launcher是Android系统的桌面管理器,负责显示桌面、启动应用程序等功能。
7. 应用程序启动。
最后,用户可以通过桌面上的图标启动各种应用程序,进入到自己想要使用的应用程序中。
总结。
Android启动流程经历了Bootloader启动、内核启动、init进程启动、系统服务启动、Launcher启动和应用程序启动等步骤。
kernel启动流程分析02-解压内核
decompress
调用gunzip执行解压
decompress
cache_clean_flush
unzip
RAM
zImage
0x50C00000
分为call_cache_fn __avmv4_mmu_cache_flush
Image
16KB
Page Directory (4096 Entries)
* This routine must preserve:
* r0, r4, r5, r6, r7
*/
cache_clean_flush:
* r5 = start of this image
* r2 = end of malloc space (and therefore this image)
* We basically want:
* r4 >= r2 -> OK
* r4 + image length <= r5 -> OK
*/
cmp
mov
r0, #0
@ must be zero
mov
r1, r7
@ restore architecture number 结构编号
mov
r2, r8
@ restore atags pointer 输入atags指针
mov
pc, r4
@ call kernel 调用内核
这个地方就是最终我们从zImage跳转到Image的伟大一跳了,跳之前准备好r0,r1,r2
cmp
r0, r5
bls
wont_overwrite
zImage 的起始地址大于 vmlinux 的目标起始地址加上 vmlinux 大小( 4M )的地址, 所以将 zImage 直接解压到 vmlinux 的目标地址
uboot启动流程分析
uboot启动流程分析Uboot启动流程分析。
Uboot是一种常用的嵌入式系统启动加载程序,它的启动流程对于嵌入式系统的正常运行至关重要。
本文将对Uboot启动流程进行分析,以便更好地理解其工作原理。
首先,Uboot的启动流程可以分为以下几个步骤,Reset、初始化、设备初始化、加载内核。
接下来我们将逐一进行详细的分析。
Reset阶段是整个启动流程的起点,当系统上电或者复位时,CPU会跳转到Uboot的入口地址开始执行。
在这个阶段,Uboot会进行一些基本的硬件初始化工作,包括设置栈指针、初始化CPU寄存器等。
接着是初始化阶段,Uboot会进行一系列的初始化工作,包括初始化串口、初始化内存控制器、初始化时钟等。
这些初始化工作是为了确保系统能够正常地运行,并为后续的工作做好准备。
设备初始化阶段是Uboot启动流程中的一个重要环节,它包括对外设的初始化和检测。
在这个阶段,Uboot会初始化各种外设,如网卡、存储设备等,并对其进行检测,以确保它们能够正常工作。
最后一个阶段是加载内核,Uboot会从存储设备中加载操作系统的内核镜像到内存中,并跳转到内核的入口地址开始执行。
在这个过程中,Uboot会进行一些必要的设置,如传递启动参数给内核,并最终将控制权交给内核。
总的来说,Uboot的启动流程是一个非常重要的过程,它涉及到系统的硬件初始化、外设的初始化和内核的加载等工作。
只有当这些工作都顺利完成时,系统才能够正常地启动运行。
因此,对Uboot启动流程的深入理解对于嵌入式系统的开发和调试具有重要意义。
通过本文对Uboot启动流程的分析,相信读者对Uboot的工作原理有了更清晰的认识。
希望本文能够对大家有所帮助,谢谢阅读!。
linux 启动原理
linux 启动原理Linux启动原理Linux启动过程是一个复杂的流程,涉及到多个环节和组件。
下面简要介绍一下Linux启动的大致步骤。
1. BIOS或UEFI(统一可扩展固件接口):计算机打开时,首先由基本输入/输出系统(BIOS)或UEFI进行初始化。
它们负责检测硬件设备、加载主引导记录(MBR)和分区表。
2. 主引导程序(MBR):主引导记录是位于硬盘的第一个扇区,其中包含了引导加载程序的代码。
当计算机启动时,BIOS或UEFI会找到MBR,并将其加载到RAM中。
3. 引导加载程序(Bootloader):MBR中的主引导程序会加载引导加载器,如GRUB(Grand Unified Bootloader)。
引导加载程序负责加载操作系统内核和其他必要的组件。
4. 内核启动:引导加载器将内核文件(例如vmlinuz)加载到RAM中,并将控制权交给内核。
内核负责初始化硬件设备、挂载文件系统、建立进程和进行错误检查。
5. Init系统:Linux启动后,第一个用户空间进程是init。
根据不同的发行版,可能使用SysVinit、Upstart或systemd等系统初始化工具。
Init系统会启动各种系统服务、加载驱动程序和执行其他必要的初始化任务。
6. 运行级别:Linux系统有不同的运行级别,用于确定启动过程中要运行的系统服务和进程。
每个运行级别都有不同的配置文件,包含了要启动和停止的服务。
7. 用户登录:一旦系统初始化完成,用户可以通过终端或图形界面登录。
登录后,用户可以使用各种命令和应用程序。
以上是Linux启动的大致步骤,每个步骤都非常重要,组成了一个完整的启动过程。
理解Linux的启动原理有助于我们更好地理解和管理Linux系统。
Linux启动过程详解_MBR和GRUB概述
MBR和GRUB概述Linux 的启动流程目前比较流行的方式主要是以下步骤:1、引导器(例如 GRUB)启动;2、内核启动;3、系统进程启动与配置。
本文以 GRUB 为研究对象,对 GRUB 启动与内核启动两个部分进行描述,关于系统进程的进一步启动与配置将用另一篇文章来说明。
常见的目录结构(以 CentOS 5.3 为例):/boot|-- System.map-2.6.18-128.el5|-- System.map-2.6.18-128.el5xen|-- config-2.6.18-128.el5|-- config-2.6.18-128.el5xen|-- initrd-2.6.18-128.el5.img|-- initrd-2.6.18-128.el5xen.img|-- lost+found|-- memtest86+-1.65|-- message|-- symvers-2.6.18-128.el5.gz|-- symvers-2.6.18-128.el5xen.gz|-- vmlinuz-2.6.18-128.el5|-- vmlinuz-2.6.18-128.el5xen|-- xen-syms-2.6.18-128.el5|-- xen.gz-2.6.18-128.el5`-- grub|-- device.map|-- e2fs_stage1_5|-- fat_stage1_5|-- ffs_stage1_5|-- grub.conf|-- iso9660_stage1_5|-- jfs_stage1_5|-- menu.lst -> ./grub.conf|-- minix_stage1_5|-- reiserfs_stage1_5|-- splash.xpm.gz|-- stage1|-- stage2|-- ufs2_stage1_5|-- vstafs_stage1_5`-- xfs_stage1_5图一: CentOS 5.3 的 /boot 目录目录分作两大部分,一个是 /boot 目录下除 grub 目录以外的所有文件,这些是 Linux 的内核以及内核启动相关的一些文件;另一个就是 grub 下的所有文件, GRUB 引导器启动所需要的所有文件都在 grub 目录下。
uboot启动流程
U-Boot工作过程U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下:(1)第一阶段的功能硬件设备初始化加载U-Boot第二阶段代码到RAM空间设置好栈跳转到第二阶段代码入口(2)第二阶段的功能初始化本阶段使用的硬件设备检测系统内存映射将内核从Flash读取到RAM中为内核设置启动参数调用内核1.1.1 U-Boot启动第一阶段代码分析第一阶段对应的文件是cpu/arm920t/和board/samsung/mini2440/。
U-Boot启动第一阶段流程如下:图 U-Boot启动第一阶段流程根据cpu/arm920t/中指定的连接方式:ENTRY(_start)SECTIONS{. = 0x00000000;. = ALIGN(4);.text :{cpu/arm920t/ (.text)board/samsung/mini2440/ (.text)board/samsung/mini2440/ (.text)*(.text)}… …}第一个链接的是cpu/arm920t/,因此的入口代码在cpu/arm920t/中,其源代码在cpu/arm920t/中。
下面我们来分析cpu/arm920t/的执行。
1. 硬件设备初始化(1)设置异常向量cpu/arm920t/开头有如下的代码:.globl _start_start: b start_code /* 复位*/ldr pc, _undefined_instruction /*未定义指令向量 */ldr pc, _software_interrupt /* 软件中断向量 */ldr pc, _prefetch_abort /* 预取指令异常向量 */ldr pc, _data_abort /* 数据操作异常向量 */ldr pc, _not_used /* 未使用 */ldr pc, _irq /* irq中断向量 */ldr pc, _fiq /* fiq中断向量 */ /* 中断向量表入口地址 */_undefined_instruction: .word undefined_instruction_software_interrupt: .word software_interrupt_prefetch_abort: .word prefetch_abort_data_abort: .word data_abort_not_used: .word not_used_irq: .word irq_fiq: .word fiq.balignl 16,0xdeadbeef以上代码设置了ARM异常向量表,各个异常向量介绍如下:表 ARM异常向量表在cpu/arm920t/中还有这些异常对应的异常处理程序。
ubuntu init原理
ubuntu init原理Ubuntu init原理Ubuntu是一个基于Linux的操作系统,而init是Linux系统中的一个重要组件。
本文将介绍Ubuntu init的原理和工作流程。
一、什么是initinit是Linux系统中的第一个进程,它是所有其他进程的父进程。
当Linux系统启动时,init进程是最先启动的进程,它负责启动其他系统进程和服务。
init进程的PID(进程ID)始终为1。
二、init的工作流程1. 加载内核当计算机启动时,BIOS会加载操作系统的内核到内存中。
在Ubuntu中,内核文件通常是/vmlinuz。
一旦内核加载完成,控制权就会交给内核。
2. 内核启动内核启动后,会进行一系列的初始化工作,包括初始化硬件设备、建立内存空间映射等。
然后,内核会执行init程序。
3. 执行init程序在Ubuntu中,init程序是由systemd来实现的。
systemd是一个用于控制系统进程和服务的初始化系统。
当内核启动后,会加载systemd进程(systemd的PID为1),systemd会根据配置文件进行初始化工作。
配置文件通常位于/etc/systemd/system目录下,其中包括启动服务的配置文件和其他初始化信息。
4. 启动系统服务在初始化过程中,systemd会根据配置文件启动各种系统服务。
这些服务可以是系统自带的,也可以是用户定义的。
例如,systemd 会启动网络服务、打印服务、SSH服务等,以确保系统正常运行。
5. 启动用户会话在系统服务启动完成后,systemd会启动用户会话。
用户会话是指用户登录后的工作环境,可以是图形界面或命令行界面。
系统会根据用户的配置文件(如/etc/passwd)来决定用户会话的启动方式。
例如,如果用户配置了使用图形界面登录,则会启动相应的图形环境;如果用户配置了使用命令行界面登录,则会启动终端。
6. 用户登录用户可以使用用户名和密码登录系统。
armv8标准启动流程
ARMv8标准启动流程一、BL1阶段BL1(Bootloader 1)是ARMv8 架构中的第一个启动阶段。
当系统启动时,BL1 负责从非易失存储器中加载和执行接下来的引导加载程序(BL2 或BL31)。
在BL1 阶段,处理器会执行以下操作:初始化硬件:包括CPU、内存、中断控制器等。
加载BL2:通过BootROM(非易失存储器)加载BL2 到内存中。
设置异常向量表:为后续的异常处理提供支持。
进入C状态:处理器进入ARM C 模式,准备执行高级指令。
二、BL2阶段BL2(Bootloader 2)是ARMv8 架构中的第二个启动阶段。
在BL1 阶段完成后,BL2 会被加载到内存中并开始执行。
在BL2 阶段,处理器会执行以下操作:初始化硬件:包括网络接口、文件系统等。
加载并执行后续的引导加载程序(BL31 或BL33)。
设置异常向量表:为后续的异常处理提供支持。
进入C状态:处理器进入ARM C 模式,准备执行高级指令。
三、BL31/BL33阶段BL31 和BL33 是ARMv8 架构中的高级引导加载程序。
在BL2 阶段完成后,它们会被加载到内存中并开始执行。
在BL31 和BL33 阶段,处理器会执行以下操作:初始化硬件:包括GPU、I/O 设备等。
加载操作系统内核:将操作系统内核从非易失存储器中加载到内存中。
启动操作系统内核:通过引导加载程序调用操作系统内核的入口点,启动操作系统内核。
将控制权交给操作系统内核:将控制权交给操作系统内核,由操作系统内核负责后续的启动和运行过程。
总之,ARMv8 标准启动流程包括BL1、BL2、BL31 和BL33 四个阶段。
这些阶段依次执行,完成系统的初始化和启动过程,最终将控制权交给操作系统内核,由操作系统内核负责后续的运行和管理。
简述linux启动流程
简述linux启动流程
Linux启动流程是指从开机到进入用户界面的整个过程。
在这个过程中,系统依次完成了硬件初始化、内核启动、启动脚本执行等一系列操作。
1. BIOS或UEFI初始化:开机后,计算机首先会进入到BIOS或UEFI程序中,进行硬件的自检和初始化。
2. 加载引导程序:BIOS或UEFI会查找系统中的引导设备,比如硬盘、光盘、USB等,找到后会将引导程序加载进内存中。
3. 加载内核文件:引导程序会读取内核文件,并将其加载到系统内存中。
4. 内核启动:内核在加载完成后,开始执行初始化操作,包括设备驱动程序的加载、文件系统的挂载等。
5. 运行init进程:内核启动后,会运行init进程,init进程是Linux系统的第一个用户空间进程,主要负责系统初始化和进程管理,同时也是其他终端应用程序的父进程。
6. 执行启动脚本:init进程会读取启动脚本,并依次执行其中的命令,完成系统的初始化和配置。
7. 进入用户界面:启动脚本完成后,系统会进入到用户界面,等待用户的登陆。
总之,Linux系统启动过程是一个非常复杂的过程,从硬件的自检到系统进入用户界面,需要经过多个环节和步骤。
但是,在这个过程中,每个环节都发挥了至关重要的作用,为系统的正常运行打下了
基础。
简要分析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,它的作⽤是初始化系统环境。
龙芯启动流程
龙芯启动流程详解引言龙芯是中国自主研发的一款处理器架构,具有自主知识产权。
龙芯处理器广泛应用于服务器、工作站、超级计算机和嵌入式系统等领域。
在使用龙芯处理器的设备上进行启动时,会经历一系列的步骤和流程。
本文将详细描述龙芯启动流程的每个步骤,确保流程清晰且实用。
步骤一:上电初始化当龙芯处理器所在设备上通电时,首先会进行上电初始化。
这个过程主要包括以下几个步骤:1.1 供电稳定设备通电后,首先需要确保供电稳定。
系统会对电源进行检测和调整,以保证后续操作的正常进行。
1.2 外围接口初始化系统会对与龙芯处理器相关的外围接口进行初始化。
这些外围接口包括内存控制器、串口、网卡等,它们是系统与外部设备之间的桥梁,需要在启动前进行正确的配置。
1.3 处理器复位在上电初始化过程中,处理器会被复位到初始状态。
复位过程中,处理器会清除所有寄存器的内容,并将程序计数器(PC)设置为初始值。
步骤二:引导加载程序(Bootloader)在上电初始化完成后,系统需要加载引导加载程序(Bootloader)。
引导加载程序是一个特殊的软件,用于在启动过程中加载操作系统或其他启动载荷。
对于龙芯处理器,常用的引导加载程序有U-Boot和RedBoot等。
2.1 引导设备选择在加载引导加载程序之前,系统需要确定从哪个设备进行引导。
通常可以通过设置CMOS中的引导设备顺序来进行配置。
一般情况下,可以选择从硬盘、光盘、USB存储设备或网络等进行引导。
2.2 加载引导加载程序一旦确定了引导设备,系统会从该设备中读取引导加载程序,并将其加载到内存中。
这通常是通过读取设备上的特定扇区或文件来完成的。
2.3 执行引导加载程序一旦引导加载程序被成功加载到内存中,系统会跳转到该程序的入口点,并开始执行它。
引导加载程序负责进一步初始化系统,并根据配置文件或用户输入选择合适的启动载荷。
步骤三:操作系统启动在引导加载程序执行完成后,接下来会启动操作系统。
3.1 内核加载引导加载程序会根据配置文件或用户输入选择合适的启动载荷,通常是操作系统内核。
简述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操作系统。
=5内核启动流程之(start_kernel()-rest_init()-cpu_idle() schedule() 0&1号进程)
1) __lookup_processor_type(); 【查找处理器类型===位于arch/arm/kernel/head.S】2) __lookup_machine_type() ; 【查找机器类型】3) __vet_atags(); 【函数实现的就是判断r2是否是有效的tag列表指针,如果不是,就将零指针赋值给r2】4) __create_page_tables(); 【创建页表】5) __enable_mmu(); 【使能MMU】6) __mmap_switched(); 【拷贝数据,清BBS】decompress_kernel()【解压缩内核文件===位于arch/arm/boot/compressed/misc.c】7) start_kernel(); 【进入真正的内核初始化函数===位于init/main.c】…各种初始化函数…86) rest_init(); 【最后的初始化操作】87) cpu_idle(); 【函数会被调用来使系统处于闲置(idle)状态并等待用户程序的执行。
至此,整个Linux内核启动完毕!】【1】asmlinkage void __init start_kernel(void){…各种初始化函数…/* Do the rest non-__init'ed, we're now alive */rest_init();}【2】static noinline void __init_refok rest_init(void){int pid;rcu_scheduler_starting();//内核RCU锁机制调度启动,因为下面就要用到/** 我们必须先创建init内核线程,这样它就可以获得pid为1。
* 尽管如此init线程将会挂起来等待创建kthreads线程。
* 如果我们在创建kthreadd线程前调度它,就将会出现OOPS。
*/kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);//创建kernel_init内核线程,内核的1号进程!!!!!【此处创建init进程,就是韦东山342页的init_post()函数,参考”=5内核启动流程之(init_post())[在rest_init()中被调用].doc”】numa_default_policy();//设定NUMA系统的内存访问策略为默认pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);//创建kthreadd内核线程,它的作用是管理和调度其它内核线程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux内核启动流程arch/arm/kernel/head-armv.S该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码,主要作用是检查CPU ID, Architecture Type,初始化BSS等操作,并跳到start_kernel函数。
在执行前,处理器应满足以下状态:r0 - should be 0r1 - unique architecture numberMMU - offI-cache - on or offD-cache – off/* 部分源代码分析 *//* 内核入口点 */ENTRY(stext)/* 程序状态,禁止FIQ、IRQ,设定SVC模式 */mov r0, #F_BIT | I_BIT | MODE_SVC@ make sure svc mode/* 置当前程序状态寄存器 */msr cpsr_c, r0 @ and all irqs disabled/* 判断CPU类型,查找运行的CPU ID值与Linux编译支持的ID值是否支持 */ bl __lookup_processor_type/* 跳到__error */teq r10, #0 @ invalid processor?moveq r0, #'p' @ yes, error 'p'beq __error/* 判断体系类型,查看R1寄存器的Architecture Type值是否支持 */bl __lookup_architecture_type/* 不支持,跳到出错 */teq r7, #0 @ invalid architecture?moveq r0, #'a' @ yes, error 'a'beq __error/* 创建核心页表 */bl __create_page_tablesadr lr, __ret @ return addressadd pc, r10, #12 @ initialise processor/* 跳转到start_kernel函数 */b start_kernel5. start_kernel()函数分析下面对start_kernel()函数及其相关函数进行分析。
5.1 lock_kernel()/* Getting the big kernel lock.* This cannot happen asynchronously,* so we only need to worry about other* CPU's.*/extern __inline__ void lock_kernel(void){if (!++current->lock_depth)spin_lock(&kernel_flag);}kernel_flag 是一个内核大自旋锁,所有进程都通过这个大锁来实现向内核态的迁移。
只有获得这个大自旋锁的处理器可以进入内核,如中断处理程序等。
在任何一对 lock_kernel/unlock_kernel函数里至多可以有一个程序占用CPU。
进程的lock_depth成员初始化为-1,在 kerenl/fork.c文件中设置。
在它小于0时(恒为 -1),进程不拥有内核锁;当大于或等于0时,进程得到内核锁。
5.2 setup_arch()setup_arch()函数做体系相关的初始化工作,函数的定义在arch/arm/kernel/setup.c文件中,主要涉及下列主要函数及代码。
5.2.1 setup_processor()该函数主要通过for (list = &__proc_info_begin; list < &__proc_info_end ; list++) if ((processor_id & list->cpu_mask) == list->cpu_val)break;这样一个循环来在段中寻找匹配的processor_id,processor_id在head_armv.S文件中设置。
5.2.2 setup_architecture(machine_arch_type)该函数获得体系结构的信息,返回mach-xxx/arch.c 文件中定义的machine结构体的指针,包含以下内容MACHINE_START (xxx, ―xxx‖)MAINTAINER ("xxx"BOOT_MEM (xxx, xxx, xxx)FIXUP (xxx)MAPIO (xxx)INITIRQ (xxx)MACHINE_END5.2.3内存设置代码if (meminfo.nr_banks == 0){meminfo.nr_banks = 1;meminfo.bank[0].start = PHYS_OFFSET;meminfo.bank[0].size = MEM_SIZE;}meminfo结构表明内存情况,是对物理内存结构meminfo的默认初始化。
nr_banks指定内存块的数量,bank指定每块内存的范围,PHYS _OFFSET指定某块内存块的开始地址,MEM_SIZE 指定某块内存块长度。
PHYS _OFFSET和MEM_SIZE都定义在include/asm-armnommu/arch-XXX/memory.h 文件中,其中PHYS _OFFSET是内存的开始地址,MEM_SIZE就是内存的结束地址。
这个结构在接下来内存的初始化代码中起重要作用。
5.2.4 内核内存空间管理init_mm.start_code = (unsigned long) &_text; 内核代码段开始init_mm.end_code = (unsigned long) &_etext; 内核代码段结束init_mm.end_data = (unsigned long) &_edata; 内核数据段开始init_mm.brk = (unsigned long) &_end; 内核数据段结束每一个任务都有一个mm_struct结构管理其内存空间,init_mm 是内核的mm_struct。
其中设置成员变量* mmap指向自己,意味着内核只有一个内存管理结构,设置pgd=swapper_pg_dir,swapper_pg_dir是内核的页目录,ARM体系结构的内核页目录大小定义为16k。
init_mm定义了整个内核的内存空间,内核线程属于内核代码,同样使用内核空间,其访问内存空间的权限与内核一样。
5.2.5 内存结构初始化bootmem_init (&meminfo)函数根据meminfo进行内存结构初始化。
bootmem_init(&meminfo)函数中调用 reserve_node_zero(bootmap_pfn, bootmap_pages) 函数,这个函数的作用是保留一部分内存使之不能被动态分配。
这些内存块包括:reserve_bootmem_node(pgdat, __pa(&_stext), &_end - &_stext); /*内核所占用地址空间*/reserve_bootmem_node(pgdat, bootmap_pfn<<PAGE_SHIFT, bootmap_pages<<PAGE_SHIFT)/*bootmem结构所占用地址空间*/5.2.6 paging_init(&meminfo, mdesc)创建内核页表,映射所有物理内存和IO空间,对于不同的处理器,该函数差别比较大。
下面简单描述一下ARM体系结构的存储系统及MMU相关的概念。
在ARM存储系统中,使用内存管理单元(MMU)实现虚拟地址到实际物理地址的映射。
利用MMU,可把SDRAM的地址完全映射到0x0起始的一片连续地址空间,而把原来占据这片空间的FLASH 或者ROM映射到其他不相冲突的存储空间位置。
例如,FLASH的地址从0x0000 0000~0x00FFFFFF,而SDRAM 的地址范围是0x3000 0000~0x3lFFFFFF,则可把SDRAM地址映射为0x0000 0000~0xlFFFFFF,而FLASH的地址可以映射到0x9000 0000~0x90FFFFFF(此处地址空间为空闲,未被占用)。
映射完成后,如果处理器发生异常,假设依然为IRQ中断,PC指针指向0xl8处的地址,而这个时候PC实际上是从位于物理地址的0x3000 0018处读取指令。
通过MMU的映射,则可实现程序完全运行在SDRAM之中。
在实际的应用中.可能会把两片不连续的物理地址空间分配给SDRAM。
而在操作系统中,习惯于把SDRAM的空间连续起来,方便内存管理,且应用程序申请大块的内存时,操作系统内核也可方便地分配。
通过MMU可实现不连续的物理地址空间映射为连续的虚拟地址空间。
操作系统内核或者一些比较关键的代码,一般是不希望被用户应用程序访问。
通过MMU可以控制地址空间的访问权限,从而保护这些代码不被破坏。
MMU的实现过程,实际上就是一个查表映射的过程。
建立页表是实现MMU功能不可缺少的一步。
页表位于系统的内存中,页表的每一项对应于一个虚拟地址到物理地址的映射。
每一项的长度即是一个字的长度(在ARM中,一个字的长度被定义为4Bytes)。
页表项除完成虚拟地址到物理地址的映射功能之外,还定义了访问权限和缓冲特性等。
MMU的映射分为两种,一级页表的变换和二级页表变换。
两者的不同之处就是实现的变换地址空间大小不同。
一级页表变换支持1 M大小的存储空间的映射,而二级可以支持64 kB,4 kB 和1 kB大小地址空间的映射。
动态表(页表)的大小=表项数*每个表项所需的位数,即为整个内存空间建立索引表时,需要多大空间存放索引表本身。
表项数=虚拟地址空间/每页大小每个表项所需的位数=Log(实际页表数)+适当控制位数实际页表数=物理地址空间/每页大小5.3 parse_options()分析由内核引导程序发送给内核的启动选项,在初始化过程中按照某些选项运行,并将剩余部分传送给init进程。
这些选项可能已经存储在配置文件中,也可能是由用户在系统启动时敲入的。
但内核并不关心这些,这些细节都是内核引导程序关注的内容,嵌入式系统更是如此。
5.4 trap_init()这个函数用来做体系相关的中断处理的初始化,在该函数中调用__trap_init((void *)vectors_base())函数将exception vector设置到vectors_base开始的地址上。