![]() |
PCDVD數位科技討論區
(https://www.pcdvd.com.tw/index.php)
- 七嘴八舌異言堂
(https://www.pcdvd.com.tw/forumdisplay.php?f=12)
- - 請教高手 ARM linux kernel 的一個問題
(https://www.pcdvd.com.tw/showthread.php?t=937663)
|
---|
請教高手 ARM linux kernel 的一個問題
請問有沒有高手知道那個...
ARM linux zImage 格式, 一開始不都會執行 mov r0,r0 一共八次嗎? 為什麼要這樣做呢? 我都找不到相關文件解釋要這樣做的原因. 其實這不是很重要啦, 只是剛剛在改 kernel 時, 突然想到這個放很久的問題. 想說 PCDVD 臥虎藏龍, 應該有人會知道. :shy: :shy: :shy: :shy: :shy: :shy: |
ARM 的 mov r0,r0 好像是 NOP
NOP 大多是為了延遲時間, 另一個可能是預留位置. 沒做過 ARM 的菜鳥不負責猜測 :ase |
引用:
你跟我的猜想完全一樣, 實際上我是比較想看到這樣做的原始動機或典故. pipeline 那套 fetch, decode, execute 我知道, 但執行八次 nop 就很耐人尋味, 我個人比較傾向於保留用, 但我想要的不是猜想的答案. |
引用:
我不是ARM這方面專長的人, 不過不同客製化的ARM,如TI/Samsung/Freescale.....應該都有各自不同的技巧,以我的經驗來說就是不能說但大家都知道的秘密,像是之前的公司自己開發生產的MCU,assembly code當中一定會埋一堆NOP,如果好奇刪了這些NOP,一定會出一些奇奇怪怪的問題,而且NOP的數量也不能太多,也不能太少。 |
引用:
如果對整個系統的架構不清楚,有可能猜不出來。 舉個例子,可能會跟 boot loader memory re-map 的有關, 也有可能那段code 在 loader 那邊是一個 function table 之類的, 也有可能是原先是 interrupt table, ARM reset 之後從0開始跑, 從0 開始是 exception handler table , 如果沒弄清楚 boot 的過程, 可能會瞎子摸象 |
ARM 裡頭的Pipeline是靠NOP去flush. 開機時, pipeline裡頭的資料不可靠, 且 PC 已經指向 Execute段, 需要把所有pipeline弄到確定的狀況時才能啟動memory management
1. Fetch 2. Decode 3. Execute 4. Buffer 5. Write Back 啟動後就不用去搞這些ASM東西 |
引用:
真是奇怪的特性 不過, 這些應該在 bootloader 就會做的事, 在 linux 做不是很奇怪嗎? :confused: |
引用:
kernel解壓縮後在MMU起來前仍然是ASM, 意味著每種硬體平台都要有自己的一套啟動 MMU開啟後才能跑C ASM那段需要把Stack設定好, page table 設定好, 等等 小弟已經差不多10年沒有碰這個東西了, 或許有點生疏. 以前是玩工作站級的SGI IRIX跟 SunOS |
在arm論壇有人討論
可以參考 |
引用:
小弟淺見... 一般來說在linux kernel被載入之前會有boot loader. boot loader將linux載入後會call linux的start function. 但是這個start function未必是0x00的地方, 但是這個位置應該是由linker來決定.... -- 基本上當載入linux kernel已經算是非常後期...對崁入式系統來說.... 都有stack可用, 表是基本的相關硬體都已經弄好了. 而且就連最夯的u-boot大部分也都是用C在寫, 組合語言佔的比例真的很少很少了 |
所有的時間均為GMT +8。 現在的時間是06:29 AM. |
vBulletin Version 3.0.1
powered_by_vbulletin 2025。