中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

S5P4418裸機編程的實現(替換2ndboot)

發布時間:2020-07-22 11:18:42 來源:網絡 閱讀:630 作者:zhangfj2010 欄目:開發技術

              歡迎文明轉載。

              參考說明:文中有參考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

                          S5P4418裸機編程的實現(替換2ndboot)

           看這個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。

                       S5P4418裸機編程的實現(替換2ndboot)

S5P4418裸機編程的實現(替換2ndboot)

S5P4418裸機編程的實現(替換2ndboot)

S5P4418裸機編程的實現(替換2ndboot)

S5P4418裸機編程的實現(替換2ndboot)



S5P4418裸機編程的實現(替換2ndboot)

      這個表格告訴我們,我們可以使用的是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的相關說明。

S5P4418裸機編程的實現(替換2ndboot)

S5P4418裸機編程的實現(替換2ndboot)


原來,block1中存放的Nsih是遷移后的exception vector 。當系統reset后,通過exception vector 看到,其跳轉到Reset_Handler處。Reset_Handler指向向的是哪里呢?我們找打了官方的鏡像提取出其中Nsih信息后,發現,該地址正是0xFFFF0200。

S5P4418裸機編程的實現(替換2ndboot)

也就是說,系統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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

台前县| 林周县| 万源市| 鄱阳县| 会东县| 华坪县| 高唐县| 濉溪县| 赞皇县| 昭通市| 西峡县| 教育| 阜南县| 红河县| 通山县| 汉沽区| 韶关市| 德格县| 察哈| 孝义市| 海城市| 信阳市| 贡觉县| 乡城县| 陕西省| 措勤县| 临高县| 山阳县| 镇雄县| 仪陇县| 柘荣县| 芜湖市| 宁武县| 工布江达县| 万州区| 昆山市| 香港| 永吉县| 乐亭县| 乐山市| 泰顺县|