一、cpu訪問晶元時需要的條件:
1.位址線
2.資料線 8/16/32位寬
3.訪問速度 即時鐘相關
由儲存管理器負責管理
二、為什麼從addr2連線a0?
因為arm是32位處理器,所以它一次處理資料都是以32位為單位的,也就是說它讀或者寫資料時,位址只能為
0x0、0x04、0x08、。。。即4位元組對齊(位址0x0,0x1,0x2,0x3 分別對應8bit,0~3位址組成32位資料),但一般
sdram的資料線都為16位,所以為了得到32位的數
據,一般都是將2個sdram連在一起,並使用相同位址線,使
得cpu的乙個位址,可以傳輸來sdram的32位資料,所以這裡就存在乙個位址轉換問題,即使cpu的0~3位址裡
的資料(32位)對應
sdram
的0位址資料,cpu的4~7位址的資料對應
sdram
的1位址的資料,所以cpu的0位址
對應sdram
的0位址,0x04位址對應ddr中1位址,0x08位址對應
sdram
中2位址,可以看出,
sdram
的位址剛
好是cpu定址向右移動兩位,所以2440或2410中位址線都是從addr2開始連線的。2440晶元手冊中有連線例子。
三、彙編指令 bl 為絕對跳轉,在當前位址格式內的跳轉,返回值在 lr 暫存器中。
四、sdram 13個暫存器設定
bank6、bank7 為接sdram專用
refresh hclk : 12mhz 0x008c07a3
hclk :100mhz 0x008c04f4
五、nor flash 可以像記憶體一樣讀,但不能像記憶體一樣寫,所以程式在nor中執行時,也要重定位,使用新位址
訪問變數,檢視位址 arm-linux-ld -pie 在鏈結檔案中生成 rel 和 dynsym 段。
nand 啟動 0位址對應記憶體中0 ,nor啟動0位址對應nor中的0 。
六、bss段放初始化為0 或還沒初始化的全域性變數,為了節省空間,不寫到程式中。
七、除錯的時候,還想得到u-boot的反彙編**,修改頂層目錄makefile的239行:
all = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)system.map $(u_boot_nand)
===>
all = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)system.map$(obj)u-boot.dis$(u_boot_nand)
對應的修改2285行:
-o -name '*.srec' -o -name '*.bin' -o -name u-boot.img \) \
===>
-o -name '*.srec' -o -name '*.bin'-o -name u-boot.dis-o -name u-boot.img \) \
八、反彙編u-boot 在u-boot目錄下執行:
arm-linux-objdump -d u-boot> u-boot.dis
繼續執行 vi u-boot.dis 開啟反彙編檔案
九、#definedeclare_global_data_ptrregister volatile gd_t *gdasm("r8")
定義暫存器型別變數gd將其值存在r8r8 中,編譯時不會改變 fixed-r8
十、pie功能搜尋 arm-linux-ld --help | grep pie
生成位置無關**,用於放在何處都可執行的**,因上電時**還在記憶體或 nor flash 中,位址不是將代
碼重定向到 sdram 後的位址,重定向後的**應該在其鏈結位址上,不然會怎樣?
比如:訪問全域性變數時應該在某個鏈結位址上,若不在則會出錯。
十一、malloc 堆,在用malloc 函式時,是從 sdram 中分配一部分給程式用
u boot第一階段
u boot 第一階段 位置 cpu arm920t start.s 流程分析 1.儲存一些全域性變數,用於啟動程式將 從flash拷貝到ram或其他使用。有一些變數的值是通過鏈結指令碼得到的,如 text base 位於board 2440 config.mk 中 bss start end 位於...
UBOOT第一階段分析
感覺不錯的乙個圖就轉過來了!u boot第一階段的啟動流程。這個階段主要是初始化硬體裝置,為載入u boot的第二階段 準備ram空間最後跳轉到lib arm board.c中start armboot函式,這是第二階段的入口點。u boot第一階段的儲存器布局。上圖中u boot安裝在nand f...
u boot啟動流程 第一階段
具體分析參見另一篇blog 第一階段的啟動在.cpu arm920t start.s檔案中完成,之後執行c程式,對硬體進行更細緻的初始化操作 硬體初始化 設定svc模式 關閉watch dog 禁止irq 設定時鐘 fclk hclk pclk 禁止i cache d cache 禁止mmu和cac...