Ads 468x60px

##EasyReadMore##

24 6月, 2017

Linker Script .lds 檔

一般來說,除非是要寫嵌入式系統,需要對執行檔的擺放位置做特別處理,否則大部分的程式都不會去改linker script,都直接用預設的組態檔下去跑就好了。

Linker script,就是給Linker 看的script。 Linker: 當然這樣是在講廢話,首先要先知道Linker 是什麼:在程式編譯成物件檔之後,會把所有 的物件檔集合起來交給連結器(linker),Linker 會把裡面的符號位址解析出來,定下真正的位址之後,連結成可執行檔。

例如我們在一個簡單的C 程式裡,include 一個標頭檔並使用裡面的函數,或者用extern 宣告一個外部的變數,在編譯成標頭檔的時候,編譯器並不清楚最終函數和變數的真正位址,因為只會留下一個符號參照。

NANDFlash需要与一个叫“Steppingstone”的内部SRAM配合工作(在所有的内存映射图上它叫BootSRAM),它是一个处理器内部自带的SRAM缓冲器,它把NANDFlash上4Kbyte启动代码加载,而这4K的SRAM buffer called ‘Steppingstone’会映射到0x00000000,在bootloader把主程序移到SDRAM以后他就可以被用到其他用途。

Steppingstone(SRAM, 並且映射至nGSC0)其實是內部就做好的,在開啟開發版(Reset)後會自動抓取nand前的4KB載入至Steppingstone(映射至nGSC0,0x00000000),CPU從0x00000000執行(其實是Steppingstone的SRAM),前4KB並不是指整個bootloader,而是只應射到steppingstone的內容必須小於4KB,之後,就是執行bootloader裡的內容,像是中斷、設置cpu速度與時鐘頻率、SDRAM初始化、LED初始化、複製bootloader‥等,然後是載入核心、檔案系統。

自启动模式的执行步骤如下:
(1)完成复位
(2)如果自动启动模式使能,NAND Flash存储器的前4KB自动复制到Steppingstone内部缓冲器;
(3)Steppingstone映射到nGCS0;
(4)CPU在Steppingstone的4KB内部缓冲器中开始执行启动代码。
注意:在自动启动模式下,不进行ECC检测。因此,应确保NAND Flash的前4KB不能有位错误(一般NAND Flash厂家都能确保)。


Steppingstone有點像是戰爭裡頭的第一槍,沒了這第一槍戰爭是打不起來的。

常用section的定義
text section:存放程序代碼
data section:存放數據
bss section:存放未初始化的數據,在鏡像文件中,是不為bss段分配空間的,所以如果你開一個很大的全局的未初始化的數組,鏡像文件的大小不會相應的變大。而只是在加載器將鏡像加載進內存時,才會為bss段分配空間
鏈接器:把各個目標文件的各種段進行重新組合。


語法請參考:

Yoda生活筆記: Linker script 簡介 - https://goo.gl/4smc88

u-boot.lds链接文件详解 - 软件开发程序员博客文章收藏网 - https://goo.gl/1NbkS7

參考

Linux 學習筆記: ARM的Flash啟動流程與機制(s3c2440) - https://goo.gl/1FReyQ

[隨筆]GNU linker script,ld script,GNU鏈接腳本- Lai18.com IT技術文章收藏夾 - https://goo.gl/szKQwH

0 意見:

張貼留言

 
Blogger Templates