嵌入式linux系统地启动过程
嵌入式启动流程 汇编代码解析
嵌入式启动流程:汇编代码解析1.加载引导程序嵌入式系统在加电后,第一个执行的程序通常是引导程序(Bootloader)。
它负责从存储设备中加载并执行后续的程序。
引导程序通常在启动时进行硬件设备的自检,然后从特定的存储位置(如闪存或RAM)加载后续程序。
引导程序通常使用汇编语言编写,因为它需要在硬件级别进行操作。
它负责初始化CPU、内存、硬盘等硬件设备,并确保系统环境满足后续程序的要求。
2.初始化硬件设备在引导程序之后,接下来的任务是初始化硬件设备。
这包括初始化CPU、内存、硬盘、显示器等设备。
初始化硬件设备的过程包括设置设备的寄存器、配置设备的接口等。
在这个过程中,硬件设备被配置为适合后续程序运行的状态。
3.设置内存管理器在硬件设备初始化完成后,接下来需要设置内存管理器。
内存管理器负责管理系统的内存资源,包括内存的分配、释放和保护。
内存管理器通常由操作系统内核提供,因此在加载操作系统内核之前,需要先初始化内存管理器。
4.加载操作系统内核在内存管理器初始化完成后,可以加载操作系统内核。
操作系统内核是系统的核心部分,负责管理系统资源、调度应用程序的运行等。
操作系统内核通常被压缩并保存在存储设备中,因此需要先解压缩并加载到内存中。
然后,内核会进行自身的初始化,包括设置系统时钟、配置设备驱动等。
5.启动内核并初始化系统服务在操作系统内核加载并初始化完成后,可以启动内核并初始化系统服务。
系统服务是指为应用程序提供支持的底层服务,如文件系统、网络服务等。
启动内核后,会执行一系列的系统初始化过程,包括设置系统环境变量、加载系统服务等。
这些过程完成后,系统就可以接受应用程序的请求并为其提供服务。
6.加载文件系统和应用程序在系统服务初始化完成后,可以加载文件系统和应用程序。
文件系统是存储和管理文件数据的系统,应用程序则是为用户提供服务的程序。
文件系统通常被加载到内存中,并初始化为可用的状态。
然后,可以按需加载应用程序到内存中并执行。
ARMLinux启动过程分析
Bo to d r o l a e 是嵌 入 式 系 统 的引导 加 载 程 序 , 是 系 它 L n s 统 上 电后运 行 的第一段 程 序, iu 其作 用类似 于 PC 机 上 的
T r ad 在 1 9 年开 发出来 的, 后在GNU的支持 下, ov ls 9 1 之
B1 。 完成 对系统 的初始 化任 务之 后, 0S 在 它会将 非 易失性 L n x 获得了巨大的发展 。虽然 L n x 在 桌面 P 机 存 储器 ( iu iu C 通常是 Fah D C 等) l 或 0 s 中的Ln x 内核 拷贝 iu 上 的普及程 度远 不及微软 的 Wid ws操作 系统 , no 但它的 到 RAM 中去 , 然后跳 转到 内核的第一 条指 令处继 续执 发 展速 度 之快 、 用户数 量的 日益增 多 , 是微软 所 不能 轻 行, 也 从而 启动 L n x 内核。 iu 视 的。 而近 些年来 L n x 在嵌 入式领 域 的迅猛 发 展, iu 更 由此可见, o t a e 和 L n x 内核有着密不可分 b ol d r o iu 是给 L n x 注入 了新 的活力。 iu 的联 系, 想清 楚的了解 L n x内核的启动 过程 , 要 iu 我们必
计算机 x
姚成强 木
【 内容 摘要 】 嵌 入 式 Ln x 的可移植性使得 我们可以在 各种 电子产品上看到 它的身影。 iu 对于
BootLoader启动过程分析
BootLoader启动过程分析一、 Boot Loader的概念和功能1、嵌入式Linux软件结构与分布在一般情况下嵌入式Linux系统中的软件主要分为以下及部分:(1)引导加载程序:其中包括内部ROM中的固化启动代码和Boot Loader两部分。
而这个内部固化ROM是厂家在芯片生产时候固化的,作用基本上是引导Boot Loader。
有的芯片比较复杂,比如Omap3,他在flash中没有代码的时候有许多启动方式:USB、UART 或以太网等等。
而S3C24x0则很简单,只有Norboot和Nandboot。
(2)Linux kernel 和drivers。
(3)文件系统。
包括根文件系统和建立于Flash内存设备之上的文件系统(EXT4、UBI、CRAMFS等等)。
它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好运行环境的载体。
(4)应用程序。
用户自定义的应用程序,存放于文件系统之中。
在Flash 存储器中,他们的一般分布如下:但是以上只是大部分情况下的分布,也有一些可能根文件系统是initramfs,被一起压缩到了内核映像里,或者没有Bootloader参数区,等等。
2、在嵌入式Linux中为什么要有BootLoader在linux内核的启动运行除了内核映像必须在主存的适当位置,CPU还必须具备一定的条件:【1】CPU寄存器设置:R0=0;R1=Machine ID(即Machine Type Number,定义在linux/arch/arm/tools/mach-types);R2=内核启动参数在RAM中起始基地址;【2】CPU模式:必须禁止中断(IRQs和FIQs);CPU 必须工作在是超级保护模式(SVC) 模式;【3】Cache和MMU的设置:MMU 必须关闭;指令Cache可以打开也可以关闭;数据Cache必须关闭;但是在CPU刚上电启动的时候,一般连内存控制器都没有配置过,根本无法在内存中运行程序,更不可能处在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. 加载系统服务:启动初始化会加载并启动系统服务,比如网络服务、日志服务、时间同步服务等。
嵌入式系统第七讲 嵌入式Linux系统启动分析
嵌入式LINUX内核的版本控制 (2)
嵌入式Linux的版本号后面还会加一个后缀,如 “rmk4-mx1bsp0.3.6” ,该后缀往往表示针对某 个开发平台的补丁。几个常用的后缀:
– – –
–
rmk:表示由Russell King维护的ARM Linux; np:表示由Nicolas Pitre维护的基于StrongARM和 Xscale的ARM Linux; ac:表示由Alan Cox(Alan Cox是仅次于Linus的 Linux维护人员,主要负责网络部分和OSS等的维护 工作)维护的Linux代码; hh : 表 示 由 网 站 发 布 的 ARM Linux代码,主要是基于Xscale的,它包括工具链 、内核补丁、嵌入式图形系统等。
Bootloader空间位置
在flash中的典型空间分配情况
BootLoader 的主要功能(1/2)
初始化系统在启动阶段必需的硬件设备; 准备后续软件系统(如操作系统)运行所需 的软件环境,如复制操作系统内核代码到 RAM中等。 向内核传递启动参数; [可选]配置系统各种参数;
BootLoader 的主要功能(2/2)
BootLoader的特点
BootLoader是操作系统内核运行前的核心程 序,它具有如下特点: 代码量大; 由C语言写成,大多数时候需要嵌入式汇编 语言; 运行于SDRAM等随机存储器 由于它是启动内核前运行的最后一个程序, 它必须把控制权交给内核,因此它最后是一 条跳转到系统内核的语句。
嵌入式LINUX的内核源代码结构 (1)
COPYING
– GPL版权申明。
CREDITS
– 光荣榜。对Linux做出过重大贡献的人员信息。
基于ARM处理器PXA270 & Linux的嵌入式系统的启动过程分析
公 司授权 的 、 使用 A M微 处理器 核 , 过 lt 优 化 R 经 ne l 过 的嵌 人式 C U Sa P 。X cl 理器 是 It e处 ne l目前 主要 推 广 的一 款 A M 微 处 理 器 。 而且 针 对 嵌 入 式 系 R 统 , Sae 构 引入 了 Pnim 处 理 器 工 艺 和 系 统 X cl 架 et u
I 的一个焦点 。并 对 各行 各业 的技术 改 造 、 品 T业 产 更新换 代 、 速 自动化进程 、 加 提高生 产率 等方 面起到 了极其重 要 的推动作 用 。嵌人式操 作系统 是嵌入 式 系 统 的核 心 , 在各 种嵌 入 式操 作 系统 中 , i x凭 借 Ln u 其在 结构 清晰 、 代码开 放性 、 源 易于开 发 、 能强 大 、 功 稳定 、 成本低 等方 面 的优 势 , 为了嵌入 式 系统 开发 成 的首选 , 并迅速 跻 身 于 主流 嵌入 式 开 发平 台。嵌 入
第2 7卷 第 6期 2 1 年 3月 01
甘肃科 技
Ga s ce c n e h oo y n u S in e a d T c n l g
’ 2 0 , 7
Ⅳ0 6 .
Ma. r
2 7 R X 2 O& L u i x的 n 嵌 入 式 系统 的启 动 过 程 分 析
P A 7 P , X 2 0 C U 配套 的存储 器 , 网卡等 设备 。底 板 主 要 是各种类 型 的接 口与扩展 口。
式 技术融 合 了具 体应用 技术 、 入式微 处理 器技术 、 嵌 系统 芯片 SC设 计 制造 技 术 、 用 电子 技术 和 嵌 入 o 应
式操作 系统 及应用 软 件 技术 , 有极 高 的系 统集 成 具 性 , 析并研究 启 动过 程 是 研究 并开 发 嵌 人式 系统 分 的很重 要 的环 节 , 进 行 嵌人 式 系统 的 内核 裁剪 和 是
嵌入式linux下inittab详解
嵌入式linux启动时运行的inittab文件嵌入式系统下的linux启动配置文件,不同与普通的PC linux启动配置,启动相关文件与文件的内容也要少得多。
嵌入式系统下的linux启动过程一般是:1 在bootloader中制定各种要求传给linux内核的参数,制作ramdisk或ramfs 文件系统,并在开机后首先mount上,该文件系统主要负责包含启动运行的配置文件,嵌入式系统主要是/etc/inittab和/etc/rc文件;2 在init进程启动后,进程首先执行/etc/inittab文件,该文件语法下面介绍,一般包括三项内容就可以启动。
其中主要的一项内容就是::sysinit:/etc/rc,目的是制定初始化要执行的脚本配置文件,在/etc/rc中则主要是配置系统;另一项内容是::respawn:-/usr/sbin/xxx,xxx一般为shell,最后一个重要的项是::shutdown:/bin/umount -a -r接下来的部分为转载/kernel_32/archive/2009/02/03/3860756.aspx首先介绍点背景知识,关于inittab的:init 进程是系统中所有进程的父进程,init进程繁衍出完成通常操作所需的子进程,这些操作包括:设置机器名、检查和安装磁盘及文件系统、启动系统日志、配置网络接口并启动网络和邮件服务,启动打印服务等。
Solaris中init进程的主要任务是按照inittab 文件所提供的信息创建进程,由于进行系统初始化的那些进程都由init创建,所以init 进程也称为系统初始化进程。
下面具体说明inittab文件的格式。
inittab文件中每一记录都从新的一行开始,每个记录项最多可有512个字符,每一项的格式通常如下:id:rstate:action:process,下面分别解释。
1.id字段是最多4个字符的字符串,用来唯一标志表项。
2.rstate(run state)字段定义该记录项被调用时的运行级别,rstate可以由一个或多个运行级别构成,也可以是空,空则代表运行级别0~6。
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 目录下。
嵌入式中busybox启动基本流程
一、BusyBoxBusyBox 是标准Linux 工具的一个单个可执行实现。
BusyBox 包含了一些简单的工具,例如cat 和echo,还包含了一些更大、更复杂的工具,例如grep、find、mount 以及telnet。
有些人将BusyBox 称为Linux 工具里的瑞士军刀.简单的说BusyBox就好像是个大工具箱,它集成压缩了Linux 的许多工具和命令。
嵌入式根目录下的bin、sbin和usr目录以及linuxrc通常就是BusyBox。
在构建嵌入式linux的根文件系统的时候,会根据目标平台配置BusyBox源码,编译生成这三个目录和一个文件。
根目录下的目录和文件需要自行建立或者从BusyBox的example中拷贝修改。
二、嵌入式中的BusyBox的启动流程脚本执行顺序如下:/sbin/init -> /etc/inittab -> /etc/init.d/rcS1、在kernel/init/main.c的init函数中有代码if (execute_command)execve(execute_command,argv_init,envp_init);execve("/sbin/init",argv_init,envp_init);bootloader会给内核的main函数init=/linuxrc 这个参数,于是就有了execute_command = "/linuxrc",busybox中_install目录下的linuxrc 是busybox的一个软链接,指向/bin/busybox,而/sbin/init也是/bin/busybox的符号链接,因此这个linuxrc基本没什么用处,我们不要这个linuxrc脚本可以直接通过/sbin/init执行busybox的初始化,或者重写linuxrc,添加自己的一些初始化的东西。
Linux启动过程分析
的基 础 工作 。
关键 词 :iu ;启 动 过 程 ; 作 系统 Ln x 操
中图 分 类 号 :F 1 . ;P 1 .2 T 36 8 T 3 15
文 献 标 识 码 : A
d i 1 .99 ji n 10 -45 200 0 .4 s
Lnxo r n ytm i t ai w r r ep ayigLnxkre, ut g u Ln xo rt gss m adf a y N Y i p a gss eb s okf e l a l n iu e l ctn t iu p an t n l a — u e t i e sh c o d yn z n i o e i y e n il
2 1 第 2期 0 0年 文章 编 号 :0 62 7 (0 0 0 -180 10 - 5 2 1 ) 205 -3 4
计 算 机 与 现 代 化 JS A lY I N A H A lU Ni U X A D I U
总第 14期 7
Ln x 动过 程 分析 iu 启
庞 国安 , 岳喜 顺
0 引
言
1 Ln x启 动 过 程 iu
当用 户通上 电 源 , C机 就 立 刻进 行 系 统硬 件 初 P
( 南理 工 大 学 自动 化 科 学 与 工程 学 院 , 东 广 州 5 0 4 ) 华 广 16 1
嵌入式程序执行流程
嵌入式程序执行流程嵌入式系统是一种专门设计用于特定应用领域的计算机系统,它通常被嵌入到各种设备中,如手机、汽车、家电等。
嵌入式系统的核心是嵌入式程序,它负责控制设备的各种功能和操作。
在嵌入式系统中,程序的执行流程是至关重要的,它直接影响着设备的性能和稳定性。
嵌入式程序执行流程通常包括以下几个关键步骤:1. 启动和初始化,当嵌入式系统上电或者重启时,首先会执行启动和初始化的过程。
这个过程包括硬件初始化、内存分配、外设初始化等操作,确保系统能够正常工作。
2. 软件加载,一旦系统初始化完成,嵌入式程序会被加载到系统中。
通常,嵌入式程序会被存储在闪存或者EEPROM等非易失性存储器中,然后通过引导程序加载到系统的内存中。
3. 程序执行,一旦程序被加载到内存中,CPU开始执行程序的指令。
程序的执行流程包括各种操作,如数据处理、控制流程、输入输出等,以实现设备的各种功能。
4. 中断处理,在程序执行的过程中,设备可能会产生各种中断,如定时器中断、外部设备中断等。
嵌入式系统需要及时响应这些中断,并执行相应的中断服务程序。
5. 系统关闭,当设备需要关闭时,嵌入式程序会执行相应的关闭操作,如保存数据、关闭外设等,最终将系统关闭。
嵌入式程序执行流程的设计和优化对于嵌入式系统的性能和稳定性至关重要。
合理的程序结构、高效的算法和良好的中断处理能力都是影响程序执行流程的关键因素。
同时,对于不同的嵌入式系统,其程序执行流程可能会有所不同,需要根据具体的应用需求进行定制和优化。
总之,嵌入式程序执行流程是嵌入式系统运行的核心,它直接关系到设备的功能实现和性能表现。
因此,在嵌入式系统设计和开发过程中,需要充分考虑和优化程序执行流程,以确保系统的稳定性和高效性。
计算机及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⽽是直接输出数据,则该程序⾃⾝就是⼀个简洁的"操作系统"。
嵌入式 实验13_1_Linux环境与命令
实验1 Linux环境与命令一、PC机Linux操作系统的启动1.启动虚拟机VB如下图所示,双击WINXP桌面上的Virtual Box图标,启动虚拟机。
虚拟机启动后的界面如下图所示:图所示。
3.打开操作终端双击左上角的“LXTerminal”图标,即可打开操作终端窗口,Linux的命令都是在这个窗口运行的。
操作终端可以打开多个。
二、练习Linux基本命令运行“LXTerminal”终端后,缺省目录是/home/ncut,这个可以通过运行命令“pwd”查看当前目录。
下面希望大家在操作窗口下练习Linux基本命令的使用,比如ls/cat/mkdir/rm/mv/chmod/cd/cp等命令,参见PPT或者使用“man cmd”来查看cmd的具体用法或者使用“cmd -h”来查看cmd的具体用法。
三、编辑器的使用Ubuntu下面编辑一个文件有两个选择:使用命令行vim和使用集成环境Geany。
建议大家两种方式都练习一下,练习内容是编辑以下的c文件:hello.hstarfun.hhello.cstar.c以下的几个c文件完成一个功能,目的是锻炼大家对多个c文件组成的程序的理解。
Starfun.h 文件内容如下:/*****starfun.h*****/#ifndef STARFUN_H#define STARFUN_H#define NUM 4#define NUMBER 3int star1() {int i,j,k;for(k=1;k<=NUM;++k) {for(i=1;i<=(NUM-k);++i)printf(" ");for(j=1;j<=(2*k-1);++j)printf("*");printf("\n");}return 0;}int star2() {int i,j,k;for(k=NUMBER;k>=0;--k) {for(i=1;i<=(NUMBER-k+1);++i)printf(" ");for(j=1;j<=(2*k-1);++j)printf("*");printf("\n");}return 0;}#endifhello.h文件内容如下:/*hello.h*/#ifndef HELLO_H#define HELLO_Hvoid hello() {star1();printf("hello,my friends\n");}#endifhello.c 文件内容如下:void showhello() {hello();}star.c文件内容如下:#include "starfun.h"#include "hello.h"#include <stdio.h>int main() {star1();star2();showhello();return 0;}vim编辑器的使用,可以参考PPT,在使用Vi编辑器的过程中,注意使用Vi的单行和多行复制命令,练习字符串查找替换命令,删除一个字符,删除光标后整个内容命令,删除一行命令,恢复删除,保存和退出命令等命令,并尝试使用其他命令。
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,它的作⽤是初始化系统环境。
嵌入式系统Boot Loader启动全过程详解
1. 引言在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行。
一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次:1. 引导加载程序。
包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分。
2. Linux 内核。
特定于嵌入式板子的定制内核以及内核的启动参数。
3. 文件系统。
包括根文件系统和建立于 Flash 内存设备之上文件系统。
通常用 ram disk 来作为 root fs。
4. 用户应用程序。
特定于用户的应用程序。
有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。
常用的嵌入式 GUI 有:MicroWindows 和 MiniGUI 懂。
引导加载程序是系统加电后运行的第一段软件代码。
回忆一下 PC 的体系结构我们可以知道,PC 机中的引导加载程序由 BIOS(其本质就是一段固件程序)和位于硬盘 MBR 中的 OS Boot Loader(比如,LILO 和 GRUB 等)一起组成。
BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的 Boot Loader 读到系统的 RAM 中,然后将控制权交给 OS Boot Loader。
Boot Loader 的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。
而在嵌入式系统中,通常并没有像 BIOS 那样的固件程序(注,有的嵌入式 CPU 也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由 Boot Loader 来完成。
比如在一个基于 ARM7TDMI core 的嵌入式系统中,系统在上电或复位时通常都从地址 0x00000000 处开始执行,而在这个地址处安排的通常就是系统的 Boot Loader 程序。
本文将从 Boot Loader 的概念、Boot Loader 的主要任务、Boot Loader 的框架结构以及 Boot Loader 的安装等四个方面来讨论嵌入式系统的 Boot Loader。
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分区后,第一个分区之前。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、分析嵌入式系统的启动过程嵌入式系统的启动过程:上电------->u-boot------->加载Linux内核------->挂载rootfs ---->执行应用程序二、分析u-boot1.什么是u-boot(是一个通用的bootloader)U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。
Universal ----------->通用的Boot ----------------->启动,引导Loader ----------------->加载通用------->支持多种架构的CPU,除了支持ARM系列的处理器外,还能支持MIPS、x86、Power PC、NIOS等诸多常用系列的处理器------->支持多种厂家的开发板,如cortex-A8,cortex-A9,cortex-A53等不同厂家的开发板------->支持多种嵌入式操作系统,U-Boot不仅仅支持嵌入式Linux系统的引导,它还支持Net BSD, Vx Works, QNX, RTEMS, ARTOS, Lynx OS, android嵌入式操作系统。
Boot -------->完成硬件的初始化,启动硬件平台。
Loader ------->当初始化硬件结束后,加载操作系统。
2.u-boot的作用大多数BootLoader都分为stage1和stage2两大部分,U-boot也不例外。
依赖于cpu体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。
(1)Stage1:CPU(S5P6818-->Cortex-A53)的初始化,使用汇编语言编写。
如:初始化Cache、MMU、clock、中断、看门狗、DDR3、eMMC、...(2)Stage2:板级初始化,使用C语言编写。
如:uart、网卡、usb、LCD、....(3)提供了一些工具,如进入uboot的命令行模式,使用u-boot命令(4)加载操作系统3.U-boot的工作模式U-Boot的工作模式有启动加载模式和下载模式。
(1)启动加载模式是Bootloader的正常工作模式,嵌入式产品发布时,Bootloader必须工作在这种模式下,Bootloader将嵌入式操作系统从FLASH中加载到SDRAM中运行,整个过程是自动的。
(2)下载模式就是Bootloader通过某些通信手段将内核映像或根文件系统映像等从PC机中下载到目标板的FLASH中。
用户可以利用Bootloader提供的一些命令接口来完成自己想要的操作。
4.U-boot的输出U-Boot 2014.07 (Apr 27 2017 - 15:45:25) -------->u-boot的版本号PLL : [0] = 800000000, [1] = 800000000, [2] = 780000000, [3] = 800000000(0) PLL1: CPU FCLK = 800000000, HCLK = 200000000 (G0)(7) PLL1: CPU FCLK = 800000000, HCLK = 200000000 (G1)(2) PLL3: MEM FCLK = 800000000, DCLK = 800000000, BCLK = 400000000, PCLK = 200000000(1) PLL0: BUS BCLK = 400000000, PCLK = 200000000(8) PLL0: CCI4 BCLK = 400000000, PCLK = 200000000(3) PLL0: G3D BCLK = 400000000(4) PLL0: CODA BCLK = 400000000, PCLK = 200000000(5) PLL0: DISP BCLK = 400000000, PCLK = 200000000(6) PLL0: HDMI PCLK = 133333333I2C: readyDRAM: 1 GiB --------->内存1GBHeap = 0x44000000~0x46000000Code = 0x43c00000~0x43c83e48GLD = 0x43bffeb8GLBD = 0x43bffe68SP = 0x43bffe68,0x43bffe48(CURR)PC = 0x43c06640TAGS = 0x40000100PAGE = 0x43c90000~0x43c9c000MACH = [4330]VER = 0BOARD= [x6818]MMC: NXP DWMMC: 0, NXP DWMMC: 1, NXP DWMMC: 2In: serialOut: serialErr: serial## DCDC_MODE(0x80): DCDC1[PFM], DCDC2[PFM], DCDC3[PFM], DCDC4[PWM], DCDC5[PWM]## STATUS(0x00) : 0xe4 0x10## IRQ(0x48) : 0x00 0x00 0x00 0x00 0x00## CHG_TYPE : ADP## BAT_VOL : 0mV## BAT_CAP : 100%DONE: Logo bmp 300 by 300 (3bpp), len=270056DRAW: 0x47000000 -> 0x46000000DONE: Logo bmp 300 by 300 (3bpp), len=270056DRAW: 0x47000000 -> 0x46000000RGB: display.0MIPI: display.0DSIM_ESCMODE 1 : 0xc0DSIM_STATUS : 0x10010fMIPI clk: 420MHzDSIM_ESCMODE 2 : 0x0DSIM_STATUS : 0x10010f## Skip BAT Animation.## IRQ(0x48) : 0x00 0x00 0x00 0x00 0x00## chg_type : ADP## battery_vol : 0mV## battery_cap : 100%## BootingCard did not respond to voltage select!Net: x6818 eth init...x6818 mac init...dwmac.c0060000Hit any key to stop autoboot: 0X6818#5.u-boot的信息X6818# bdinfo ----------->查看硬件平台的信息arch_number = 0x000010EA --------->u-boot针对具体硬件平台的ID boot_params = 0x40000100 ---------->u-boot传递给内存的启动参数DRAM bank = 0x00000000-> start = 0x40000000 --------->内存的开始地址-> size = 0x40000000 -------->内存的大小eth0name = dwmac.c0060000ethaddr = 00:e2:1c:ba:e8:60current eth = dwmac.c0060000ip_addr = 192.168.5.41baudrate = 115200 bpsTLB addr = 0x7FFF0000relocaddr = 0x46000000reloc off = 0x00000000irq_sp = 0x7DF6BF00sp start = 0x43BFFE68DDR3的内存地址范围:0x40000000 ~ 0x7FFFFFFFX6818# printenv ----------->查看u-boot的环境变量androidcrc=-411152780baudrate=115200bootargs=lcd=at070tn92 tp=gslx680-linux root=/dev/mmcblk0p2 rw rootfstype=ext4bootcmd=ext4load mmc 2:1 0x48000000 uImage;bootm 0x48000000bootdelay=5bootfile=uImageethact=dwmac.c0060000ethaddr=00:e2:1c:ba:e8:60 -------->网卡的mac地址ethprime=RTL8211 -------->网卡芯片的型号fastboot=flash=mmc,2:ubootpak:2nd:0x200,0x78000;flash=mmc,2:2ndboot:2 nd:0x200,0x4000;flash=mmc,2:bootloader:boot:0x8000,0x70000;flash=mmc, 2:boot:ext4:0x00100000,0x04000000;flash=mmc,2:system:ext4:0x04100000, 0x2F200000;flash=mmc,2:cache:ext4:0x33300000,0x1AC00000;flash=mmc,2:m isc:emmc:0x4E000000,0x00800000;flash=mmc,2:recovery:emmc:0x4E900000,0 x01600000;flash=mmc,2:userdata:ext4:0x50000000,0x0;filesize=41ee8gatewayip=192.168.5.1 ---------->网关ipaddr=192.168.5.41 --------->板子的IPnetmask=255.255.255.0 --------->子网掩码serverip=192.168.5.40 --------->tftp服务器的IP stderr=serialstdin=serialstdout=serialEnvironment size: 846/32764 bytes关键的内容:(1)bootargs -------> 启动参数bootargs=lcd=at070tn92 tp=gslx680-linux root=/dev/mmcblk0p2 rw rootfstype=ext4lcd=at070tn92 ------->液晶屏的型号,800*480tp=gslx680-linux -------->触摸屏的型号root=/dev/mmcblk0p2 ----->rootfs在哪里,告诉kernel去哪里挂载rootfs /dev/mmcblk0p2 ----> mmcblk0 (emmc电子硬盘)p2(partion2,emmc电子硬盘的第二个分区)rw rootfstype=ext4 ------>rootfs是可读可写的,根文件系统的类型是ext4练习:如何查看emmc电子硬盘有几个分区,以及设备的详细信息答:到根目录去查看 cd /dev + ls -l 或者 ls -l /devbrw-rw---- 1 root root 179, 0 Jan 1 1970 mmcblk0brw-rw---- 1 root root 179, 8 Jan 1 1970 mmcblk0boot0 brw-rw---- 1 root root 179, 16 Jan 1 1970 mmcblk0boot1 brw-rw---- 1 root root 179, 1 Jan 1 1970 mmcblk0p1 brw-rw---- 1 root root 179, 2 Jan 1 1970 mmcblk0p2 brw-rw---- 1 root root 179, 3 Jan 1 1970 mmcblk0p3 brw-rw---- 1 root root 179, 4 Jan 1 1970 mmcblk0p4 brw-rw---- 1 root root 179, 5 Jan 1 1970 mmcblk0p5 brw-rw---- 1 root root 179, 6 Jan 1 1970 mmcblk0p6 brw-rw---- 1 root root 179, 7 Jan 1 1970 mmcblk0p7179 -------->主设备号 2 ------->次设备号,设备号= 主设备号<<20 + 次设备号(2)bootcmd ------->启动命令bootcmd=ext4load mmc 2:1 0x48000000 uImage;bootm 0x48000000以ext4文件系统格式去emmc的第一个分区加载Linux内核,加载到0x48000000地址上,然后在0x48000000地址上启动Linux内核。