ARM處理器異常(chang)返(fan)回地(di)址(zhi)
時(shi)間:2018-09-27 來源:未(wei)知
在(zai)(zai)ARM處(chu)理器中一條(tiao)指(zhi)令的(de)執行(xing)分為取(qu)指(zhi)、譯碼(ma)、執行(xing)三個階段,由于指(zhi)令流水線的(de)存在(zai)(zai)造成當(dang)前執行(xing)的(de)指(zhi)令的(de)地址(zhi)是(shi)PC-8(ARM指(zhi)令集),那(nei)么當(dang)前執行(xing)指(zhi)令的(de)下(xia)一條(tiao)指(zhi)令的(de)地址(zhi)應(ying)該是(shi)PC-4,所以在(zai)(zai)異常(chang)產生時處(chu)理器會將PC-4的(de)值保存到(dao)對應(ying)模(mo)式的(de)LR寄存器中,但是(shi)該返回地址(zhi)是(shi)否能夠被使(shi)用還要看具體產生的(de)異常(chang)的(de)種(zhong)類而(er)定。
本文引用地址://fsbing.cn/emb/Column/7517.html
FIQ與RIQ異常:
FIQ與(yu)RIQ異(yi)常返回(hui)(hui)處(chu)理(li)(li)是一樣的(de),當處(chu)理(li)(li)器執(zhi)行完(wan)當前指令(ling)(ling)后(hou)(hou)才去查詢中(zhong)斷且查看是否允許(xu)中(zhong)斷,如果處(chu)理(li)(li)器產生(sheng)了中(zhong)斷,這(zhe)時PC的(de)值(zhi)已經(jing)更新,即PC指向了當前指令(ling)(ling)后(hou)(hou)第三條(tiao)(tiao)指令(ling)(ling)的(de)位(wei)置(被(bei)中(zhong)斷指令(ling)(ling)地址加12),產生(sheng)FIQ與(yu)RIQ異(yi)常后(hou)(hou)處(chu)理(li)(li)器將(jiang)PC-4的(de)值(zhi)保存到了對應模式(shi)下的(de)LR,而(er)它指向的(de)是當前被(bei)中(zhong)斷指令(ling)(ling)的(de)后(hou)(hou)面的(de)第二條(tiao)(tiao)指令(ling)(ling),因此在返回(hui)(hui)時我們需(xu)要人為(wei)的(de)將(jiang)LR中(zhong)保存的(de)值(zhi)自減(jian)4以得到正(zheng)確(que)的(de)返回(hui)(hui)地址。
預取指中止異常:
在指(zhi)(zhi)(zhi)令(ling)(ling)預取(qu)時(shi)如果地址(zhi)是非法的(de),該(gai)指(zhi)(zhi)(zhi)令(ling)(ling)就被標記為有(you)問題(ti)(ti)的(de)指(zhi)(zhi)(zhi)令(ling)(ling),流水線(xian)上(shang)該(gai)指(zhi)(zhi)(zhi)令(ling)(ling)之前的(de)指(zhi)(zhi)(zhi)令(ling)(ling)繼續執(zhi)行(xing),當執(zhi)行(xing)被標記為有(you)問題(ti)(ti)的(de)指(zhi)(zhi)(zhi)令(ling)(ling)的(de)時(shi)候,處(chu)(chu)理器就會產生異常。產生該(gai)異常終返(fan)(fan)回時(shi)需要(yao)返(fan)(fan)回到(dao)被標記的(de)指(zhi)(zhi)(zhi)令(ling)(ling)處(chu)(chu)重新(xin)讀取(qu)并執(zhi)行(xing)該(gai)指(zhi)(zhi)(zhi)令(ling)(ling),因此異常返(fan)(fan)回時(shi)需要(yao)返(fan)(fan)回到(dao)該(gai)指(zhi)(zhi)(zhi)令(ling)(ling)處(chu)(chu)而不是該(gai)指(zhi)(zhi)(zhi)令(ling)(ling)的(de)下一條指(zhi)(zhi)(zhi)令(ling)(ling)。所以在中(zhong)斷返(fan)(fan)回時(shi)我們需要(yao)人為的(de)對LR中(zhong)保存的(de)值自減4。
指令未定義異常:
指(zhi)(zhi)(zhi)令(ling)未定義異常(chang)(chang)由當前(qian)正在執行(xing)的(de)指(zhi)(zhi)(zhi)令(ling)產生,即產生異常(chang)(chang)時PC的(de)值(zhi)還沒有(you)更新,PC的(de)值(zhi)指(zhi)(zhi)(zhi)向當前(qian)指(zhi)(zhi)(zhi)令(ling)后面第二條指(zhi)(zhi)(zhi)令(ling),產生異常(chang)(chang)后LR中保存的(de)指(zhi)(zhi)(zhi)令(ling)是當前(qian)指(zhi)(zhi)(zhi)令(ling)的(de)下(xia)一(yi)條指(zhi)(zhi)(zhi)令(ling)的(de)地址(zhi),所(suo)以異常(chang)(chang)返回時直接把LR的(de)值(zhi)給PC即可不許(xu)人為的(de)去(qu)修正返回地址(zhi)。
軟中斷異常:
軟中斷(duan)(duan)異(yi)(yi)常與指(zhi)令(ling)未定義異(yi)(yi)常一(yi)樣(yang),也是(shi)當前指(zhi)令(ling)在(zai)執(zhi)行(xing)過程(cheng)中就產生了異(yi)(yi)常,所以(yi)LR中保(bao)存的(de)返回地(di)址(zhi)(zhi)是(shi)當前軟中斷(duan)(duan)指(zhi)令(ling)的(de)下一(yi)條指(zhi)令(ling)的(de)地(di)址(zhi)(zhi),不需要(yao)人為的(de)去修正,返回時直接將(jiang)LR的(de)值賦給PC即可(ke)。
數據中止異常:
產(chan)生(sheng)(sheng)該異(yi)常的(de)(de)時(shi)候程(cheng)序要返回(hui)到有問題(ti)的(de)(de)指令(ling)(ling)處(chu)(chu)重新(xin)訪問該數據,因(yin)此應該返回(hui)到產(chan)生(sheng)(sheng)異(yi)常的(de)(de)指令(ling)(ling)處(chu)(chu)而不是產(chan)生(sheng)(sheng)異(yi)常指令(ling)(ling)的(de)(de)下一條(tiao)指令(ling)(ling)處(chu)(chu)。當異(yi)常產(chan)生(sheng)(sheng)時(shi)PC的(de)(de)值已經更新(xin),所以PC指向的(de)(de)是異(yi)常產(chan)生(sheng)(sheng)指令(ling)(ling)的(de)(de)后(hou)面(mian)的(de)(de)第三條(tiao)指令(ling)(ling),而LR中保(bao)存的(de)(de)是PC-4的(de)(de)值即異(yi)常產(chan)生(sheng)(sheng)指令(ling)(ling)的(de)(de)后(hou)面(mian)的(de)(de)第二(er)條(tiao)指令(ling)(ling)的(de)(de)地址(zhi)。所以在返回(hui)時(shi)我們需(xu)人為的(de)(de)對LR中的(de)(de)值進行(xing)自減8的(de)(de)處(chu)(chu)理(li)。以保(bao)證異(yi)常正確(que)的(de)(de)返回(hui)。
上述(shu)每(mei)一種異常(chang)發生時,返回地址都要根據具體的異常(chang)類型(xing)進(jin)行重新修正。

