<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          ARM 體系的異常中斷

          作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏
          6.1 ARM 體系的異常中斷
          6.1.1 異常中斷的種類
          當(dāng)ARM 系統(tǒng)正常的程序執(zhí)行流程發(fā)生暫時(shí)的停止時(shí),稱之為異常,ARM 系統(tǒng)對(duì)異常的
          響應(yīng)過(guò)程稱之為異常中斷。例如當(dāng)ARM 系統(tǒng)檢測(cè)到外部的復(fù)位信號(hào)有效,ARM 系統(tǒng)的程
          序就會(huì)跳轉(zhuǎn)到復(fù)位處理程序。在處理異常之前,ARM 內(nèi)核保存當(dāng)前的處理器狀態(tài),這樣當(dāng)
          處理程序結(jié)束時(shí)可以恢復(fù)執(zhí)行原來(lái)的程序。當(dāng)然ARM 體系的產(chǎn)生異常中斷后,會(huì)按照一定
          的程序進(jìn)行中斷處理。下面我們分別介紹ARM 系統(tǒng)異常,ARM 體系異常中斷包括復(fù)位、
          未定義的指令、軟件中斷,指令預(yù)取中斷等。
          ●復(fù)位(Reset ):當(dāng)處理器的復(fù)位引腳有效時(shí),系統(tǒng)產(chǎn)生復(fù)位異常中斷,程序跳轉(zhuǎn)到復(fù)位異
          常中斷處理程序處執(zhí)行。復(fù)位異常中斷通常用在下面兩種情況:①系統(tǒng)加電時(shí) ②系統(tǒng)復(fù)位
          時(shí)。
          ●未定義的指令(undefined instruction):當(dāng)ARM 處理器或者時(shí)系統(tǒng)中是協(xié)處理器認(rèn)為當(dāng)前指
          令未定義時(shí),產(chǎn)生未定義指令異常中斷。可以通過(guò)該異常中斷機(jī)仿真浮點(diǎn)向量的運(yùn)算。
          ●軟件中斷(Soft interrupt SWI):這時(shí)有用戶定義的中斷指令??捎糜谟脩裟J较碌某绦蛘{(diào)
          試特權(quán)操作指令。在實(shí)際的操作中可以通過(guò)該機(jī)制實(shí)現(xiàn)系統(tǒng)功能的調(diào)用。
          ●指令預(yù)取中止(Prefech Abort) :如果處理器預(yù)取的指令的地址不存在,或者該地址不允許
          當(dāng)前指令訪問(wèn),當(dāng)該預(yù)取的指令執(zhí)行時(shí),處理器產(chǎn)生指令預(yù)取中止異常中斷。
          數(shù)據(jù)訪問(wèn)中止(Data Abort):如果數(shù)據(jù)訪問(wèn)指令的目標(biāo)地址不存在,或許該地址不允許當(dāng)前
          指令訪問(wèn),處理器產(chǎn)生。
          ●外部中斷請(qǐng)求(IRQ):當(dāng)處理器的外部中斷請(qǐng)求引腳有效,而且 CPSR 寄存器的 1 位控
          制位被清除時(shí),處理器產(chǎn)生外部中斷請(qǐng)求(IRQ)異常中斷。系統(tǒng)中個(gè)外設(shè)通常通過(guò)該異常
          中斷請(qǐng)求處理器服務(wù)。
          ●快速中斷請(qǐng)求(FIQ ):當(dāng)處理器外部快速中斷請(qǐng)求引腳有效,而且 CPSR 寄存器的 F
          制位被清除時(shí),處理器產(chǎn)生外部中斷請(qǐng)求(FIQ )異常中斷。
          6.1.2 處理異常中斷的寄存器
          中止模式(Abort abt ) 用于虛擬存儲(chǔ)及存儲(chǔ)保護(hù)
          未定義指令模式(Undefined und ) 用于支持通過(guò)軟件仿真硬件的協(xié)處理器
          系統(tǒng)模式(System sys) 用于運(yùn)行特權(quán)級(jí)的操作系統(tǒng)
          各種不同的處理器模式可能有對(duì)應(yīng)于該處理器的物理寄存器組,如表 6.2 所示。其中,
          R13_svc 表示特權(quán)模式下的R13 寄存器,R_13abt 表示中止模式下的R13 寄存器,其余的各
          寄存器名稱含義類推。
          表 6.2 各處理器模式物理寄存器組
          用戶模式 系統(tǒng)模式 特權(quán)模式 中止模式 未定義指令模式 外部中斷模式 快速中斷模式
          R0 R0 R0 R0 R0 R0 R0
          R1 R1 R1 R1 R1 R1 R1
          R2 R2 R2 R2 R2 R2 R2
          R3 R3 R3 R3 R3 R3 R3
          R4 R4 R4 R4 R4 R4 R4
          R5 R5 R5 R5 R5 R5 R5
          R6 R6 R6 R6 R6 R6 R6
          R7 R7 R7 R7 R7 R7 R7
          R8 R8 R8 R8 R8 R8 R8_fiq
          R9 R9 R9 R9 R9 R9 R9_fiq
          R10 R10 R10 R10 R10 R10 R10_fiq
          R11 R11 R11 R11 R11 R11 R11_fiq
          R12 R12 R12 R12 R12 R12 R12_fiq
          R13 R13 R13_svc R13_abt R13_und R13_irq R13_fiq
          R14 R14 R14_svc R14_abt R14_und R14_irq R14_fiq
          PC PC PC PC PC PC PC
          CPSR CPSR CPSR CPSR CPSR CPSR CPSR
          SPSR_svs SPSR_abt SPSR_und SPSR_irq SPSR_fiq
          如果異常中斷處理程序中使用它自己的物理寄存器之外的其他寄存器,異常中段處理程序
          必須保存和恢復(fù)這些寄存器。
          上表中各物理寄存器的名稱在ARM 匯編語(yǔ)言中并沒(méi)有被預(yù)定義。用戶使用這些寄存器時(shí),
          必須使用偽操作RN 來(lái)定義這些名稱。例如我們要使用寄存器R13_abt 可以使用下面的語(yǔ)句。
          R13_abt RN R13
          當(dāng)幾個(gè)異常中斷同時(shí)發(fā)生時(shí),就必須按照一定的次序來(lái)處理這些異常中斷。在ARM 中通
          過(guò)給各異常中斷賦予一定的優(yōu)先級(jí)來(lái)實(shí)現(xiàn)這種處理次序。當(dāng)然有些異常中斷時(shí)不可能同時(shí)發(fā)
          生的,如指令預(yù)取中止異常中斷和阮籍異常中斷時(shí)由同一條指令的執(zhí)行觸發(fā),它們時(shí)不可能
          同時(shí)發(fā)生的。處理器執(zhí)行一個(gè)特定的異常中斷的過(guò)程中,稱為處理器處于特定的中斷模式。
          各異常中斷的中斷向量地址以及中斷的處理優(yōu)先級(jí)如表 6.3 所示。
          表 6.3 各異常中斷的中斷向量地址以及中斷的處理優(yōu)先級(jí)
          中斷向量地址 異常中斷類型 異常中斷模式 優(yōu)先級(jí)(6 級(jí)最低)
          0x0 復(fù)位 特權(quán)模式(SVC) 1
          0x4 未定義的指令 未定義的指令中止模式 6
          0x8 軟件中斷 特權(quán)模式 6
          0x10 數(shù)據(jù)訪問(wèn)中止 中止模式 2
          0x14 保留 未使用 未使用
          0x18 外部中斷請(qǐng)求 外部中斷模式 4
          0x1c 快速中斷請(qǐng)求 快速中斷模式 3
          6.1.4 進(jìn)入異常中斷
          ARM 處理器對(duì)異常中斷的響應(yīng)過(guò)程如下:
          (1) 保存處理器當(dāng)前狀態(tài)、中斷屏蔽位以及各條件標(biāo)志位。這是通過(guò)將當(dāng)前程序狀態(tài)寄
          存器 CPSR 的內(nèi)容保存到將要執(zhí)行的異常中斷對(duì)應(yīng)的SPSR 寄存器中實(shí)現(xiàn)的。各異
          常中斷有自己的物理 SPSR 寄存器。
          (2 ) 設(shè)置當(dāng)前程序狀態(tài)寄存器CPSR 中相應(yīng)的位。包括設(shè)置CPSR 中的位,使處理器進(jìn)
          入相應(yīng)的執(zhí)行模式;設(shè)置 CPSR 中的位,禁止IRQ 中斷,當(dāng)進(jìn)入FIQ 模式時(shí),禁
          止FIQ 中斷。
          (3) 將寄存器lr_mode 設(shè)置成返回地址。
          (4 ) 將程序計(jì)數(shù)器值(PC ),設(shè)置成該異常中斷的中斷向量地址,從而跳轉(zhuǎn)到相應(yīng)的異
          常中斷處理程序執(zhí)行。
          下面我們將分別介紹各種異常中斷響應(yīng)時(shí)ARM 系統(tǒng)執(zhí)行的指令。
          1.響應(yīng)復(fù)位異常中斷
          當(dāng)處理器的復(fù)位引腳有效時(shí),處理器中止當(dāng)前指令。當(dāng)處理器的復(fù)位引腳變成無(wú)效時(shí),
          處理器開(kāi)始執(zhí)行下面的操作。
          R14_svc=UNPREDICTABLE value
          SPSR_svs=UNPREDICTABLE value
          CPSR[4:0]=0b10011
          CPSR[5]=0
          CPSR[6]=1
          CPSR[7]=1
          If high vectors configured then
          PC=0Xffff0000
          Else
          PC=0x00000000
          2. 響應(yīng)未定義指令異常中斷
          處理器響應(yīng)未定義指令異常中斷時(shí)的處理過(guò)程如下面的偽指令所示。
          R14_und=address of next interaction after the undefined instruction
          SPSR_und=CPSR
          CPSR[4:0]=0b11011
          CPSR[5]=0
          CPSR[7]=1
          if high vectors configured then
          PC=0Xffff0004
          Else
          PC=0x00000004
          3. 響應(yīng) SWI 異常中斷
          處理器響應(yīng) SWI 異常中斷時(shí)的處理過(guò)程如下面的偽代碼所示。
          R14_svc=address of next instruction after the SWI instruction
          SPSR_svc=CPSR
          CPSR[4:0]=0b10011
          CPSR[5]=0
          If high vectors configured then
          PC=0Xffff0000
          Else
          PC=0x00000000
          4. 響應(yīng)指令預(yù)取中止異常中斷
          處理響應(yīng)指令預(yù)取中止異常中斷時(shí)的處理過(guò)程如下面的偽代碼所示。
          R14_aht=address of the aborted instruction + 4
          SPSR_abt=CPSR
          CPSR[4:0]=0b10111
          CPSR[5]=0
          CPSR[6]=1
          CPSR[7]=1
          If high vectors configured then
          PC=0Xffff001C
          Else
          PC=0x0000001c
          6.1.5 退出異常中斷
          ARM 系統(tǒng)處理完中斷后從異常中斷處理程序中返回包括下面的步驟。
          ● 恢復(fù)被中斷的程序的處理狀態(tài),即將 SPSR_mode 寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)
          寄存器 CPSR中。
          ● 返回到發(fā)生異常中斷的指令的下一條指令處執(zhí)行。即將 lr_mode 寄存器的內(nèi)容復(fù)
          制程序計(jì)數(shù)器 PC 中。
          因?yàn)檎麄€(gè)應(yīng)用系統(tǒng)時(shí)從復(fù)位異常中斷處理程序執(zhí)行的,所以復(fù)位異常中斷處理程序不需要返
          回。
          實(shí)際上,當(dāng)異常中斷發(fā)生時(shí),程序程序計(jì)數(shù)器 PC 所致的位置對(duì)于各種不同的異常中斷是
          不同的。同樣,返回地址對(duì)于各種不同的異常中斷也是不同的。
          下面我們分別介紹各種異常中斷處理程序的返回方法。
          1.SWI 和未定義指令異常中斷處理程序的返回
          SWI 和未定義指令異常中斷是由當(dāng)前執(zhí)行的指令自身產(chǎn)生的,當(dāng) SWI 和未定義指令異常中斷
          產(chǎn)生時(shí),程序及順氣 PC的值還未更新,它指向當(dāng)前指令后面第 2 指令(對(duì)于 ARM指令來(lái)說(shuō),
          它指向當(dāng)前指令地址加 8 個(gè)字節(jié)的位置;對(duì)于 Thumb 指令來(lái)說(shuō),它指向當(dāng)前指令地址加 4
          個(gè)字節(jié)的位置)。當(dāng) SWI 和未定義指令異常中斷發(fā)生時(shí),處理器將值(PC-4)保存到異常模
          式下的寄存器 lr_mode中。這時(shí)(PC-4)即指向當(dāng)前的下一條指令。因此返回操作可以通過(guò)
          下面的指令來(lái)實(shí)現(xiàn):
          MOV PC,LR
          該指令將寄存器 LR 中的值復(fù)制到程序計(jì)數(shù)器 PC 中,實(shí)現(xiàn)程序返回,同時(shí)將 SPSR_mode
          寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器 CPSR 中。
          當(dāng)異常中斷處理程序中使用了數(shù)據(jù)棧時(shí),可以通過(guò)下面的指令在進(jìn)入異常中斷處理程序時(shí)
          保存被中斷程序的執(zhí)行現(xiàn)場(chǎng),在退出異常中斷處理程序時(shí)恢復(fù)被中斷程序執(zhí)行現(xiàn)場(chǎng)。異常中
          斷處理程序中使用的數(shù)據(jù)棧由用戶提供。
          STMFD SP! ,(reglist lr)
          ; ...
          LDMFD SP! ,reglist pc)^
          在上述指令中,reglist 是異常中斷處理程序使用的寄存器立表。標(biāo)識(shí)符^指示將
          SPSR_mode 寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器 CPSR 中。該指令只能在特權(quán)模式下使用。
          2.IRQ和 FIQ 異常中斷處理程序的返回
          通常處理器執(zhí)行完當(dāng)前指令后,查詢 IRQ 中斷引腳及 FIQ 中斷引腳,并且查看系統(tǒng)時(shí)否允
          許 IRQ 中斷及 FIQ 中斷。如果有中斷引腳有效,并且系統(tǒng)允許該中斷產(chǎn)生,處理器將產(chǎn)生
          IRQ 異常中斷或 FIQ 異常中斷。當(dāng) IRQ 和FIQ 異常中斷產(chǎn)生時(shí),程序計(jì)數(shù)器 PC 的值也經(jīng)更
          新,它指向當(dāng)前指令后面第 3 條指令(對(duì)預(yù) ARM 指令來(lái)說(shuō),它指向當(dāng)前指令地址加 12 個(gè)字
          節(jié)的位置;對(duì)于 Thumb 指令來(lái)說(shuō),它指向當(dāng)前指令地址加 6 個(gè)字節(jié)的位置)。當(dāng) IRQ 和 FIQ
          異常中斷發(fā)生時(shí),處理器將值(PC-4)保存到異常模式下的寄存器 lr_mode 中。這時(shí)(PC-4)
          即指向當(dāng)前指令后的第 2 條指令。因此返回操作可以通過(guò)下面的指令來(lái)實(shí)現(xiàn):
          SUBS PC , LD, #4
          該指令將寄存器LR中的值減4后,復(fù)制到程序計(jì)數(shù)器PC中,實(shí)現(xiàn)程序返回,同時(shí)將SPSR_mode
          寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器 CPSR 中。
          當(dāng)異常中斷處理程序中使用了數(shù)據(jù)棧時(shí),可以通過(guò)下面的指令進(jìn)入異常中斷處理程序時(shí)保存
          被中斷程序的執(zhí)行現(xiàn)場(chǎng)。異常中斷處理程序中使用的數(shù)據(jù)棧由用戶提供。
          SUBS LR,LR,#4
          STMFD SP!,{reglistl,lr}
          ; ...
          LDMFD SP!{reglist ,pc}^
          在上述指令中,reglist 是異常中斷處理程序中使用的寄存器列表。標(biāo)識(shí)符^指示將
          SPSR_mode 寄存器內(nèi)容復(fù)制到當(dāng)前程序程序寄存器 CPSR 中。該指令只能在特權(quán)模式下使用。
          3.預(yù)取中止異常中斷處理程序的返回
          在指令預(yù)取時(shí),如果目標(biāo)地址時(shí)非法的,該指令將被標(biāo)記稱有問(wèn)題的指令。這時(shí),流水線上
          該指令之前的指令繼續(xù)執(zhí)行。當(dāng)執(zhí)行到該被標(biāo)記稱有問(wèn)題的指令時(shí),處理器產(chǎn)生指令預(yù)取中
          止異常中斷。
          當(dāng)發(fā)生指令預(yù)取中止異常中斷時(shí),程序要返回到該有問(wèn)題的指令處,重新讀取并執(zhí)行該
          指令。因此指令預(yù)取中止異常中斷程序應(yīng)該返回到產(chǎn)生該指令預(yù)取中止異常中斷的指令處。
          而不是像前面兩種情況下返回到發(fā)生中斷的指令的下一條指令。
          指令預(yù)取中止異常中斷時(shí)由當(dāng)前執(zhí)行的指令自身產(chǎn)生的,當(dāng)指令預(yù)取中止異常中斷產(chǎn)生
          時(shí),程序計(jì)數(shù)器 PC 的值還未更新,指向它當(dāng)前指令后面第 2 條指令(對(duì)于 ARM 指令來(lái)說(shuō),
          它指向當(dāng)前指令地址加 8 各字節(jié)的位置;對(duì)于 Thumb 指令來(lái)說(shuō),它指向當(dāng)前指令地址 4個(gè)字
          節(jié)的位置)。當(dāng)指令預(yù)取中止異常中斷發(fā)生時(shí),處理器將值(PC-4)保存到異常模式下的寄
          存器 lr_mode 中。這時(shí)(PC-4)即指向當(dāng)前指令的下一條指令。因此返回操作可以通過(guò)下面
          的指令來(lái)實(shí)現(xiàn):
          SUSB PC , LR ,#4
          該指令將寄存器 LR 中的值減 4 后,復(fù)制到程序計(jì)數(shù)器 PC 中,實(shí)現(xiàn)程序的返回,同時(shí)將
          SPSR_mode 寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器 CPSR 中。
          當(dāng)異常中斷處理程序中使用了數(shù)據(jù)棧時(shí),可以通過(guò)下面的指令在進(jìn)入異常中斷處理程序
          時(shí)保存被中斷程序的執(zhí)行現(xiàn)場(chǎng),在推出異常中斷處理程序時(shí)恢復(fù)被中斷程序的執(zhí)行現(xiàn)場(chǎng)。異
          常中斷處理程序中使用的數(shù)據(jù)棧由用戶提供。
          SUBS LR ,LR ,#4
          STMFD SP! ,{reglist ,lr}
          ;…
          LDMFD SP!,{reglist ,pc}^
          在上述指令中,reglist 是異常中斷處理程序中使用的寄存器列表。標(biāo)識(shí)符^指示將
          SPSR_mode 寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器 CPSR 中。該指令只能在特權(quán)模式下使用。
          4.?dāng)?shù)據(jù)訪問(wèn)中止異常中斷處理程序返回
          當(dāng)發(fā)生數(shù)據(jù)訪問(wèn)中止異常中斷時(shí),程序要返回到該有問(wèn)題的數(shù)據(jù)訪問(wèn)處,重新訪問(wèn)該數(shù)
          據(jù),因此數(shù)據(jù)訪問(wèn)中止異常中斷程序應(yīng)該返回到產(chǎn)生該數(shù)據(jù)訪問(wèn)中止異常中斷的指令
          處,而不是像前面兩種情況下返回到當(dāng)前指令的下一條指令。
          數(shù)據(jù)訪問(wèn)中止異常中斷是由數(shù)據(jù)訪問(wèn)指令產(chǎn)生的,當(dāng)數(shù)據(jù)訪問(wèn)中止異常中斷產(chǎn)生
          時(shí),程序計(jì)數(shù)器 PC 的值已經(jīng)更新,它指向當(dāng)前指令后面第二條指令(對(duì)于 ARM 指令來(lái)
          說(shuō),它指向當(dāng)前指令地址加 8 個(gè)字節(jié)的位置;對(duì)于 Thumb指令來(lái)說(shuō),它指向當(dāng)前指令地
          址加 4 個(gè)字節(jié)的位置)。當(dāng)數(shù)據(jù)訪問(wèn)中止異常中斷發(fā)生時(shí),處理器將值(PC-4)保存到
          異常模式下的寄存器 lr_mode 中。這時(shí)(PC-4)即指向當(dāng)前指令的后第二條指令。因此
          返回操作可以通過(guò)下面的指令來(lái)實(shí)現(xiàn):
          SUSB PC ,LR #8
          該指令將寄存器 LR 中的值減 8 后,復(fù)制到程序計(jì)數(shù)器 PC中,實(shí)現(xiàn)程序返回,同
          時(shí)將 SPSR_mode 寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器 CPSR中。
          當(dāng)異常中斷處理程序中使用了數(shù)據(jù)棧時(shí),可以通過(guò)下面的指令在進(jìn)入異常中斷處理
          程序時(shí)保存被中斷程序保存的執(zhí)行現(xiàn)場(chǎng),在退出異常中斷處理程序時(shí)恢復(fù)被中斷程序的
          執(zhí)行現(xiàn)場(chǎng)。異常中斷處理程序中使用的數(shù)據(jù)棧由用戶提供。
          SUSB LR ,LR #8
          STMFD SP ! ,{eglist ,lr}
          ;...
          LDMFD SP !{reglist,pc}^
          在上述指令中,reglist是異常中斷處理程序中使用的寄存器列表。標(biāo)識(shí)符^指示將
          SPSR_mode 寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器 CPSR 中。該指令只能在特權(quán)模式下
          使用。



          關(guān)鍵詞: ARM體系異常中

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();