1.make的过程我说了个大概,大家可以参考一下前面的文章。现在准备分析代码吧,其实这个准备工作内容应该蛮多的。可能后面还要补充。
2.首先找到关键的bin文件啊,就是可以最终下载到flash,能启动的镜像。(没更新过,但是还是得知道是更新谁吧)
官网上找,看了所有得更新方法,都是把gzrom.bin下载到flash中。那不用怀疑,就是它了。
3.其实我们得Makefile中已经有,而且是可以正确编译出这个bin文件的。
这就是我们最终需要的文件。由rom这个目标生成的。
4.我有一个问题,它(gzrom.bin)是哪些源文件编译得出的?找到答案这样就对源代码有一个大概的认知。
4.1 从上图看,它由gzrom生成的。
4.2 从上图75行,gzrom由start.o和zloader.o 通过链接脚本合成的。 -e 指定入口函数
4.3 start.o 简单,由start.S生成。
4.4 zloader.o 由zloader.c 生成,下图示:
5.纳尼?转了半天,就这两个文件就生成了gzrom?????
zloader.c 文件也简单。。。难道就这么简单吗?
6.燃鹅,zloader.c还有隐藏操作。贴图来了。
上面两个图片是zloader.c包含的4个.c文件。看到这里就知道4.4步的图片上为什么编译这个文件还有几个c文件时依赖的原因了吧。。。。
还记不记得pmon.bin.c是自动生成的吧?
7. 追踪pmon.bin.c,这是zloader.o一个依赖,必须要生成的。
这里解释了pmon.bin.c是如何生成的。
7.1 pmon.bin.c依赖于pmon.bin,上一篇已经分析了
好的,我看到的是${LD}...这一行
这一行指定了pmon是如何链接生成的。由${LIBDIR}和 ${SYSTEM_OBJ}(这是个命令?)vers.o链接生成
找这两个变量 ,LIBDIR似乎没有找到定义,SYSTEM_OBJ倒是有:
这里看得出,PMON由哪些文件构成了。变量我就不一一展开了。
OBJS在新生成的Makefile中全部列出来了。实际还有包含了目录,详细请看Targets\Bonito3a3000_7a\compile\Bonito\Makefie
OBJS= wdc.o mainbus.o pcibr.o if.o if_ethersubr.o if_loop.o if_media.o \
radix.o raw_cb.o raw_usrreq.o route.o rtsock.o if_ether.o in.o \
in_cksum.o in_pcb.o in_proto.o ip_icmp.o ip_id.o ip_input.o \
ip_output.o raw_ip.o udp_usrreq.o tcp_debug.o tcp_input.o \
tcp_output.o tcp_subr.o tcp_timer.o tcp_usrreq.o kern_clock.o \
kern_misc.o kern_synch.o uipc_domain.o uipc_socket2.o \
kern_descrip.o kern_proc.o kern_syscall.o sys_generic.o \
subr_autoconf.o uipc_mbuf.o uipc_syscalls.o init_main.o \
kern_malloc.o kern_sig.o kern_time.o sys_socket.o uipc_socket.o \
bus_dma.o smbios.o uuid.o boot.o mycmd.o xyzModem.o crc16.o \
sysinfo.o newmt.o setup.o display.o test.o cmdtable.o \
debuggercmds.o devls.o cmd_go.o hist.o ifaddr.o oload.o load.o \
tftpd.o cmd_grub.o memcmds.o memtst.o miscmds.o pcicmds.o \
pflash.o cmd_env.o transp.o sym.o time.o shellcmds.o cmd_main.o \
window.o bootparam.o about.o autoconf.o callvec.o cmdparser.o \
debugger.o exception.o main.o more.o rsa.o sbrk.o env.o reset.o \
ramfile.o termio.o socket.o gzip.o iso9660fs.o devfs.o diskfs.o \
fatfs.o ext2fs.o dev_part.o loadfn.o exec.o exec_bin.o exec_elf.o \
exec_elf64.o exec_srec.o netio.o bootp.o ifconfig.o ping.o \
tftplib.o httplib.o debug.o decode.o fpu.o ops.o ops2.o \
prim_ops.o sys.o generic.o helper_exec.o helper_mem.o xf86int10.o \
xf86x86emu.o rs690_struct.o vesafb.o cfb_console.o kbd.o vgacon.o \
generic_poll.o flash.o flashdev.o flash_amd.o flash_int.o \
flash_sst.o flash_spi.o ns16550.o machdep.o mips_machdep.o \
disassemble.o mips.o cache.o usb.o usb_storage.o part.o \
usb-ohci.o usb_kbd.o cmd_usb.o xhci.o xhci-mem.o xhci-ring.o \
xhci-dwc3.o exec_txt.o menulist2f.o boot_cfg.o bootkernel.o fdt.o \
fdt_ro.o fdt_rw.o fdt_strerror.o fdt_wip.o password.o md5.o \
install.o save_ddrparam.o showwindows.o w83527_fan.o \
pci_machdep.o tgt_machdep.o ls7a_pci.o localbus.o eeprom.o \
spi_w.o dc.o i2c-gpio.o ltc.o usb_spi.o ls7a_gmac_mac_init.o \
load_dtb.o ls7a_dbg.o signal_test.o hda_test.o slt.o \
synopGMAC_Dev.o synopGMAC_network_interface.o \
synopGMAC_pci_bus_interface.o synopGMAC_plat.o dma_coherent.o \
mii.o pciconf.o pci_map.o pci.o if_em.o pciide.o ppb.o pcidevs.o \
ahci.o ahcisata.o ahci-sd.o ahci-cdrom.o wd.o ata_wdc.o ata.o \
cd.o
7.2 127行,把pmon.bin使用gzip压缩,形成pmon.bin.gz
7.3 128行,使用命令bin2c,将这个压缩文件生成一个c的数组。
8.总结一下吧:
8.1 首先应该是两个重要的文件start.S和zloader.c
8.2 其次是生成PMON对应的那一堆文件,这是个重点。
按照PMON的说明,这个PMON.bin.c最后会被解压到内存中继续运行。其实这里就分成了两个部分,一个是解压之前,文件相对较少,一个是解压之后,文件就比较多了。