linker script
lma = load memory address。装载地址
vma = vitual memory address。运行地址
預設lma和vma是相同的。
input section (*.obj)
output section(*.out or other executable file)
loadable section(程式執行時,可以從flash copy到ram裡執行的部份)
.text - Program Code (RO),存放code, function。
.data - Initialized Data (RW)。存放有初始化的全局變數。
.bss - Uninitialized Data (RW),存放沒有初始化的全局變數。
.rodata - Constants (RO),存放常數。
SECTIONS
{
. = 0x10000; /*程式放到這裡,從這個位址開始執行*/
.text : { *(.text) }
. = 0x8000000; /*數據、變數存放在這裡*/
.data : { *(.data) }
.bss : { *(.bss) }
}
若沒有指定output section的位址,就以當前位置計數器(location counter的值當做地址)。
*(.text)表示原始碼中所有code和function的部份。
在*.s中的起始點必需宣告成.global,否則系統找不到,例如:.global __ENTRY。
.text 0x30000000 :設定.text的VMA位址,執行時將代碼copy到0x30000000,程式才能正常運行。
AT(lma) :指定從哪載入程式。不是指生成output file裡的存放位置。
.data 0x31000000 : AT(LOADADDR(.text) + SIZEOF(.text)) 這句是說vma是0x31000000,但是生成檔案時,lma的位址是從.text的lma加上.text的大小,開始存放.data。
ADDR(.text)可以得到.text的vma位址。
Reference:
操作和查看mtd分区,需要三个环境变量partition, mtdids和mtdparts。
其中partition中存放当前的活动分区,mtdids是指内核mtd设备ID和u-boot设备id的映射
mtdparts存放分区表,这些环境变量的格式如下:
mtdids=nor0=nor0
mtdparts=mtdparts=nor0:192K(ucboot)ro,-(root)
partition=nor0,1
上述内容表示,内核中的nor0设备对应u-boot中的nor0闪存,该闪存被分为两个区,一个
大小为192K的只读ucboot分区,剩下部分是root分区,当前分区是nor0,1。