您好,登錄后才能下訂單哦!
歡迎文明轉載。
參考說明:文中有參考aven_paul博主的S5P4418啟動鏡像分析一文,具體參考http://blog.csdn.net/aven_paul/article/details/46772285
S5P4418是四核cortex-A9的SOC,這么強大的處理器非操作系統不能充分發揮其性能,但是對于打算深入了解和學習更好的使用它來說,裸機編程更能讓你了解從Power on -> internalRom --> boot mode choose --> Loading & Launch bootloader(BL1 --> BL2 )->......的詳細過程,更能體現從SOC到board再到program的層層銜接,絲絲相扣的嚴謹設計。本文由于使用nanoPi2硬件,只能使用SD作為boot源,因此以SD卡為基礎描述裸機編程的實現。
通過S5P4418啟動鏡像分析我們了解到。SD卡內的鏡像是這樣的,
Block 0
Sd/emmc卡信息
Block 1
Nsih.bin
Block2
2ndboot.bin
Block63
Nsih.bin
Block64
u-boot.bin
并有網友已經以把自己的程序.bin替換u-boot.bin的方式實現出來,見“點亮user Led”http://weibo.com/p/1001603914482173772682,同時文中給出了修改SD卡內絕對位置數據的方法,即使用winhex工具定位到絕對位置并修改。
根據網友的這些文章,我覺得應該能對裸機編程有個初步的概念,但是同時給我們帶來一些疑惑,而且2ndboot不提供源碼,對于我們希望刨根問底的人來說,總感覺缺少點東西不能把控,那可不可以把我們的程序直接替換2ndboot.bin來跑裸機呢?想到就馬上動手去試,不過還有些前提工作要做。
1. 找到2ndboot.bin被internalRom搬運到什么地方來Launch?
2. 如果用替代2ndboot.bin的方法來做的話,我們的bin最大可以做到多大呢?
帶著這些一文,我們還是要去官方手冊找答案
首先,我們要看看系統的memory map
看這個map,我們會發現InternalRAM的地址是0xFFFF0000,根據手冊我們知道InternalRAM有32KB。好,是不是InternalRom會把2ndboot的內容loading到這個地址來運行呢?為此我們重新編譯了“點亮user LED”的例子里的三個文件,只是將鏈接指令改為arm-linux-ld -Ttext=0xffff0000 start.o main.o -o main了。我們把生成的main.bin用winhex放到SD卡的block2也就是0x400位置,把卡插入nanoPi2的bootSD卡槽,上電,very good ,LED閃爍起來了。
是不是就完了呢?也許..吧,也許還沒有
既然能動了,我們也希望知道為什么
好,繼續看官方手冊第3章 System boot。由于我們使用的是 Internal ROM boot,使用SD卡啟動,因此切換到3.4.4節SDHCBOOT。
這個表格告訴我們,我們可以使用的是1to32block,我們的點亮LED的程序小于只有1k不到,所以不會超出范圍,下面紅框圈住的這句話,描述InternalROM將SD卡里的數據從Block1開始load到InternalRAM,我們的main.bin是寫入SD卡的block2來替代2ndboot的,按照道理應該是0xFFFF0000+0x200才是我們的main.bin的放置位置,我們將編譯器連接修改一下am-linux-ld -Ttext=0xFFFF0200 start.o main.o -o main。完整編譯后將main.bin用winhex寫入SD卡的0x400處,將卡插入nanoPi2,上電,LED開始閃爍,跟連接地址0xffff0000的效果一樣,這是為什么呢?
帶著疑問,我重新查看了start.s,發現內部用到的跳轉指令b start 和b main全部是相對位置跳轉。同時我繼續看官方手冊關于Nsih的相關說明。
原來,block1中存放的Nsih是遷移后的exception vector 。當系統reset后,通過exception vector 看到,其跳轉到Reset_Handler處。Reset_Handler指向向的是哪里呢?我們找打了官方的鏡像提取出其中Nsih信息后,發現,該地址正是0xFFFF0200。
也就是說,系統reset后通過InternalRom的加載,又經過exception vector的跳轉,跳到了我們的被InternalROM Load到InternalRAM中的地址中去的main.bin中來運行來了。
同時也就意味著,如果使用arm-linux-ld -Ttext=0xffff0000 是不妥的,一旦main.bin中出現絕對跳轉,程序將跑飛。
總結一下:要將自己的程序替換2ndboot來實現SD卡啟動的裸機編程
1. 將main.bin寫入SD卡的block2即0x400處;
2. 如果main.bin小于15KB,則編譯時的鏈接器的-Ttext=0xFFFF0200
3.2. 如果main.bin大于15kB(512*(32-1)),則需要先寫在0x400處寫入一個從main.bin中分離出的包含load其余代碼的小于15KB的部分,通過這個15k的代碼將main中其余的部分加載到內存,如果main.bin大于InternalRAM,則需要自己寫外部DRAM的代碼。這部分暫時不在本文中討論。
提交審核完了,發現粘貼進來得圖片都顯示不出來了,圖片基本來自手冊的截圖,所以編輯一下給出S5P4418的手冊鏈接供參考。http://wiki.friendlyarm.com/wiki/p_w_picpaths/3/3d/SEC_Users_Manual_S5P4418_Users_Manual_Preliminary_Ver.0.10.pdf
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。