您好,欢迎来到化拓教育网。
搜索
您的当前位置:首页嵌入式linux系统的启动过程

嵌入式linux系统的启动过程

来源:化拓教育网
一、分析嵌入式系统的启动过程 嵌入式系统的启动过程: 上电-—-—-——〉u-boot——-—-—-〉加载Linux内核—-—--—-〉挂载rootfs --—-〉执行应用程序 二、分析u—boot 1.什么是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 = 133333333 I2C: ready DRAM: 1 GiB ——————-——>内存1GB Heap = 0x44000000~0x46000000 Code = 0x43c00000~0x43c83e48 GLD = 0x43bffeb8 GLBD = 0x43bffe68 SP = 0x43bffe68,0x43bffe48(CURR) PC = 0x43c060 TAGS = 0x40000100 PAGE = 0x43c90000~0x43c9c000 MACH = [4330] VER = 0 BOARD= [x6818]

MMC: NXP DWMMC: 0, NXP DWMMC: 1, NXP DWMMC: 2 In: serial Out: serial Err: 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=270056 DRAW: 0x47000000 —> 0x46000000

DONE: Logo bmp 300 by 300 (3bpp), len=270056 DRAW: 0x47000000 —> 0x46000000 RGB: display。0 MIPI: display。0 DSIM_ESCMODE 1 : 0xc0 DSIM_STATUS : 0x10010f MIPI clk: 420MHz DSIM_ESCMODE 2 : 0x0 DSIM_STATUS : 0x10010f ## Skip BAT Animation。

## IRQ(0x48) : 0x00 0x00 0x00 0x00 0x00

## chg_type : ADP ## battery_vol : 0mV ## battery_cap : 100% ## Booting Card did not respond to voltage select! Net: x6818 eth init。。。 x6818 mac init。.. dwmac。c0060000 Hit any key to stop autoboot: 0 X6818# 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。c0060000 ethaddr = 00:e2:1c:ba:e8:60 current eth = dwmac。c0060000 ip_addr = 192。168.5。41 baudrate = 115200 bps TLB addr = 0x7FFF0000 relocaddr = 0x46000000 reloc off = 0x00000000 irq_sp = 0x7DF6BF00 sp start = 0x43BFFE68 DDR3的内存地址范围:0x40000000 ~ 0x7FFFFFFF X6818# printenv -——-——-—-——〉查看u—boot的环境变量 androidcrc=—411152780 baudrate=115200 bootargs=lcd=at070tn92 tp=gslx680—linux root=/dev/mmcblk0p2 rw rootfstype=ext4 bootcmd=ext4load mmc 2:1 0x48000000 uImage;bootm 0x48000000 bootdelay=5 bootfile=uImage ethact=dwmac.c0060000 ethaddr=00:e2:1c:ba:e8:60 -——-————>网卡的mac地址 ethprime=RTL8211 --——-——-〉网卡芯片的型号 fastboot=flash=mmc,2:ubootpak:2nd:0x200,0x78000;flash=mmc,2:2ndboot:2nd: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:misc:emmc:0x4E000000,0x00800000;flash=mmc,2:recovery:emmc:0x4E900000,0x01600000;flash=mmc,2:userdata:ext4:0x50000000,0x0; filesize=41ee8 gatewayip=192。168。5。1 ——-——-——-—〉网关 ipaddr=192。168。5.41 ———-————->板子的IP netmask=255.255.255。0 ——-—-——--〉子网掩码 serverip=192。168。5。40 -——-—-—-—>tftp服务器的IP stderr=serial stdin=serial stdout=serial Environment size: 846/327 bytes 关键的内容: (1)bootargs —--—-——〉 启动参数 bootargs=lcd=at070tn92 rootfstype=ext4 lcd=at070tn92 —-—————〉液晶屏的型号,800*480 tp=gslx680—linux —————-—-〉触摸屏的型号 root=/dev/mmcblk0p2 -----〉rootfs在哪里,告诉kernel去哪里挂载rootfs /dev/mmcblk0p2 -——-〉 mmcblk0 (emmc电子硬盘) p2(partion2,emmc电子硬盘的第二个分区) tp=gslx680-linux root=/dev/mmcblk0p2 rw rw rootfstype=ext4 ——————>rootfs是可读可写的,根文件系统的类型是ext4 练习:如何查看emmc电子硬盘有几个分区,以及设备的详细信息 答:到根目录去查看 cd /dev + ls —l 或者 ls -l /dev brw-rw—-—- 1 root root 179, 0 Jan 1 1970 mmcblk0 brw-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 mmcblk0p7 179 —-—-——-—〉主设备号 2 ———-—-—>次设备号, 设备号 = 主设备号〈〈20 + 次设备号 (2) bootcmd --—————>启动命令 bootcmd=ext4load mmc 2:1 0x48000000 uImage;bootm 0x48000000 以ext4文件系统格式去emmc的第一个分区加载Linux内核,加载到0x48000000地址上,然后在0x48000000地址上启动Linux内核. 通俗的理解:bootcmd告诉u-boot去哪里加载Linux内核,bootargs告诉linux内核,去哪里挂载rootfs。 (3) 修改启动延时时间 #setenv bootdelay 3 #saveenv 三、分析linux内核 1. linux的作用 (1)进程管理和进程通信:进程的创建和删除,进程的优先级抢占,进程的时间片轮转,进程间的通信机制 (2)内存管理:内存分配算法,每个进程的内存空间 (3)内核支持的文件系统:#cat /proc/filesystems (4)设备管理: ————-—>linux驱动--—->字符设备,块设备,网络设备,中断,内核时钟 (5)网络协议:如tcp/ip协议 2. GEC6818开发板 ———-——〉输出信息 GEC --—-—-— Guangdong Embedded Center (1)u-boot加载内核 ## Booting kernel from Legacy Image at 48000000 ..。 Image Name: Linux-3.4.39—gec —-—-—————————-———-——->linux内核版本 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 5533496 Bytes = 5。3 MiB Load Address: 40008000 -———--—————--———--—〉DDR3内存的地址 Entry Point: 40008000 Verifying Checksum .。。 OK Loading Kernel Image 。。。 OK Starting kernel .。。 (2)Linux内核启动 [ 0。000000] Booting Linux on physical CPU 0 (3)Linux内存管理 [ 0.000000] Memory: 1024MB = 1024MB total [ 0。000000] Memory: 810800k/810800k available, 237776k reserved, 272384K highmem [ 0。000000] Virtual kernel memory layout: [ 0。000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB) [ 0。000000] fixmap : 0xfff00000 - 0xfffe0000 ( 6 kB) [ 0。000000] vmalloc : 0xef800000 - 0xfee00000 ( 246 MB) [ 0.000000] lowmem : 0xc0000000 — 0xef600000 ( 758 MB) [ 0.000000] pkmap : 0xbfe00000 — 0xc0000000 ( 2 MB) [ 0.000000] modules : 0xbf000000 — 0xbfe00000 ( 14 MB) [ 0。000000] .text : 0xc0008000 - 0xc0a54188 (10545 kB) [ 0。000000] 。init : 0xc0a55000 - 0xc0a92100 ( 245 kB) [ 0.000000] 。data : 0xc0a94000 - 0xc0b2e488 ( 618 kB) [ 0。000000] .bss : 0xc0b2e4ac — 0xc0d0e1c8 (1920 kB) [ 0。000000] SLUB: Genslabs=11, HWalign=, Order=0-3, MinObjects=0, CPUs=8, Nodes=1

