您的位置:首页 > 编程语言

(补充)Uboot优美代码赏析1.1:分散加载表u-boot.lds

2011-09-29 01:24 483 查看
1.位置:board\samsung\smdk6410\u-boot.lds

2.内容分析:OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;

//代码段
. = ALIGN(4);
.text :
{
cpu/s3c64xx/start.o (.text)
cpu/s3c64xx/s3c6410/cpu_init.o (.text)
cpu/s3c64xx/onenand_cp.o (.text)
cpu/s3c64xx/nand_cp.o (.text)
cpu/s3c64xx/movi.o (.text)
*(.text)
lib_arm/div0.o
}

// const 常量数据段
. = ALIGN(4);
.rodata : { *(.rodata) }

// staitc/global 常量段
. = ALIGN(4);
.data : { *(.data) }

//这个未使用
. = ALIGN(4);
.got : { *(.got) }

//命令定义段
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;

//mmudata段 mmu_table
. = ALIGN(4);
.mmudata : { *(.mmudata) }

//堆栈段/内部临时变量段
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}

下面结合 编译后根目录下生成的u-boot.map和System.map分析:
3 .text 段分析只分析cpu/s3c64xx/start.o (.text)
u-boot.map中:Name Origin Length Attributes
cpu/s3c64xx/start.o(.text)
.text 0xc7e00000 0x480 cpu/s3c64xx/start.o
0xc7e00040 _end_vect
0xc7e0017c theLastJump
0xc7e00460 arm1136_cache_flush
0xc7e0004c _bss_start
0xc7e00050 _bss_end
0xc7e00048 _armboot_start
0xc7e00120 copy_from_nand
0xc7e00000 _start
cpu/s3c64xx/s3c6410/cpu_init.o(.text)
.text 0xc7e00480 0x15c cpu/s3c64xx/s3c6410/cpu_init.o
0xc7e005b0 cleanFlushCache
0xc7e005a4 cleanFlushDCache
0xc7e00480 mem_ctrl_asm_init
0xc7e00598 cleanDCache
cpu/s3c64xx/onenand_cp.o(.text)
.text 0xc7e005dc 0x0 cpu/s3c64xx/onenand_cp.o

其中cpu_init.o的起始地址0xc7e00480 - start.o的起始地址0xc7e00000 = start.o的长度0x480
start.o的起始地址定义在board\samsung\smdk6410\config.mk的TEXT_BASE

System.map中:c7e00000 T _start
c7e00020 t _undefined_instruction
c7e00024 t _software_interrupt
c7e00028 t _prefetch_abort
c7e0002c t _data_abort
c7e00030 t _not_used
c7e00034 t _irq
c7e00038 t _fiq
c7e0003c t _pad
c7e00040 T _end_vect
c7e00040 t _TEXT_BASE
c7e00044 t _TEXT_PHY_BASE
c7e00048 T _armboot_start
c7e0004c T _bss_start
c7e00050 T _bss_end
c7e00054 t reset
c7e00064 t cpu_init_crit
c7e000b8 t after_copy
c7e000b8 t enable_mmu
c7e000d8 t mmu_on
c7e000f4 t skip_hw_init
c7e000f4 t stack_setup
c7e000f8 t clear_bss
c7e00104 t clbss_l
c7e00118 t _start_armboot
c7e0011c t _mmu_table_base
c7e00120 T copy_from_nand
c7e0016c t copy_failed
c7e00174 t compare_failed
c7e0017c T theLastJump
c7e00198 t phy_last_jump
c7e001c0 t undefined_instruction
c7e00220 t software_interrupt
c7e00280 t prefetch_abort
c7e002e0 t data_abort
c7e00340 t not_used
c7e003a0 t irq
c7e00400 t fiq
c7e00460 T arm1136_cache_flush
c7e00480 T mem_ctrl_asm_init

T代表是public的,t代表是local/static的

4.其他段的定义和生成逻辑同理通过u-boot.map去查

