移植uboot第二步:分析uboot
寫在前面:
我的博客已遷移至自建服務器:博客傳送門,CSDN博客暫時停止,如有機器學習方面的興趣,歡迎來看一看。
此外目前我在gitHub上準備一些李航的《統計學習方法》的實現算法,目標將書內算法全部手打實現,歡迎參觀并打星。GitHib傳送門
正文
1.在make的過程中,最后會顯示鏈接文件,如下
UNDEF_SYM=`arm-linux-objdump -x board/samsung/smdk2410/libsmdk2410.o api/libapi.o arch/arm/cpu/arm920t/libarm920t.o arch/arm/cpu/arm920t/s3c24x0/libs3c24x0.o arch/arm/lib/libarm.o common/libcommon.o disk/libdisk.o drivers/bios_emulator/libatibiosemu.o drivers/block/libblock.o drivers/dma/libdma.o drivers/fpga/libfpga.o drivers/gpio/libgpio.o drivers/hwmon/libhwmon.o drivers/i2c/libi2c.o drivers/input/libinput.o drivers/misc/libmisc.o drivers/mmc/libmmc.o drivers/mtd/libmtd.o drivers/mtd/nand/libnand.o drivers/mtd/onenand/libonenand.o drivers/mtd/spi/libspi_flash.o drivers/mtd/ubi/libubi.o drivers/net/libnet.o drivers/net/phy/libphy.o drivers/pci/libpci.o drivers/pcmcia/libpcmcia.o drivers/power/libpower.o drivers/rtc/librtc.o drivers/serial/libserial.o drivers/spi/libspi.o drivers/twserial/libtws.o drivers/usb/eth/libusb_eth.o drivers/usb/gadget/libusb_gadget.o drivers/usb/host/libusb_host.o drivers/usb/musb/libusb_musb.o drivers/usb/phy/libusb_phy.o drivers/usb/ulpi/libusb_ulpi.o drivers/video/libvideo.o drivers/watchdog/libwatchdog.o fs/cramfs/libcramfs.o fs/ext2/libext2fs.o fs/fat/libfat.o fs/fdos/libfdos.o fs/jffs2/libjffs2.o fs/reiserfs/libreiserfs.o fs/ubifs/libubifs.o fs/yaffs2/libyaffs2.o lib/libfdt/libfdt.o lib/libgeneric.o lib/lzma/liblzma.o lib/lzo/liblzo.o lib/zlib/libz.o net/libnet.o post/libpost.o | sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`; cd /work/system/u-boot-2012.04.01 && arm-linux-ld -pie -T u-boot.lds -Bstatic -Ttext 0x0 $UNDEF_SYM arch/arm/cpu/arm920t/start.o --start-group api/libapi.o arch/arm/cpu/arm920t/libarm920t.o arch/arm/cpu/arm920t/s3c24x0/libs3c24x0.o arch/arm/lib/libarm.o common/libcommon.o disk/libdisk.o drivers/bios_emulator/libatibiosemu.o drivers/block/libblock.o drivers/dma/libdma.o drivers/fpga/libfpga.o drivers/gpio/libgpio.o drivers/hwmon/libhwmon.o drivers/i2c/libi2c.o drivers/input/libinput.o drivers/misc/libmisc.o drivers/mmc/libmmc.o drivers/mtd/libmtd.o drivers/mtd/nand/libnand.o drivers/mtd/onenand/libonenand.o drivers/mtd/spi/libspi_flash.o drivers/mtd/ubi/libubi.o drivers/net/libnet.o drivers/net/phy/libphy.o drivers/pci/libpci.o drivers/pcmcia/libpcmcia.o drivers/power/libpower.o drivers/rtc/librtc.o drivers/serial/libserial.o drivers/spi/libspi.o drivers/twserial/libtws.o drivers/usb/eth/libusb_eth.o drivers/usb/gadget/libusb_gadget.o drivers/usb/host/libusb_host.o drivers/usb/musb/libusb_musb.o drivers/usb/phy/libusb_phy.o drivers/usb/ulpi/libusb_ulpi.o drivers/video/libvideo.o drivers/watchdog/libwatchdog.o fs/cramfs/libcramfs.o fs/ext2/libext2fs.o fs/fat/libfat.o fs/fdos/libfdos.o fs/jffs2/libjffs2.o fs/reiserfs/libreiserfs.o fs/ubifs/libubifs.o fs/yaffs2/libyaffs2.o lib/libfdt/libfdt.o lib/libgeneric.o lib/lzma/liblzma.o lib/lzo/liblzo.o lib/zlib/libz.o net/libnet.o post/libpost.o board/samsung/smdk2410/libsmdk2410.o --end-group /work/system/u-boot-2012.04.01/arch/arm/lib/eabi_compat.o -L /usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/armv4t -lgcc -Map u-boot.map -o u-boot其中 arm-linux-ld -pie -T u-boot.lds -Bstatic -Ttext 0x0 $UNDEF_SYM arch/arm/cpu/arm920t/start.o --start-group api/libapi.o arch/arm/cpu/arm920t/libarm920t.o 這句話就是鏈接,打開start.S,看看里面是什么內容。
2.分析start.S
1.進入管理模式,代碼開始執行,
5.進入call_board_init_f函數
這里初始化了一個指針,指向了棧的同一位置,他們并不沖突,棧是向下 增長的,指針是向上的。
可以看到存了一些數據進入,關于bss段以及一些其他信息的,還有很多gd的配置,沒有貼出來,占了挺大一段的
gd->mon_len = _bss_end_ofs;這里面有這句話,init_fnc_ptr 是一個指針,init_sequence是一個數組,里面有很多函數,這個for就是去循環執行這些函數
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {if ((*init_fnc_ptr)() != 0) {hang ();}}里面都是條件編譯,我把沒宏定義的代碼段都去掉了,留下的函數是執行函數,看起來比較方便
init_fnc_t *init_sequence[] = {#if defined(CONFIG_BOARD_EARLY_INIT_F)board_early_init_f, #endiftimer_init, /* initialize timer */ #endifenv_init, /* initialize environment */init_baudrate, /* initialze baudrate settings */serial_init, /* serial communications setup */console_init_f, /* stage 1 init of console */display_banner, /* say that we are here */ #if defined(CONFIG_DISPLAY_CPUINFO)print_cpuinfo, /* display cpu info (and speed) */ #endifdram_init, /* configure available RAM banks */NULL, };5.1 board_early_init_f,板子早期初始化函數
設置了分頻系數,有點奇怪匯編里面已經設置過了,我要去查一查兩個哪個是對的
5.2 在int timer_init(void)里面,有一個get_PCLK()函數被調用,再往里走get_HCLK(),再往里走
ulong get_HCLK(void) {struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power(); #ifdef CONFIG_S3C2440switch (readl(&clk_power->clkdivn) & 0x6) {default:case 0:return get_FCLK();case 2:return get_FCLK() / 2;case 4:return (readl(&clk_power->camdivn) & (1 << 9)) ?get_FCLK() / 8 : get_FCLK() / 4;case 6:return (readl(&clk_power->camdivn) & (1 << 8)) ?get_FCLK() / 6 : get_FCLK() / 3;}可以看出里面是有關于2440的宏定義的,當前并沒有被定義,所以之后要把這段代碼宏定義了,才能執行。
到這里已經有點懵逼了,uboot的代碼繞圈程度有點大了。要改的地方感覺挺多的,移植的難度應該會很大。
6.在board_init_f函數的最后面relocate_code(addr_sp, id, addr);重定位代碼。
在反匯編文件中一開始的代碼位置就是0,讓人感覺不需要重定位了。
實際上是鏈接的時候可以看到 arm-linux-ld -pie -T u-boot.lds -Bstatic -Ttext ,輸入命令arm-linux-ld --help | grep pie,搜索pie命令,回復-pie, --pic-executable Create a position independent executable,也就是說鏈接的時候加上pie可以生成位置無關的可執行程序。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的移植uboot第二步:分析uboot的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移植uboot第一步:下载,编译,烧到板
- 下一篇: 移植uboot第三步:修改时钟