日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

移植uboot第二步:分析uboot

發布時間:2025/10/17 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 移植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.進入管理模式,代碼開始執行,

start_code:/** set the cpu to SVC32 mode*/mrs r0, cpsrbic r0, r0, #0x1forr r0, r0, #0xd3msr cpsr, r02.關閉看門狗 ldr r0, =pWTCONmov r1, #0x0str r1, [r0]3.屏蔽中斷 /** mask all IRQs by setting all bits in the INTMR - default*/mov r1, #0xffffffffldr r0, =INTMSKstr r1, [r0]4.設置分頻系數 /* FCLK:HCLK:PCLK = 1:2:4 *//* default FCLK is 120 MHz ! */ldr r0, =CLKDIVNmov r1, #3str r1, [r0]4.板子初始化,這里開始使用C函數,所以要初始化棧 call_board_init_f:ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)bic sp, sp, #7 /* 8-byte alignment for ABI compliance */ldr r0,=0x00000000bl board_init_f

5.進入call_board_init_f函數
這里初始化了一個指針,指向了棧的同一位置,他們并不沖突,棧是向下 增長的,指針是向上的。

gd = (gd_t *) ((CONFIG_SYS_INIT_SP_ADDR) & ~0x07);

可以看到存了一些數據進入,關于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,板子早期初始化函數
設置了分頻系數,有點奇怪匯編里面已經設置過了,我要去查一查兩個哪個是對的

writel(0xFFFFFF, &clk_power->locktime);/* configure MPLL */writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,&clk_power->mpllcon);/* some delay between MPLL and UPLL */pll_delay(4000);/* configure UPLL */writel((U_M_MDIV << 12) + (U_M_PDIV << 4) + U_M_SDIV,&clk_power->upllcon);GPIO端口的初始化 /* set up the I/O ports */writel(0x007FFFFF, &gpio->gpacon);writel(0x00044555, &gpio->gpbcon);writel(0x000007FF, &gpio->gpbup);writel(0xAAAAAAAA, &gpio->gpccon);writel(0x0000FFFF, &gpio->gpcup);writel(0xAAAAAAAA, &gpio->gpdcon);writel(0x0000FFFF, &gpio->gpdup);writel(0xAAAAAAAA, &gpio->gpecon);writel(0x0000FFFF, &gpio->gpeup);writel(0x000055AA, &gpio->gpfcon);writel(0x000000FF, &gpio->gpfup);writel(0xFF95FFBA, &gpio->gpgcon);writel(0x0000FFFF, &gpio->gpgup);writel(0x002AFAAA, &gpio->gphcon);writel(0x000007FF, &gpio->gphup);

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,讓人感覺不需要重定位了。

u-boot: file format elf32-littlearmDisassembly of section .text:00000000 <__image_copy_start>:0: ea000013 b 54 <start_code>4: e59ff014 ldr pc, [pc, #20] ; 20 <_undefined_instruction>8: e59ff014 ldr pc, [pc, #20] ; 24 <_software_interrupt>c: e59ff014 ldr pc, [pc, #20] ; 28 <_prefetch_abort>10: e59ff014 ldr pc, [pc, #20] ; 2c <_data_abort>14: e59ff014 ldr pc, [pc, #20] ; 30 <_not_used>18: e59ff014 ldr pc, [pc, #20] ; 34 <_irq>1c: e59ff014 ldr pc, [pc, #20] ; 38 <_fiq>00000020 <_undefined_instruction>:20: 000001e0 .word 0x000001e0

實際上是鏈接的時候可以看到 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。