.text 段存放代码.o (.text)的起始地址,长度,与未声明为static的函数符号地址(同上)
.rodata 段存放声明为const的变量及其他预先声明在等号右边的字串数据(.rodata.str1.1 )

.rodata 0xc7e238a4 0x33 lib_arm/libarm.a(board.o)
0xc7e238a4 version_string
.rodata.str1.1
0xc7e245c8 0x78 lib_arm/libarm.a(board.o)
0x7a (size before relaxing)

.data 数据存放那些全局定义的变量

.data 0xc7e2a5a4 0x34 lib_arm/libarm.a(board.o)
0xc7e2a5a4 init_sequence

.bss 需要进堆或进栈去申请的数据

.bss 0xc7e3400c 0x10 lib_arm/libarm.a(board.o)
0xc7e34018 monitor_flash_len
.bss 0xc7e3401c 0x25cc net/libnet.a(net.o)
0xc7e34078 NetArpWaitTry
0xc7e34054 NetArpWaitPacketMAC
0xc7e3402c NetOurEther
0xc7e34028 NetOurIP
0xc7e34034 NetPingIP
0xc7e34060 NetServerIP
0xc7e3405c NetArpWaitTxPacketSize
0xc7e34048 NetArpWaitReplyIP
0xc7e34058 NetArpWaitTxPacket
0xc7e35eac NetRxPackets
0xc7e364e4 NetOurNISDomain
0xc7e3403c NetArpWaitPacketIP
0xc7e3401c NetState
0xc7e36566 BootFile
0xc7e34064 NetServerEther
0xc7e34040 NetOurSubnetMask
0xc7e36564 NetBootFileSize
0xc7e34024 NetIPID
0xc7e36504 NetOurHostName
0xc7e3404c NetRxPkt
0xc7e34044 NetOurGatewayIP
0xc7e34070 NetEtherNullAddr
0xc7e35ebc NetArpWaitPacketBuf
0xc7e34050 NetRxPktLen
0xc7e34038 NetTxPacket
0xc7e364dc NetBootFileXferSize
0xc7e364e0 NetOurDNSIP
0xc7e3408c PktBuf
0xc7e36524 NetOurRootPath
0xc7e3407c NetArpWaitTimerStart

5。下面重点说说.u_boot_cmd段:

先看u-boot.map中生成:

0xc7e2c980 __u_boot_cmd_start = .