(4)设备管理

[ 0。207000] usbcore: registered new interface driver usbfs

[ 0。208000] i2c-gpio i2c—gpio.0: using pins 99 (SDA) and 98 (SCL)

[ 0.209000] s3c—i2c s3c2440-i2c。1: i2c-1: S3C I2C adapter [ 0.210000] s3c—i2c s3c2440—i2c。1: slave address 0x10

[ 0。210000] s3c-i2c s3c2440-i2c。1: bus frequency set to 195 KHz [ 0。211000] s3c-i2c s3c2440—i2c.2: i2c—2: S3C I2C adapter [ 0。211000] s3c—i2c s3c2440-i2c.2: slave address 0x10

[ 0.211000] s3c-i2c s3c2440—i2c。2: bus frequency set to 195 KHz

[ 0。212000] Linux video capture interface: v2。00

[ 0.223000] axp22_ldo1: 3000 mV

[ 0。353000] Display LCD register operation [ 0。354000] Display LVDS register operation [ 0。354000] Display MiPi register operation

(5)网络协议

[ 0。331000] NET: Registered protocol family 2

[ 0。331000] IP route cache hash table entries: 32768 (order: 5, 131072 bytes)

[ 0。332000] TCP established hash table entries: 131072 (order: 8, 1048576 bytes)

[ 0.334000] TCP bind hash table entries: 65536 (order: 8, 15728 bytes)

[ 0.336000] TCP: Hash tables configured (established 131072 bind 65536)

[ 0.336000] TCP: reno registered

[ 0.336000] UDP hash table entries: 512 (order: 3, 32768 bytes) [ 0.337000] UDP—Lite hash table entries: 512 (order: 3, 32768 bytes)

[ 0。337000] NET: Registered protocol family 1

(6)挂载rootfs

[ 3。959000] EXT4—fs (mmcblk0p2): mounted filesystem with ordered data mode。 Opts: (null)

[ 3。961000] VFS: Mounted root (ext4 filesystem) on device 179:2。

[ 3。968000] devtmpfs: mounted [ 3.970000] Freeing init memory: 244K

[ 3.974000] Write protecting the kernel text section c0008000 — c0a1e000

[ 3.981000] rodata_test: attempting to write to read-only section: [ 3.987000] write to read-only section trapped, success

[ 4。127000] EXT4—fs (mmcblk0p2): re—mounted。 Opts:

data=ordered 根文件系统在emmc的第2个分区上,根文件系统的格式是:ext4 四、分析rootfs(根文件系统) 1. 什么是rootfs Linux内核挂载的第一个文件系统,根文件系统是挂载到根目录下的文件系统.rootfs是一个\"包\",里面包含: [root@GEC6818 /]#ls IOT etc lost+found root sys usr bin lib mnt run var dev linuxrc proc sbin tmp 这些内容是什么? 五、执行应用程序 GEC6818平台 ——————-——> IOT (Internet of Things) rootfs挂载后—---—--—〉自动执行脚本 /etc/init。d/rcS —-————-->自动执行 /etc/profile -————————--—〉安装驱动 -——--——-——-->执行应用程序 vi /etc/profile, 注释掉最后三行

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务