1.zImageåuImageçåºå«
2.总结uboot的源码重要概念,不知道的源码看过来
3.嵌入式Linux之uboot源码make配置编译正向分析(一)
zImageåuImageçåºå«
ä¸ãvmlinuz
vmlinuzæ¯å¯å¼å¯¼çãå缩çå æ ¸ãâvmâ代表âVirtual MemoryâãLinux æ¯æèæå åï¼ä¸åèçæä½ç³»ç»æ¯å¦DOSæKBå åçéå¶ãLinuxè½å¤ä½¿ç¨ç¡¬ç空é´ä½ä¸ºèæå åï¼å æ¤å¾åâvmâã
vmlinuzç建ç«æ两ç§æ¹å¼ãä¸æ¯ç¼è¯å æ ¸æ¶éè¿âmake zImageâå建ï¼ç¶åéè¿:âcp /usr/src/linux-2.4/arch/i/linux/boot/zImage/boot/vmlinuzâ产çãzImageéç¨äºå°å æ ¸çæ åµï¼å®çåå¨æ¯ä¸ºäºååçå ¼å®¹æ§ã
äºæ¯å æ ¸ç¼è¯æ¶éè¿å½ä»¤make bzImageå建ï¼ç¶åéè¿:âcp/usr/src/linux-2.4/arch/i/linux/boot/bzImage /boot/vmlinuzâ产çãbzImageæ¯å缩çå æ ¸æ åï¼éè¦æ³¨æï¼bzImageä¸æ¯ç¨bzip2å缩çï¼bzImageä¸çbz容æå¼èµ·è¯¯è§£ï¼bz表示âbig zImageâã bzImageä¸çbæ¯âbigâææã zImage(vmlinuz)åbzImage(vmlinuz)é½æ¯ç¨gzipå缩çãå®ä»¬ä¸ä» æ¯ä¸ä¸ªå缩æ件ï¼èä¸å¨è¿ä¸¤ä¸ªæ件çå¼å¤´é¨åå åµæ gzip解å缩代ç ãæä»¥ä½ ä¸è½ç¨gunzip æ gzip âdc解å vmlinuzã
äºãinitrd-x.x.x.img
initrdæ¯âinitial ramdiskâçç®åãinitrdä¸è¬è¢«ç¨æ¥ä¸´æ¶çå¼å¯¼ç¡¬ä»¶å°å®é å æ ¸vmlinuzè½å¤æ¥ç®¡å¹¶ç»§ç»å¼å¯¼çç¶æã
initrdæ 象æ件æ¯ä½¿ç¨mkinitrdå建çãmkinitrdå®ç¨ç¨åºè½å¤å建initrdæ 象æ件ãè¿ä¸ªå½ä»¤æ¯RedHatä¸æçãå ¶å®Linuxåè¡çæ许æç¸åºçå½ä»¤ãè¿æ¯ä¸ªå¾æ¹ä¾¿çå®ç¨ç¨åºãå ·ä½æ åµè¯·ç帮å©:man mkinitrdä¸é¢çå½ä»¤å建initrdæ 象æ件ã
æåçæçå æ ¸é象æ两ç§zImage以åuImageãå ¶ä¸zImageä¸è½½å°ç®æ æ¿ä¸åï¼å¯ä»¥ç´æ¥ç¨ubootçå½ä»¤goæ¥è¿è¡ç´æ¥è·³è½¬ãè¿æ¶åå æ ¸ç´æ¥è§£åå¯å¨ãä½æ¯æ æ³æè½½æ件系ç»ï¼å 为goå½ä»¤æ²¡æå°å æ ¸éè¦çç¸å ³çå¯å¨åæ°ä¼ éç»å æ ¸ãä¼ éå¯å¨åæ°æä»¬å¿ é¡»ä½¿ç¨å½ä»¤bootmæ¥è¿è¡è·³è½¬ãBootmå½ä»¤è·³è½¬åªå¤çuImageçé象ã
ubootæºä»£ç çtools/ç®å½ä¸æmkimageå·¥å ·ï¼è¿ä¸ªå·¥å ·å¯ä»¥ç¨æ¥å¶ä½ä¸å缩æè å缩çå¤ç§å¯å¯å¨æ 象æ件ã
mkimageå¨å¶ä½æ 象æ件çæ¶åï¼æ¯å¨åæ¥çå¯æ§è¡æ 象æ件çåé¢å ä¸ä¸ä¸ª0xåèç头ï¼è®°å½åæ°ææå®çä¿¡æ¯ï¼è¿æ ·ubootæè½è¯å«è¿ä¸ªæ 象æ¯é对åªä¸ªCPUä½ç³»ç»æçï¼åªä¸ªOSçï¼åªç§ç±»åï¼å è½½å åä¸çåªä¸ªä½ç½®ï¼ å ¥å£ç¹å¨å åçé£ä¸ªä½ç½®ä»¥åæ 象åæ¯ä»ä¹
ç¨æ³å¦ä¸ï¼
./mkimage -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image
-A ==> set architecture to 'arch'
-O ==> set operating system to 'os'
-T ==> set image type to 'type'
-C ==> set compression type 'comp'
-a ==> set load address to 'addr' (hex)
-e ==> set entry point to 'ep' (hex)
-n ==> set image name to 'name'
-d ==> use image data from 'datafile'
-x ==> set XIP (execute in place)
åæ°è¯´æï¼
-A æå®CPUçä½ç³»ç»æï¼
åå¼ è¡¨ç¤ºçä½ç³»ç»æ
alpha Alpha
arm A RM
x Intel x
ia IA
mips MIPS
mips MIPS Bit
ppc PowerPC
s IBM S
sh SuperH
sparc SPARC
sparc SPARC Bit
mk MC
-O æå®æä½ç³»ç»ç±»åï¼å¯ä»¥å以ä¸å¼ï¼
openbsdãnetbsdãfreebsdã4_4bsdãlinuxãsvr4ãesixãsolarisãirixãscoãdellãncrãlynxosãvxworksãpsosãqnxãu-bootãrtemsãartos
-T æå®æ 象类åï¼å¯ä»¥å以ä¸å¼ï¼
standaloneãkernelãramdiskãmultiãfirmwareãscriptãfilesystem
-C æå®æ 象å缩æ¹å¼ï¼å¯ä»¥å以ä¸å¼ï¼
none ä¸å缩
gzip ç¨gzipçå缩æ¹å¼
bzip2 ç¨bzip2çå缩æ¹å¼
-a æå®æ 象å¨å åä¸çå è½½å°åï¼æ 象ä¸è½½å°å åä¸æ¶ï¼è¦æç §ç¨mkimageå¶ä½æ 象æ¶ï¼è¿ä¸ªåæ°ææå®çå°åå¼æ¥ä¸è½½
-e æå®æ 象è¿è¡çå ¥å£ç¹å°åï¼è¿ä¸ªå°åå°±æ¯-aåæ°æå®çå¼å ä¸0xï¼å 为åé¢æ个mkimageæ·»å ç0x个åèç头ï¼
-n æå®æ 象å
-d æå®å¶ä½æ 象çæºæ件
æå¨ç¼è¯æ¶ç¨å°çå½ä»¤å¦ä¸ï¼
# make zImage //çæzImageé象
ï¼/usr/local/arm/k9uboot/tools/mkimage -n 'Linux 2.4.' -A arm -O linux -T
kernel -C none -a 0xfc0 -e 0x -d zImage uImage
å æ ¸é象已ç»åå¤å¥½äºï¼è¿ä¸ªæ¶åæ们就è¦æ¥åå¤æ件系ç»äºãç±äºæ¶é´ç¼æ ï¼æ¬äººææ¶éç¨çæ¯å ¶ä»äººå·²ç»å¥½çæ件系ç»k9.img.gzãè¿ä¸ªæ¶åæ们è¦åçæ¯ï¼èªå·±åä¸ä¸ªç®åhello.cçç¨åºï¼ç¼è¯éè¿åå å ¥å°è¯¥æ件系ç»ä¸ï¼ç¶åä¸è½½å°ç®æ æ¿ä¸è¿è¡ã
å ç¼åhello.cï¼
ç¼è¯ï¼
#/usr/local/arm/2..3/bin/arm-linux-gcc âo start-hello hello.c
ç¼è¯åçæå¯æ§è¡æ件start-hello
ä¸é¢æä»¬å°±å¿ é¡»æ该æ§è¡æ件å å ¥å°æ件系ç»ä¸å»ï¼æ¥éª¤å¦ä¸ï¼
#gunzip k9.img.gz //解å缩
#mount âo loop k9.img /mnt/new_disk //æè½½
#cp start-hello /mnt/new_disk //å°æ件æ·è´å°æ件系ç»ä¸
#cd /mnt/new_disk
#umount /mnt/new_disk //å¸è½½
#gzip âc âv9 k9.img > k9.img.gz //å缩 çææç»çæ件系ç»
ä¸é¢æ们就è¦ä¸è½½å æ ¸ä»¥ååå¤å¥½æ件系ç»äºï¼è¿è¾¹å 说ææçå ååé æ åµå¦ä¸ï¼
Flashï¼
0x âââ 0x boot
0x âââ 0x uboot
0x âââ 0x uboot env
0x âââ 0x kernel
0x âââ 0x ramdisk
Sdramï¼
0xfc0 âââ 0xa kernel
0xa âââ ramdisk
Loadb éè¿ä¸²å£ä¸è½½æ°æ®å°ramä¸
cp.b æ·è´ramä¸çæ°æ®å°flashä¸ã
å°kernel以åæ件系ç»ramdiskä¸è½½å®æ¯ä¹åï¼æ们è¿éè¦è®¾ç½®ubootçç¯å¢åéï¼è¿æ ·ubootæè½å¤å¨ä¸çµå¯å¨çæ¶åå¯å¨å æ ¸çæä½ãç¯å¢åé设置å¦ä¸ï¼
Set cpfltoram cp.b a ffff //æ·è´æ件系ç»å°ramä¸
Set boot bootm fc0 //å¯å¨kernel
Set bootcmd run cpfltoker\;run cpfltoram\;run boot //ubootå¤ä½çæ§è¡æ令
Set cpfltoker cp.b fc0 f4fff //æ·è´å æ ¸å°ramä¸
Set bootargs root=/dev/ram rw initrd=0xa,4M init=/linuxrc console=ttyS0,
0,mem=m //ubootä¼ éç»å æ ¸çå¯å¨åæ°
对äºLinuxå æ ¸ï¼ç¼è¯å¯ä»¥çæä¸åæ ¼å¼çæ åæ件ï¼ä¾å¦ï¼
# make zImage
# make uImage
zImageæ¯ARM Linux常ç¨çä¸ç§å缩æ åæ件ï¼uImageæ¯U-bootä¸ç¨çæ åæ件ï¼å®æ¯å¨zImageä¹åå ä¸ä¸ä¸ªé¿åº¦ä¸º0xçâ头âï¼è¯´æè¿ä¸ªæ åæ件çç±»åãå è½½ä½ç½®ãçææ¶é´ã大å°çä¿¡æ¯ãæ¢å¥è¯è¯´ï¼å¦æç´æ¥ä»uImageç0xä½ç½®å¼å§æ§è¡ï¼zImageåuImage没æä»»ä½åºå«ãå¦å¤ï¼Linux2.4å æ ¸ä¸æ¯æuImageï¼Linux2.6å æ ¸å å ¥äºå¾å¤å¯¹åµå ¥å¼ç³»ç»çæ¯æï¼ä½æ¯uImageççæä¹éè¦è®¾ç½®ã
vmlinux ç¼è¯åºæ¥çæåå§çå æ ¸æ件ï¼æªå缩ã
zImage æ¯vmlinuxç»è¿gzipå缩åçæ件ã
bzImage bz表示âbig zImageâï¼ä¸æ¯ç¨bzip2å缩çã两è çä¸åä¹å¤å¨äºï¼zImage解å缩å æ ¸å°ä½ç«¯å å(第ä¸ä¸ªK)ï¼bzImage解å缩å æ ¸å°é«ç«¯å å(1M以ä¸)ãå¦æå æ ¸æ¯è¾å°ï¼é£ä¹éç¨zImageæbzImageé½è¡ï¼å¦ææ¯è¾å¤§åºè¯¥ç¨bzImageã
uImage U-bootä¸ç¨çæ åæ件ï¼å®æ¯å¨zImageä¹åå ä¸ä¸ä¸ªé¿åº¦ä¸º0xçtagã
vmlinuz æ¯bzImage/zImageæ件çæ·è´ææåbzImage/zImageçé¾æ¥ã
initrd æ¯âinitial ramdiskâçç®åãä¸è¬è¢«ç¨æ¥ä¸´æ¶çå¼å¯¼ç¡¬ä»¶å°å®é å æ ¸vmlinuzè½å¤æ¥ç®¡å¹¶ç»§ç»å¼å¯¼çç¶æã
vmlinuxæ¯å æ ¸æ件ï¼
zImageæ¯ä¸è¬æ åµä¸é»è®¤çå缩å æ ¸æ åæ件ï¼å缩vmlinuxï¼å ä¸ä¸æ®µè§£åå¯å¨ä»£ç å¾å°ï¼åªè½ä»0X0å°åè¿è¡ã
bzImageå¨uClinuxä¸å¾å°è§å°ã
uImageæ¯u-boot使ç¨bootmå½ä»¤å¼å¯¼çLinuxå缩å æ ¸æ åæä»¶æ ¼å¼ï¼
使ç¨å·¥å ·mkimage对æ®éçå缩å æ ¸æ åæ件ï¼zImageï¼å å·¥èå¾ãå¯ä»¥ç±bootmå½ä»¤ä»ä»»æå°å解åå¯å¨å æ ¸ã
ç±äºbootloaderä¸è¬è¦å ç¨0X0å°åï¼æ以ï¼uImageç¸æ¯zImageç好å¤å°±æ¯å¯ä»¥åbootloaderå ±åã
å¶ä½uImageçmkimage软件ï¼å¦æuClinux-distæçè¯ï¼ä¸è¬æ¾å¨uClinux-distçtoolsç®å½ä¸ã
总结uboot的重要概念,不知道的源码看过来
本篇内容不讲解uboot源码,只总结面试中高频问到的源码重要知识点。内容适用于嵌入式新人了解uboot,源码对老手有复习和查漏补缺的源码大军反击指标源码作用。
1、源码PC机启动:上电后,源码BIOS程序初始化DDR内存和硬盘,源码从硬盘读取OS镜像到DDR,源码跳转执行OS。源码
2、源码嵌入式Linux系统启动:上电后执行uboot,源码初始化DDR、源码Flash,源码将OS从Flash读到DDR,启动OS。canva设计源码
3、uboot定义与作用:uboot属于bootloader,作为单线程裸机程序,主要作用是初始化硬件、内存、flash等,引导内核启动。
4、instagram源码下载uboot启动阶段(不同平台差异):MTK平台:boot rom -> preloader -> lk -> kernel;RK平台:bootrom -> spl(miniloader) -> uboot -> trust -> kernel;NXP平台:bootrom -> bl2 -> ATF -> uboot -> kernel。
5、uboot支持多种启动方式:SPI Flash/eMMC/Nvme/SD/Hard Disk/U-Disk/net。启动方式不同,固件存放位置也不同。
6、掌握uboot的关键点:命令和环境变量。uboot启动后大部分工作在shell中完成,mybatis源码好难命令用于操作,环境变量如bootcmd和bootargs,用于设置启动参数。
7、bootargs参数详解:root用于指定rootfs位置,console用于设置控制台,mem用于指定内核使用内存大小,ramdisk_size用于设置ramdisk大小,1897溯源码initrd用于指定initrd参数,init用于指定启动脚本,mtdparts用于设置分区。
8、常用bootargs组合:文件系统为ramdisk、jffs2类型、nfs等不同情况下的bootargs设置示例。
总结,了解uboot是嵌入式开发的基础,掌握其启动过程和关键参数,对提高开发效率和解决问题有重要作用。
嵌入式Linux之uboot源码make配置编译正向分析(一)
嵌入式Linux系统由以下几部分组成:在Flash存储器中,它们的分布一般如下。Bootloader是操作系统运行之前执行的一段小程序,用于初始化硬件设备、建立内存空间映射表,为操作系统内核做准备。Bootloader依赖于CPU体系结构和嵌入式系统板级设备配置。u-boot支持多种架构,适用于上百种开发板。设计与实现包括工程简介、源码结构、编译过程、源码加载等。u-boot源码可以从ftp.denx.de/pub/u-boot/网站下载,DENX网站提供更多信息,u-boot git仓库位于gitlab.denx.de/u-boot/u...。u-boot编译分为配置和编译两步,需要指定交叉工具链、处理器架构。配置过程可以生成.config文件。源码加载使用Source Insight,安装、打开项目、共享文件夹、映射网络驱动器等步骤。