.u_boot_cmd 0xc7e2c980 0x480
*(.u_boot_cmd)
.u_boot_cmd 0xc7e2c980 0x18 common/libcommon.a(cmd_bdinfo.o)
0xc7e2c980 __u_boot_cmd_bdinfo
.u_boot_cmd 0xc7e2c998 0x30 common/libcommon.a(cmd_boot.o)
0xc7e2c9b0 __u_boot_cmd_reset
0xc7e2c998 __u_boot_cmd_go
.u_boot_cmd 0xc7e2c9c8 0x30 common/libcommon.a(cmd_bootm.o)
0xc7e2c9c8 __u_boot_cmd_bootm
0xc7e2c9e0 __u_boot_cmd_imls
.u_boot_cmd 0xc7e2c9f8 0x48 common/libcommon.a(cmd_cache.o)
0xc7e2ca10 __u_boot_cmd_dcache
0xc7e2ca28 __u_boot_cmd_branch
0xc7e2c9f8 __u_boot_cmd_icache
.u_boot_cmd 0xc7e2ca40 0x18 common/libcommon.a(cmd_date.o)
0xc7e2ca40 __u_boot_cmd_date
.u_boot_cmd 0xc7e2ca58 0x30 common/libcommon.a(cmd_elf.o)
0xc7e2ca70 __u_boot_cmd_bootvx
0xc7e2ca58 __u_boot_cmd_bootelf
.u_boot_cmd 0xc7e2ca88 0x48 common/libcommon.a(cmd_flash.o)
0xc7e2ca88 __u_boot_cmd_flinfo
0xc7e2caa0 __u_boot_cmd_erase
0xc7e2cab8 __u_boot_cmd_protect
.u_boot_cmd 0xc7e2cad0 0x18 common/libcommon.a(cmd_itest.o)
0xc7e2cad0 __u_boot_cmd_itest
.u_boot_cmd 0xc7e2cae8 0x48 common/libcommon.a(cmd_load.o)
0xc7e2cb18 __u_boot_cmd_loady
0xc7e2cb00 __u_boot_cmd_loadb
0xc7e2cae8 __u_boot_cmd_loads
.u_boot_cmd 0xc7e2cb30 0xf0 common/libcommon.a(cmd_mem.o)
0xc7e2cb30 __u_boot_cmd_md
0xc7e2cba8 __u_boot_cmd_cmp
0xc7e2cb78 __u_boot_cmd_mw
0xc7e2cbf0 __u_boot_cmd_loop
0xc7e2cbd8 __u_boot_cmd_base
0xc7e2cb48 __u_boot_cmd_mm
0xc7e2cbc0 __u_boot_cmd_crc32
0xc7e2cb60 __u_boot_cmd_nm
0xc7e2cc08 __u_boot_cmd_mtest
0xc7e2cb90 __u_boot_cmd_cp
.u_boot_cmd 0xc7e2cc20 0x18 common/libcommon.a(cmd_misc.o)
0xc7e2cc20 __u_boot_cmd_sleep
.u_boot_cmd 0xc7e2cc38 0x30 common/libcommon.a(cmd_nand.o)
0xc7e2cc38 __u_boot_cmd_nand
0xc7e2cc50 __u_boot_cmd_nboot
.u_boot_cmd 0xc7e2cc68 0x78 common/libcommon.a(cmd_net.o)
0xc7e2ccb0 __u_boot_cmd_nfs
0xc7e2ccc8 __u_boot_cmd_ping
0xc7e2cc98 __u_boot_cmd_rarpboot
0xc7e2cc80 __u_boot_cmd_tftpboot
0xc7e2cc68 __u_boot_cmd_bootp
.u_boot_cmd 0xc7e2cce0 0x48 common/libcommon.a(cmd_nvedit.o)
0xc7e2cd10 __u_boot_cmd_saveenv
0xc7e2cce0 __u_boot_cmd_printenv
0xc7e2ccf8 __u_boot_cmd_setenv
.u_boot_cmd 0xc7e2cd28 0x30 common/libcommon.a(cmd_usb.o)
0xc7e2cd28 __u_boot_cmd_usb
0xc7e2cd40 __u_boot_cmd_usbboot
.u_boot_cmd 0xc7e2cd58 0x90 common/libcommon.a(command.o)
0xc7e2cda0 __u_boot_cmd_exit
0xc7e2cd70 __u_boot_cmd_echo
0xc7e2cdd0 __u_boot_cmd_question_mark
0xc7e2cd58 __u_boot_cmd_version
0xc7e2cdb8 __u_boot_cmd_help
0xc7e2cd88 __u_boot_cmd_test
.u_boot_cmd 0xc7e2cde8 0x18 common/libcommon.a(cmd_usbd.o)
0xc7e2cde8 __u_boot_cmd_dnw
0xc7e2ce00 __u_boot_cmd_end = .
0xc7e2ce00 . = ALIGN (0x4) 在include/command.h中,

#define Struct_Section __attribute__ ((unused,section (".u_boot_cmd")))

#ifdef CFG_LONGHELP

#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help}

#else /* no long help info */

#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage}

#endif /* CFG_LONGHELP */ 所以我们新增指令后直接用U_BOOT_CMD声明,即可将数据放入.u_boot_cmd段,搜索段开始标志符__u_boot_cmd_start和段结束标志符__u_boot_cmd_end,得到此段数据的检测位于:command.c中的find_cmd,执行的入口位于:common/main.c中的run_command函数,此函数的调用位于uboot主循环main_loop的for (;;){……} 代码段内。
作者:Anpher Zhang QQ:275000205 转载请注明出处:http://www.cnblogs.com/zhangsufeng/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: