u-boot 裁剪分析

由于存储限制,需要将u-boot.bin控制在128K以下,并能正常引导系统,花了点时间研究了u-boot的结构组织,得出结论。


评估结论:

通过下面内容的分析,u-boot.Bin在支持本公司A项目所必须的功能后,将无法保证缩减到128KB的情况下且保证能够正常启动。

u-boot使用版本说明:
        u-boot用于评估的版本为合作公司发布的第一个u-boot版本,目录结构位于bootable\bootloader\uboot\Y1810下,编译的配置文件为comip_Y1810_config. 编译出来的u-boot.bin的大小81460Bytes。此版本针对源码已经做了大量的精简和裁剪,导致该u-boot并不适合我公司的开发需要。
         u-boot用于对比的完整版本为android4.0.3 sdmmc启动版本,最终编译出来的u-boot.bin大小为175764Bytes.


u-boot评估标准:
        通过在精简u-boot版本上加入我司此项目必须的功能后,是否uboot.bin的大小控制在128KB以下,且能够正常启动加载系统。


 精简u-boot版本源码中强制去掉的编译文件:
       通过比较源码,下面列出,本是源码中默认编译的文件,而联芯裁剪时在Makefile中强制去掉编译的C文件列表。


|-arch
||-arm
|||-lib ---_ashldi3.c
 ---_ashrdi3.c
 ---bootm.c
u-boot   |-common ---s_record.c
 ---xyzModem.c
 ---cmd_boot.c   //config_cmd_defaults.h有定义开关宏,这里强制去掉。
 ---ddr_spd.c
 ---flash.c
 ---cmd_bootm.c

|-lib ---net_utils.c


对比完整版本,相比精简u-boot版本多出的功能:
#define CONFIG_CMD_PING /* ping support */
#define CONFIG_CMD_USB /* USB Support */
#define CONFIG_CMD_CACHE /* icache, dcache */
#define CONFIG_CMD_EXT2 /* EXT2 Support */
#define CONFIG_CMD_FAT /* FAT support */
#define CONFIG_CMD_I2C /* I2C serial bus support */
#define CONFIG_CMD_RSTENV /* reset env */
以下定义在config_cmd_default.h中
#define CONFIG_CMD_BDI /* bdinfo */
#define CONFIG_CMD_BOOTD /* bootd */
#define CONFIG_CMD_CONSOLE /* coninfo */
#define CONFIG_CMD_ECHO /* echo arguments */
#define CONFIG_CMD_EDITENV /* editenv */
#define CONFIG_CMD_ITEST /* Integer (and string) test */
 
#define CONFIG_CMD_LOADB /* loadb */
#define CONFIG_CMD_LOADS /* loads */
#define CONFIG_CMD_MEMORY /* md mm nm mw cp cmp crc base loop mtest */
#define CONFIG_CMD_MISC /* Misc functions like sleep etc*/
#define CONFIG_CMD_NET /* bootp, tftpboot, rarpboot */
#define CONFIG_CMD_RUN /* run command in env variable */
#define CONFIG_CMD_SAVEENV /* saveenv */
#define CONFIG_CMD_SOURCE /* "source" command support */
#define CONFIG_CMD_XIMG /* Load part of Multi Image */


通过分析,我司必须增加的功能如下:
需要支持tftp下载kernel调试开发
#define CONFIG_CMD_PING /* ping support */
#define CONFIG_CMD_USB /* USB Support */
#define CONFIG_CMD_NET /* bootp, tftpboot, rarpboot */


环境变量的保存,编辑,恢复默认值
#define CONFIG_CMD_RSTENV /* reset env */
#define CONFIG_CMD_EDITENV /* editenv */
#define CONFIG_CMD_SAVEENV /* saveenv */

命令启动的支持,可选,用于处于边界大小的定位评估。
#define CONFIG_CMD_BOOTD /* bootd */
cache的支持,可选,用于处于边界大小的定位评估。
#define CONFIG_CMD_CACHE /* icache, dcache */


tftp下载kernel调试开发的增加:
编译完成后u-boot.bin将增加至125,868 Bytes,load到EVB板上,系统已经无法正常启动。步骤如下:
(1) 加入lib/net_utils.c的编译。


(2) 在common的Makefile加入如下:

ifdef CONFIG_CMD_USB
COBJS-y += cmd_usb.o
COBJS-y += usb.o
COBJS-$(CONFIG_USB_STORAGE) += usb_storage.o
Endif


(3) 在driver/usb/host/Makefile中加入

COBJS-$(CONFIG_USB_XX088X) += ehci-vc088x.o


(4) 在include/configs/comip_Y1810.h中加入如下定义

#define CONFIG_USB_XX088X               1
#define CONFIG_USB_EHCI                 1
#define CONFIG_USB_HOST_ETHER
#define CONFIG_USB_ETHER_SMSC95XX
#define CONFIG_CMD_PING
#define CONFIG_CMD_USB
#define CONFIG_CMD_NET
#define CONFIG_ETHADDR 00:1A:A9:53:F7:D8
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.0.23
#define CONFIG_SERVERIP 192.150.0.100


环境变量的增加:
编译完成后u-boot.bin将增加至131,948 Bytes
(1) 在include/configs/comip_Y1810.h中加入如下定义
#define CONFIG_ENV_IS_IN_MMC 1
#define CONFIG_SYS_MMC_ENV_DEV      0
#define CONFIG_CMD_RSTENV /* reset env */
#define CONFIG_CMD_EDITENV /* editenv */
#define CONFIG_CMD_SAVEENV /* saveenv */


(2) 在include/configs/comip_Y1810.h中去掉如下定义
  //#define CONFIG_ENV_IS_NOWHERE


到此步,u-boot.bin的大小已经超过128KB。
同时,为了验证SDMMC的u-boot是否通过裁掉不必要的功能,而能够缩减到128KB以下。最终结论为:只有去掉USB和NET的编译(同时去掉usbnet),u-boot.bin的大小减少50KB左右,才能将u-boot.bin降到128KB以下,且能够保证正常启动。
但是这样的话,u-boot.bin将不支持tftp下载kernel调试功能。
所以由于必须要支持TFTP下载kernel调试的功能,u-boot.bin将无法小于128KB。




你可能感兴趣的:(u-boot)