嵌入式linux系统地启动过程
- 格式:doc
- 大小:34.33 KB
- 文档页数:9
嵌入式启动流程:汇编代码解析1.加载引导程序嵌入式系统在加电后,第一个执行的程序通常是引导程序(Bootloader)。
它负责从存储设备中加载并执行后续的程序。
引导程序通常在启动时进行硬件设备的自检,然后从特定的存储位置(如闪存或RAM)加载后续程序。
引导程序通常使用汇编语言编写,因为它需要在硬件级别进行操作。
它负责初始化CPU、内存、硬盘等硬件设备,并确保系统环境满足后续程序的要求。
2.初始化硬件设备在引导程序之后,接下来的任务是初始化硬件设备。
这包括初始化CPU、内存、硬盘、显示器等设备。
初始化硬件设备的过程包括设置设备的寄存器、配置设备的接口等。
在这个过程中,硬件设备被配置为适合后续程序运行的状态。
3.设置内存管理器在硬件设备初始化完成后,接下来需要设置内存管理器。
内存管理器负责管理系统的内存资源,包括内存的分配、释放和保护。
内存管理器通常由操作系统内核提供,因此在加载操作系统内核之前,需要先初始化内存管理器。
4.加载操作系统内核在内存管理器初始化完成后,可以加载操作系统内核。
操作系统内核是系统的核心部分,负责管理系统资源、调度应用程序的运行等。
操作系统内核通常被压缩并保存在存储设备中,因此需要先解压缩并加载到内存中。
然后,内核会进行自身的初始化,包括设置系统时钟、配置设备驱动等。
5.启动内核并初始化系统服务在操作系统内核加载并初始化完成后,可以启动内核并初始化系统服务。
系统服务是指为应用程序提供支持的底层服务,如文件系统、网络服务等。
启动内核后,会执行一系列的系统初始化过程,包括设置系统环境变量、加载系统服务等。
这些过程完成后,系统就可以接受应用程序的请求并为其提供服务。
6.加载文件系统和应用程序在系统服务初始化完成后,可以加载文件系统和应用程序。
文件系统是存储和管理文件数据的系统,应用程序则是为用户提供服务的程序。
文件系统通常被加载到内存中,并初始化为可用的状态。
然后,可以按需加载应用程序到内存中并执行。
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系统的启动流程一般包括以下几个步骤:
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启动时运行的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。
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 目录下。
一、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,添加自己的一些初始化的东西。
一、分析嵌入式系统的启动过程嵌入式系统的启动过程:上电------->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内核。