為了提高學習效率,我們要提前想好學習策略。
首先,使用頻率越高的知識點,越要首先學習。假使,我們學習了一個知識點,能覆蓋工作中80%的工作量,那是不是很夸張的學習效率?!
其次,有兩種覆蓋知識點,梳理知識點的策略。一種是將知識按體系劃分,挨個學習,系統(tǒng)學習。具體而形象的學習樣板就是教科書。第一章,第二章等等,挨個分支學習、梳理。如果我們要講述應題的知識,就要按寄存器、計算機工作原理、匯編指令、內(nèi)核架構分體系去挨個講解。還有一種策略就是面對問題。比如,我們首先提出一個問題:“函數(shù)調用,從C語言到匯編,再到CPU內(nèi)核,以及寄存器的工作表現(xiàn)是怎樣實現(xiàn)的”,如果我們把這個問題講解清楚,就要把各個牽涉的體系知識揉到一起講解。第二種策略,似乎更能把使用頻率高的知識點串一起,一起學習。是我們面對工程應用更好的學習策略。因為我們不是做研究?。∪绻?,我們用第二種工作策略,感覺收益不大了(因為使用頻率低的,這種學習方式我們不易接觸到,無法高效率補充知識盲點)。那么我們就應該更換第一中學習策略了,補充知識盲點,系統(tǒng)學習,系統(tǒng)梳理。
ok,我們采用第二種策略開始學習。
函數(shù)的調用
要實現(xiàn)函數(shù)調用,有至少要有四步:
- 壓棧,保護當前函數(shù)現(xiàn)場。
- 跳轉,實現(xiàn)函數(shù)跳轉。
a. 讀參數(shù)
b. 運算、運行
c. 返回結果 - 跳轉,返回父級函數(shù)。
- 出棧,恢復現(xiàn)場。
用實例,來對應感受一下。
對應的匯編
可見,套路既是:
5. 壓棧,保護當前函數(shù)現(xiàn)場。 { PUSH 或者 LDR } sp寄存器,Rx寄存器
6. 跳轉,實現(xiàn)函數(shù)跳轉。{B、BL、BX},對應給PC寄存器賦值
a. 讀參數(shù) (出?!緩臈Wx取】、或者R0、R1)
b. 運算、運行 (ADD等)
c. 返回結果(壓?!緩臈14妗?,或者R0、R1)
7. 跳轉,返回父級函數(shù)。{B、BL、BX ,但對應LR}, 對應給PC寄存器賦值
8. 出棧,恢復現(xiàn)場。{POP 或者LDR}, sp寄存器,Rx寄存器文章來源:http://www.zghlxwxcb.cn/news/detail-835305.html
【注意】:
9. 跳轉前保存下一條指令地址至LR寄存器
不帶返回的跳轉指令B, 不會保存地址至LR寄存器
帶返回的跳轉指令BL,會自動保存地址至LR寄存器
10. 在子函數(shù)不會自動跳回父函數(shù),需要手動將LR寄存器的值賦給PC寄存器才能跳轉回來。
11. 有一個官方規(guī)范AAPCS(Procedure Call Standard for the ARM? Architecture),詳細描述了進行函數(shù)調用時如何進行參數(shù)的傳遞和調用路徑的記錄等。
12. 大多數(shù)的函數(shù)調用通過BL語句實現(xiàn),對應著LR寄存器 和 PC寄存器。因此依次找到棧中LR的數(shù)值,就能找到調用路徑中各個函數(shù)的地址。最后根據(jù)map文件翻譯出各函數(shù)的名稱,就可以得到函數(shù)的調用路徑了。【?;厮荨?br> 13. 寄存器概述文章來源地址http://www.zghlxwxcb.cn/news/detail-835305.html
- 通用寄存器
通用寄存器中可供挖掘的信息并不多,通常情況下r0-r3寄存器保存著函數(shù)的前四個參數(shù)(其余的參數(shù)在棧中保存),需要注意的是:這四個寄存器的數(shù)值僅在函數(shù)開始執(zhí)行的時候是可靠的,在函數(shù)執(zhí)行的過程中可能被改變。在函數(shù)返回時,寄存器r0和r1用于保存返回值(根據(jù)返回數(shù)據(jù)的大小,決定僅使用r0還是同時使用r0和r1)。同樣這兩個寄存器僅在子函數(shù)剛返回時數(shù)值才是可靠的。
- 特殊功能寄存器【PC、LR和SP】
SP指向當前的棧頂,在知曉棧的結構時,可以根據(jù)SP訪問棧中的數(shù)據(jù)。
在中斷處理函數(shù)中LR有特殊用法,其中保存了返回被中斷地點的方法,而不是通常情況下的返回地址。因此在Hardfault處理函數(shù)中寄存器LR和PC的值沒有太多參考意義,被處理器自動壓棧的LR和PC最有用,PC記錄了被中斷打斷前正在執(zhí)行的指令地址(也是正在執(zhí)行的函數(shù)地址),LR記錄了被中斷打斷前,正在執(zhí)行的函數(shù)的父函數(shù)的地址。根據(jù)這兩個地址,可以找到引發(fā)Hardfault異常的函數(shù)和語句,以及其父函數(shù)(如果輔以匯編代碼繼續(xù)對棧的內(nèi)容進行分析,則可以回溯整個調用路徑)。
- SCB寄存器
在M3/M4處理器標準外設中,有一個叫做SCB(System Control Block)的部分,其中有6個寄存器記錄了發(fā)生Hardfault異常的原因。
--此部分轉載至 【作者:電工王大爺,鏈接:https://www.jianshu.com/p/e766c2fba1cc】
具體參考官方文檔《HardFault的診斷》,或者電工王大爺?shù)奶印?
加載、存儲
計算
中斷
異常
線程的切換
到了這里,關于理論學習-ARM-內(nèi)核的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!