顯示具有 boot loader 標籤的文章。 顯示所有文章
顯示具有 boot loader 標籤的文章。 顯示所有文章

2024年5月29日 星期三

[ARM bootloader] 問題解說

 1. 組合語言和指令集是一樣的東西嗎? 網路上看到的一般在說x86或ARM的assembly好像就是在說指令集,但圖Assembly和Instruction set又是分開的,所以還是有差別?


關係像是這樣

Assembly Language -------------------Assembler----------> CPU Instruction set  







2. 講義.text section裡的有一行rodata.str1.4是什麼意思?

   .rodata.xxxx  區段也是 read only data, 但存的是程式中的常數 "字串" 
2.JPG


3. LMA load memory address我不太懂什麼時候會用到,應該是說不太知道10-118頁的ROM和RAM各是什麼角色,一般所謂的「load進memory」的memory都是指RAM嗎?

(1)ROM 存放程式的地方, RAM 執行程式的地方
但ROM這個硬體是CPU可以隨機定址的, 所以其實程式也可以在ROM上跑, 只要將程式中的變數copy 到RAM即可,但要將. text, .rodata 等也都copy到RAM也是可以的. 

(2)若VMA==LMA 則不用copy , 但VMA和LMA不同, 則要將 LMA (來源) copy 到 VMA(目的地)  
底下圖 就是VMA和LMA不同, 所以會有copy的動作
.
(3) load進memory==> memory是指RAM 




4. Linker startup code, boot.o負責copy和BSS清成0是否口誤,因為下一頁boot.o只有負責copy,start.o才是zero BSS,兩個是分開的

對, boot.o 的程式只負責copy而已




2022年11月5日 星期六

[Notepad ++]新增GNU ARM Assembly 語言格式

 

在Notepad ++編輯器新增GNU ARM Assembly 語言格式


1)下載  ASM for ARM GNU語言包 user defined languages


2) 在[語言]->[定義程式語言] 然後, 匯入ASM for ARM GNU 語言包



3) 匯入後可以再去修改, 例如, 原本ASM單行註解為只有 ; @ , 可再加入// (GNU GCC 是看得懂//為註解語法)

2022年5月30日 星期一

Disables dynamic cpufreq

 



Boot loader程式放入 Pi3中, 一開機剛開始跑的時候,LED 閃爍頻率都很正常 , 但大約經過約10秒左右 , 時間會變快 . 例如LED 0.5sec閃爍一次 , 經過10sec後變快小於0.5sec閃爍,是哪裡的設定需要再做調整修改 ?



#Disables dynamic cpufreq driver

add this line "force_turbo=1" to config.txt  . 

you can also google DVFS to get more information


2019年8月5日 星期一

[ARM Boot Loader ] code 說明


有個問題請教一下
Linker Start up code那個章節 56分:28秒的那一段
1. For broad com的bootloader,是不是也應該會把vector table copy to RAM 0x00的位置?
2. Power on and Reset 是一樣的嗎? 都會直接執行RAM上面0x00的位置? 還是Power on的時候會從走一次bootloader,然後copy vector table to RAM 0x00.
是會有誰把vector table copy過去才對。但影片中說reset一開始就跑0x00,0x00要有instructions.讓我聽得有點模糊。reset的時候 , RAM的內容都還保留著? 只有Power on and Power on的情況才會重新從bootloader copy vector table to RAM?

 每個系統有其 PowerOn 流程,如從ROM, EEPROM, NOR Flash或特定bootable devcie開機,而這些地方就是要先放好Exception Vector Table的地方,Power on 即觸發ARM Reset Exception , 故立即進行ARM Reset Handler 的工作。而這個Reset 工作的執行 (Stage 1 boot ),是屬於XIP (Excute In Place) ,即boot code是在ROM或Nor Flash 內被執行的。
Reset 工作初始化SDARM, SDRAM  , ROM 分別映射到CPU定址空間的一塊位址, 如SDRAM 位於 0x0, 若啓用CPU virtual address , 舉例 0x8000 (使用CPU virtual) 也是對應到SDRAM 。接著copy 一份完整的boot code 到SDRAM (頭幾行的內容當然也會是Exception Vector )。

將CPU的PC 指向ARM Reset Handler ( Stage 2 boot ) , 而此時的Reset Handler 是在SDRAM內。並且這時候的ARM Reset Handler 和前面一開始開機的ARM Reset 做不一樣的事了。前面ARM reset 可以只作少量的事, 後面的Reset 做更多事, 如驅動裝置,如 UART, LED, 等, 還有準備好OS載入的相關工作。



我想知道一般broadcom的bootloader,不含我們bootloader的流程。到底有沒有copy vector table to RAM 0x00,以及power on/off and reset是否一樣?

ARM Reset時, 做copy o RAM (可參考上課實作的程式碼)

 如果不一樣,是否power on/off, bootloader會重新copy vector table to RAM, 至於reset是用之前已經copy過存留在RAM的vector table.

  

還有一個問題,RAM and ROM share 相同的位置空間嗎? 不同空間 
課程中常提到 0x8000 and 0x0。這個位置 是RAM 還是 ROM。當我拿到一個位置的時候,我怎麼知道他是RAM還是ROM還是某個peripheral?
   
    0x8000 and 0x0 都可以對應到RAM 

   詳看SoC 晶片手冊..一般 memory map 會告訴你address指的是什麼....