U Boot完美解讀 1 程式的布局和位址解析

2021-06-10 13:35:32 字數 3159 閱讀 9679

在網上看到n多「大牛」們的移植文件,什麼s3c2410,s3c6410,arm7,arm9的,一大堆一大堆,大致看了下,百分之九十以上的文章都是介紹了在哪兒修改**,至於為什麼這樣修改卻是隻字未提。當然,這樣的文件對於做產品是好樣的,因為產品只追求結果,開發人員如何實現,為什麼要這樣實現已經不重要了。所以,本系列計畫與大家分享移植如何實現,為什麼要這樣移植作詳細介紹,由於個人並非天才,所以在寫作過程中需要閱讀大量的datasheet,甚至於反覆讀,所以更新不會太快。當然如有不當之處,敬請各位不吝指正。

有過linux程式設計的朋友都知道,單一檔案可以直接通過gcc命令列方式進行,但如果有多個檔案或者是上百個以至於上千檔案的專案,用這種方式只能對他說一句「兄弟,我真的服咯u」。makefile提供了對原始檔進行管理的方式,通過檢視u-boot根目錄下的makefile檔案,可以看到u-boot的編譯過程。對於記憶體的管理,我們只需要關注最後的鏈結方式,在makefile中有如下部分:

$(obj)u-boot: depend $(subdirs) $(objs) $(libboard) $(libs) $(ldscript) $(obj)u-boot.lds

$(gen_uboot)

ifeq ($(config_kallsyms),y)

smap=`$(call system_map,u-boot) | \

awk '$$2 ~ /[ttww]/ '` ; \

$(cc) $(cflags) -dsystem_map="\"$$\"" \

-c common/system_map.c -o $(obj)common/system_map.o

$(gen_uboot) $(obj)common/system_map.o

endif

不知道有沒有看到乙個u-boot.lds呢,當然如果直接在原始碼中找的話,會找到一大堆的鏈結檔案,這個是需要配置的,需要移植到什麼樣的平台,可以檢視原始碼根目錄cpu/對應平台/u-boot.lds即可。如果目標板是arm的處理器,可以到cpu/arm926ejs、arm920t等目錄下查詢與處理器對應的檔案,如果是mips處理器,則對應到cpu/mips下查詢。相信學嵌入式的都是強人,所以此處略去三千字的說明。偷懶的感覺就是好,嘿嘿........

選擇乙個檔案開啟,這裡以cpu\arm_cortexa8\u-boot.lds為例,其它檔案類似。開啟檔案後,**並不多,加檔案說明、空行、括號都不足百行,是不是覺得有點竊喜呢?既然如此,親,我就直接把原始碼貼出來了喲,一會再逐個「包郵」喲!

output_format("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")

output_arch(arm)

entry(_start)

sections

. = align(4);

.rodata :

. = align(4);

.data :

. = align(4);

.got :

__u_boot_cmd_start = .;

.u_boot_cmd :

__u_boot_cmd_end = .;

. = align(4);

__bss_start = .;

.bss :

_end = .;

}

直接貼出上面的一段**,不知道親們看明白了多少呢?如果能很輕鬆過了,那只能說恭喜你,已經入門了,下面的內容請直接跳過。上一節賣了乙個關子,接下來針對不明白的親們進行逐行分析:

output_format("elf32-littlearm", "elf32-littlearm", "elf32-littlearm"")
該行**指定輸出的可執行檔案是elf格式(理解為二進位制的檔案就行),32位arm指令,其中處理器支援為小端(目前arm平台均為小端模式,大端與小端的差別請參考大小端位元組序)

output_arch(arm)
指定輸出可執行檔案的執行平台為arm處理器平台,當然如果為其它平台如mips,ppc等,這裡作相應的變更。

entry(_start)
指定輸出可執行檔案的起始**段為_start.

sections

其中.text是宣告為**段,在儲存裡的**段,資料段等分別用不同的符號說明,而cpu/arm_cortexa8/start.o (.text)是指定的乙個目錄,這裡是針對cortex-a8的平台,在對應u-boot根目錄下,可以找到所指的檔案,這裡說明引導檔案的位置在cpu/arm_cortexa8/下(由於u-boot對**組織結構進行調整,新u-boot位置位於arch/arm/cup/arm_cortexa8),對應start.s編譯後的目標檔案,start.s檔案將在下一節作詳細分析。

.rodata :
指定唯讀資料段,ro段。

.data :
指定讀/寫資料段,rw段。

.got :
指定got段, got段式是uboot自定義的乙個段, 非標準段。

__u_boot_cmd_start = .
右邊的「.」在前面有解釋,表示當前位置,這裡把__u_boot_cmd_start賦值為當前位置,即起始位置。

.u_boot_cmd :
指定u_boot_cmd段,,uboot把所有的uboot命令放在該段,除了uboot預設的命令外,可以自己增加新的命令,後面再作詳細介紹。

__u_boot_cmd_end = .
意思同上,把__u_boot_cmd_end賦值為當前位置,即結束位置。

__bss_start = .
把__bss_start賦值為當前位置,即bss段的開始位置,bss段的作用參見記憶體管理。

.bss :
指定bss段

_end = .

}

把_end賦值為當前位置,即bss段的結束位置,最後乙個括號表示定義的sectios段的結束

ok,本節提到的還留下幾個問題。

python 程式解讀 python的程式分析

profile模組和cprofile模組可以用來分析程式。它們的工作原理都一樣,唯一的區別是,cprofile模組是以c擴充套件的方式實現的,如此一來執行的速度也快了很多,也顯得比較流行。這兩個模組都可以用來收集覆蓋資訊 比如,有多少函式被執行了 也能夠收集效能資料。對乙個程式進行分析的最簡單的方法...

程式的記憶體布局

程序的記憶體布局 1.段 存放程式的可執行 2.唯讀資料段 ro data 存放不需要被更改的資料 3.已初始化讀寫資料段 rw data 存放在程式中宣告的,並且具有初始值的變數。程式執行時應位於可讀寫的區域,並具有初始值,以供程式執行時讀寫。4.未初始化資料段 bss 未初始化資料實在程式中宣告...

程式的記憶體布局

專題五 記憶體管理的藝術。包括以下章節 各個段的作用 堆疊段在程式執行後才正式存在,是程式執行的基礎.bss段存放的是未初始化的全域性變數和靜態變數.text段存放的是程式中的可執行 data段儲存的是那些已經初始化了的全域性變數和靜態變數.rodata段存放程式中的常量值,如字串常量竊以為 區域性...