精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

【從0學ARM】你不了解的ARM處理異常之道

開發 架構
異常是理解CPU運轉最重要的一個知識點,幾乎每種處理器都支持特定異常處理,中斷是異常中的一種。有時候我們衡量一個操作系統的時候實時性就是看os最短響應中斷時間以及單位時間內響應中斷次數。

[[356802]]

 一、異常(Exception)

異常是理解CPU運轉最重要的一個知識點,幾乎每種處理器都支持特定異常處理,中斷是異常中的一種。有時候我們衡量一個操作系統的時候實時性就是看os最短響應中斷時間以及單位時間內響應中斷次數。

二、異常源

在ARM體系結構中,存在7種異常處理。當異常發生時,處理器會把PC設置為一個特定的存儲器地址。這一地址放在被稱為向量表(vector table)的特定地址范圍內,向量表的入口是一些跳轉指令,跳轉到專門處理某個異?;蛑袛嗟淖映绦?。

1. 異常源分類

要進入異常模式,一定要有異常源,ARM規定有7種異常源:

1.reset復位異常

當CPU剛上電時或按下reset重啟鍵之后進入該異常,該異常在管理模式下處理。

2.irq/fiq一般/快速中斷請求

CPU和外部設備是分別獨立的硬件執行單元,CPU對全部設備進行管理和資源調度處理,CPU要想知道外部設備的運行狀態,要么CPU定時的去查看外部設備特定寄存器,要么讓外部設備在出現需要CPU干涉處理時“打斷”CPU,讓它來處理外部設備的請求,毫無疑問第二種方式更合理,可以讓CPU“專心”去工作,這里的“打斷”操作就叫做中斷請求,根據請求的緊急情況,中斷請求分一般中斷和快速中斷,快速中斷具有最高中斷優先級和最小的中斷延遲,通常用于處理高速數據傳輸及通道的中數據恢復處理,如DMA等,絕大部分外設使用一般中斷請求。

3.預取指令中止異常

該異常發生在CPU流水線取指階段,如果目標指令地址是非法地址進入該異常,該異常在中止異常模式下處理。

4.未定義指令異常

該異常發生在流水線技術里的譯碼階段,如果當前指令不能被識別為有效指令,產生未定義指令異常,該異常在未定義異常模式下處理。

5.軟件中斷指令(swi)異常

該異常是應用程序自己調用時產生的,用于用戶程序申請訪問硬件資源時,例如:printf()打印函數,要將用戶數據打印到顯示器上,用戶程序要想實現打印必須申請使用顯示器,而用戶程序又沒有外設硬件的使用權,只能通過使用軟件中斷指令切換到內核態,通過操作系統內核代碼來訪問外設硬件,內核態是工作在特權模式下,操作系統在特權模式下完成將用戶數據打印到顯示器上。這樣做的目的無非是為了保護操作系統的安全和硬件資源的合理使用,該異常在管理模式下處理。

6.數據中止訪問異常 該異常發生在要訪問數據地址不存在或者為非法地址時,該異常在中止異常模式下處理。

2. ARM的異常優先級

  1. Reset→ 
  2. Data abort→ 
  3. FIQ→ 
  4. IRQ→ 
  5. Prefetch abort→ 
  6. Undefined instruction/SWI。 

3. FIQ 比 IRQ快的原因

  1. fiq 比 irq 的優先級高
  2. FIQ 向量位于向量表的最末端,異常處理不需要跳轉
  3. FIQ 比 IRQ 多5個私有的寄存器(r8-r12),在中斷操作時,壓棧出棧操作的少。

三、異常發生的硬件操作

異常發生后,ARM核的操作步驟可以總結為4大步3小步。

1. 4大步3小步

1.保存執行狀態:將CPSR復制到發生的異常模式下SPSR中;

2.模式切換:

  • CPSR模式位強制設置為與異常類型相對應的值,
  • 處理器進入到ARM執行模式,
  • 禁止所有IRQ中斷,當進入FIQ快速中斷模式時禁止FIQ中斷;

3.保存返回地址:將下一條指令的地址(被打斷程序)保存在LR(異常模式下LR_excep)中。

4.跳入異常向量表:強制設置PC的值為相應異常向量地址,跳轉到異常處理程序中。

2 步驟詳解

1.保存執行狀態

當前程序的執行狀態是保存在CPSR里面的,異常發生時,要保存當前的CPSR里的執行狀態到異常模式里的SPSR里,將來異常返回時,恢復回CPSR,恢復執行狀態。

2.模式切換

硬件自動根據當前的異常類型,將異常碼寫入CPSR里的M[4:0]模式位,這樣CPU就進入了對應異常模式下。不管是在ARM狀態下還是在THUMB狀態下發生異常,都會自動切換到ARM狀態下進行異常的處理,這是由硬件自動完成的,將CPSR[5] 設置為 0。同時,CPU會關閉中斷IRQ(設置CPSR 寄存器I位),防止中斷進入,如果當前是快速中斷FIQ異常,關閉快速中斷(設置CPSR寄存器F位)。

3.保存返回地址

當前程序被異常打斷,切換到異常處理程序里,異常處理完之后,返回當前被打斷模式繼續執行,因此必須要保存當前執行指令的下一條指令的地址到LR_excep(異常模式下LR,并不存在LR_excep寄存器,為方便讀者理解加上_excep,以下道理相同),由于異常模式不同以及ARM內核采用流水線技術,異常處理程序里要根據異常模式計算返回地址。

4.跳入異常向量表

該操作是CPU硬件自動完成的,當異常發生時,CPU強制將PC的值修改為一個固定內存地址,這個固定地址叫做異常向量。

四、異常向量表

異常向量表是一段特定內存地址空間,每種ARM異常對應一個字長空間(4Bytes),正好是一條32位指令長度,當異常發生時,CPU強制將PC的值設置為當前異常對應的固定內存地址。

1. 異常向量表:


異常向量表

跳入異常向量表操作是異常發生時,硬件自動完成的,剩下的異常處理任務完全交給了程序員。由上表可知,異常向量是一個固定的內存地址,我們可以通過向該地址處寫一條跳轉指令,讓它跳向我們自己定義的異常處理程序的入口,就可以完成異常處理了。


異常向量表

正是由于異常向量表的存在,才讓硬件異常處理和程序員自定義處理程序有機聯系起來。異常向量表里0x00000000地址處是reset復位異常,之所以它為0地址,是因為CPU在上電時自動從0地址處加載指令,由此可見將復位異常安裝在此地址處也是前后接合起來設計的,不得不感嘆CPU設計師的偉大,其后面分別是其余7種異常向量,每種異常向量都占有四個字節,正好是一條指令的大小,最后一個異常是快速中斷異常,將其安裝在此也有它的意義,在0x0000001C地址處可以直接存放快速中斷的處理程序,不用設置跳轉指令,這樣可以節省一個時鐘周期,加快快速中斷處理時間。

存儲器映射地址0x00000000是為向量表保留的。在有些處理器中,向量表可以選擇定位在高地址0xFFFF0000處【可以通過協處理器指令配置】,當今操作系統為了控制內存訪問權限,通常會開啟虛擬內存,開啟了虛擬內存之后,內存的開始空間通常為內核進程空間,和頁表空間,異常向量表不能再安裝在0地址處了。

比如Cortex-A8系統中支持通過設置CP15的C12寄存器將異常向量表的首地址放置在任意地址。

2. 安裝異常向量表

我們可以通過簡單的使用下面的指令來安裝異常向量表:

  1. b reset   ;跳入reset處理程序 
  2. b HandleUndef  ;跳入未定義處理程序 
  3. b HandSWI     ;跳入軟中斷處理程序 
  4. b HandPrefetchAbt   ;跳入預取指令處理程序 
  5. b HandDataAbt    ;跳入數據訪問中止處理程序 
  6. b HandNoUsed  ;跳入未使用程序 
  7. b HandleIRQ    ;跳入中斷處理程序 
  8. b HandleFIQ    ;跳入快速中斷處理程序 

通常安裝完異常向量表,跳到我們自己定義的處理程序入口,這時我們還沒有保存被打斷程序的現場,因此在異常處理程序的入口里先要保存打斷程序現場。

3. 保存執行現場

異常處理程序最開始,要保存被打斷程序的執行現場,程序的執行現場無非就是保存當前操作寄存器里的數據,可以通過下面的棧操作指令實現保存現場:

  1. STMFD  SP_excep!,  {R0 – R12,  LR_excep} 

注:LR_abt,SP_excep分別為對應異常模式下LR和SP,為方便讀者理解加上_abt

需要注意的是,在跳轉到異常處理程序入口時,已經切換到對應異常模式下了,因此這里的SP是異常模式下的SP_excep了,所以被打斷程序現場(寄存器數據)是保存在異常模式下的棧里,上述指令將R0~R12全部都保存到了異常模式棧,最后將修改完的被打斷程序返回地址入棧保存,之所以保存該返回地址就是將來可以通過類似:MOV PC, LR的指令,返回用戶程序繼續執行。

異常發生后,要針對異常類型進行處理,因此,每種異常都有自己的異常處理程序,中斷異常處理過程通過下節的系統中斷處理來進行分析。

五、異常處理的返回

異常處理完成之后,返回被打斷程序繼續執行,具體操作如下:

恢復被打斷程序運行時寄存器數據

恢復程序運行時狀態CPSR

通過進入異常時保存的返回地址,返回到被打斷程序繼續執行

1. 異常返回地址

一條指令的執行分為:取指,譯碼,執行三個主要階段, CPU由于使用流水線技術,造成當前執行指令的地址應該是PC – 8(32位機一條指令四個字節),那么執行指令的下條指令應該是PC – 4。在異常發生時,CPU自動會將將PC – 4 的值保存到LR里,但是該值是否正確還要看異常類型才能決定。

各模式的返回地址說明如下:

1.一般/快速中斷請求:

快速中斷請求和一般中斷請求返回處理是一樣的。通常處理器執行完當前指令后,查詢FIQ/IRQ中斷引腳,并查看是否允許FIQ/IRQ中斷,如果某個中斷引腳有效,并且系統允許該中斷產生,處理器將產生FIQ/IRQ異常中斷,當FIQ/IRQ異常中斷產生時,程序計數器pc的值已經更新,它指向當前指令后面第3條指令(對于ARM指令,它指向當前指令地址加12字節的位置;對于Thumb指令,它指向當前指令地址加6字節的位置),當FIQ/IRQ異常中斷產生時,處理器將值(pc-4)保存到FIQ/IRQ異常模式下的寄存器lr_irq/lr_irq中,它指向當前指令之后的第2條指令,因此正確返回地址可以通過下面指令算出:

  1. SUBS    PC,LR_irq,#4  ; 一般中斷 
  2. SUBS    PC,LR_fiq,#4  ; 快速中斷 

注:LR_irq/LR_fiq分別為一般中斷和快速中斷異常模式下LR,并不存在LR_xxx寄存器,為方便讀者理解加上_xxx,下同。

2.預取指中止異常:

在指令預取時,如果目標地址是非法的,該指令被標記成有問題的指令,這時,流水線上該指令之前的指令繼續執行,當執行到該被標記成有問題的指令時,處理器產生指令預取中止異常中斷。發生指令預取異常中斷時,程序要返回到該有問題的指令處,重新讀取并執行該指令,因此指令預取中止異常中斷應該返回到產生該指令預取中止異常中斷的指令處,而不是當前指令的下一條指令。

指令預取中止異常中斷由當前執行的指令在ALU里執行時產生,當指令預取中止異常中斷發生時,程序計數器pc的值還未更新,它指向當前指令后面第2條指令(對于ARM指令,它指向當前指令地址加8字節的位置;對于Thumb指令,它指向當前指令地址加4字節的位置)。此時處理器將值(pc-4)保存到lr_abt中,它指向當前指令的下一條指令,所以返回操作可以通過下面指令實現:

  1. SUBS  PC,LR_abt,#4 

3.未定義指令異常:

未定義指令異常中斷由當前執行的指令在ALU里執行時產生,當未定義指令異常中斷產生時,程序計數器pc的值還未更新,它指向當前指令后面第2條指令(對于ARM指令,它指向當前指令地址加8字節的位置;對于Thumb指令,它指向當前指令地址加4字節的位置),當未定義指令異常中斷發生時,處理器將值(pc-4)保存到lr_und中,此時(pc-4)指向當前指令的下一條指令,所以從未定義指令異常中斷返回可以通過如下指令來實現:

  1. MOV  PC,  LR_und 

4.軟中斷指令(SWI)異常:

SWI異常中斷和未定義異常中斷指令一樣,也是由當前執行的指令在ALU里執行時產生,當SWI指令執行時,pc的值還未更新,它指向當前指令后面第2條指令(對于ARM指令,它指向當前指令地址加8字節的位置;對于Thumb指令,它指向當前指令地址加4字節的位置),當未定義指令異常中斷發生時,處理器將值(pc-4)保存到lr_svc中,此時(pc-4)指向當前指令的下一條指令,所以從SWI異常中斷處理返回的實現方法與從未定義指令異常中斷處理返回一樣:

  1. MOV  PC,  LR_svc 

5.數據中止異常:

發生數據訪問異常中斷時,程序要返回到該有問題的指令處,重新訪問該數據,因此數據訪問異常中斷應該返回到產生該數據訪問中止異常中斷的指令處,而不是當前指令的下一條指令。數據訪問異常中斷由當前執行的指令在ALU里執行時產生,當數據訪問異常中斷發生時,程序計數器pc的值已經更新,它指向當前指令后面第3條指令(對于ARM指令,它指向當前指令地址加12字節的位置;對于Thumb指令,它指向當前指令地址加6字節的位置)。此時處理器將值(pc-4)保存到lr_abt中,它指向當前指令后面第2條指令,所以返回操作可以通過下面指令實現:

  1. SUBS  PC,  LR_abt,  #8 

上述每一種異常發生時,其返回地址都要根據具體異常類型進行重新修復返回地址,「再次強調下,被打斷程序的返回地址保存在對應異常模式下的LR_excep里」。

2. 模式恢復

異常發生后,進入異常處理程序時,將用戶程序寄存器R0~R12里的數據保存在了異常模式下棧里面,異常處理完返回時,要將棧里保存的的數據再恢復回原先R0~R12里。

毫無疑問在異常處理過程中必須要保證異常處理入口和出口時棧指針SP_excep要一樣,否則恢復到R0~R12里的數據不正確,返回被打斷程序時執行現場不一致,出現問題,雖然將執行現場恢復了,但是此時還是在異常模式下,CPSR里的狀態是異常模式下狀態。

因此要恢復SPSR_excep里的保存狀態到CPSR里,SPSR_excep是被打斷程序執行時的狀態,在恢復SPSR_excep到CPSR的同時,CPU的模式和狀態從異常模式切換回了被打斷程序執行時的模式和狀態。

此刻程序現場恢復了,狀態也恢復了,但PC里的值仍然指向異常模式下的地址空間,我們要讓CPU繼續執行被打斷程序,因此要再手動改變PC的值為進入異常時的返回地址,該地址在異常處理入口時已經計算好,直接將PC = LR_excep即可。

上述操作可以一步一步實現,但是通常我們可以通過一條指令實現上述全部操作:

  1. LDMFD  SP_excp!,  {r0-r12,  pc}^ 

注:SP_excep為對應異常模式下SP,^符號表示恢復SPSR_excep到CPSR。

六、異常與模式關系

  1. reset異常進入SVC模式
  2. fiq快速中斷請求異常進入快中斷模式,支持高速數傳輸及通道處理(FIQ異常響應時進入此模式)
  3. irq中斷請求異常進入中斷模式,用于通用中斷處理,(IRQ異常響應時進入此模式)
  4. prefetch預取指中止,數據中止異常進入中止模式,用于支持虛擬內存和/或存儲器保護
  5. undef未定義指令異常進入未定義模式,支持硬件協處理器的軟件仿真(未定義指令異常響應時進入此模式)
  6. swi軟件中斷,復位異常進入管理模式,操作系統保護代碼(系統復位和軟件中斷響應時進入此模式)

七、irq中斷異常

1.中斷的概念

什么是中斷,我們從一個生活的例子引入。我們正在家中看書,突然電話鈴響了,你放下書本,去接電話,和來電話的人交談,然后放下電話,回來繼續看你的書。這就是生活中的"中斷"的現象,也就是正常的工作過程被外部的事件打斷了。

在處理器中,所謂中斷,是一個過程,即CPU在正常執行程序的過程中,遇到外部/內部的緊急事件需要處理,暫時中斷(中止)當前程序的執行,而轉去為事件服務,待服務完畢,再返回到暫停處(斷點)繼續執行原來的程序。為事件服務的程序稱為中斷服務程序或中斷處理程序。

嚴格地說,上面的描述是針對硬件事件引起的中斷而言的。用軟件方法也可以引起中斷,即事先在程序中安排特殊的指令,CPU執行到該類指令時,轉去執行相應的一段預先安排好的程序,然后再返回來執行原來的程序,這可稱為軟中斷。把軟中斷考慮進去,可給中斷再下一個定義:中斷是一個過程,是CPU在執行當前程序的過程中因硬件或軟件的原因插入了另一段程序運行的過程。因硬件原因引起的中斷過程的出現是不可預測的,即隨機的,而軟中斷是事先安排的。

2. 中斷處理流程

中斷異常發生時,整個處理流程:

如上圖所示:

1.執行執行到0x30000008時產生中斷

2.cpu執行4大步3小步

  1. 1) 保存CPSR到SPSR_irq 
  2. 2) 根據異常類型,設置模式標識位CPSR[4:0],CPU執行狀態CPSR[5]:T位=0和關閉中斷 
  3. 3) 設置返回地址LR=0x30000010 
  4. 4) 將PC指向對應的異常向量表地址[中斷IRQ:0x00000018] 

3.進入到異常向量表后執行 b 指令,跳轉到異常處理函數

4.異常處理函數需要執行以下操作

  1. 1) 修正返回地址 SUBS    PC,LR_irq,#4 ,即0x3000000C 
  2. 2) 保存現場寄存器 
  3. 3) 跳入中斷處理函數isr_proccess(),執行中斷處理程序 
  4. 4) 恢復現場寄存器 
  5. 5) 返回現場PC=LR 

5.程序又回到0x3000000C位置,繼續執行

關于中斷更詳細的講解,會在后續文章中詳細講解,請關注 [一口Linux]。

八、swi異常

SWI指令

SWI指令的格式為:

  1. SWI{條件} 24位的立即數 

SWI指令用于產生軟件中斷,以便用戶程序能調用操作系統的系統例程。操作系統在SWI的異常處理程序中提供相應的系統服務,指令中24位的立即數指定用戶程序調用系統例程的類型,相關參數通過通用寄存器傳遞,當指令中24位的立即數被忽略時,用戶程序調用系統例程的類型由通用寄存器R0的內容決定,同時,參數通過其他通用寄存器傳遞。

舉例:

  1. SWI  0x02      ;該指令調用操作系統編號位02的系統例程。 

BKPT指令BKPT指令的格式為:BKPT 16位的立即數 BKPT指令產生軟件斷點中斷,可用于程序的調試。

舉例以下是一個包含異常向量表的代碼,程序值填寫了reset異常和swi異常的入口,其他入口地址可以用空指令nop填充在這個位置。

  1.  area first, code, readonly 
  2.  code32 
  3.  entry 
  4. ; 定義的異常向量表 
  5. vector 
  6.  b reset_handler  ; 跳轉到 reset_handler 
  7.  nop  
  8.  b swi_handler  ; SWI 指令異常跳轉的地址 
  9.  nop  
  10.  nop  
  11.  nop  
  12.  nop 
  13.  nop  
  14. swi_handler 
  15.  ; swi handler code  
  16.  ; 異常處理首先要壓棧保存處理器現場 
  17.  mrs r0, cpsr 
  18.  bic r0, r0, #0x1f 
  19.  orr r0, r0, #0x10 
  20.  msr cpsr_c, r0 
  21.    
  22.  ;ldr r0, [lr, #-4] ; 獲得SWI指令的機器碼,lr前面那個指令是swi指令,下標在該指令中 
  23.  ;bic r0, r0, #0xff000000  ; 通過機器碼獲得SWI NUMBER  
  24.  movs pc, lr     ; lr > pc 且 spsr -> cpsr返回 SVC -> USER 
  25. reset_handler 
  26.  ; 初始化 SVC 模式堆棧 
  27.  ldr sp, =0x40001000 
  28.  ; 修改當前的模式從SVC模式改變為USER模式 
  29.  mrs r0, cpsr 
  30.  bic r0, r0, #0x1f 
  31.  orr r0, r0, #0x10 
  32.  msr cpsr_c, r0 
  33.     ; 初始化 USER 模式堆棧 
  34.  ldr sp, =0x40000800 
  35.  mov r0, #1     
  36.  ; USER SWI 
  37.  swi 5  ; open  APP USER 這條語句由用戶程序自己出發異常    
  38.         ; 觀察并記錄對比指令執行前后的 PC LR CPSR SPSR SP的變化  
  39.         ;并思考異常產生后處理器硬件自動發生了那些變化 
  40.  add r1, r0, r0 
  41. stop 
  42.  b stop 
  43.  end 

運行過程如下所示:


swi指令執行

主要是注意觀察swi執行前和執行后,模式的變化,大家可以按照4大步3小步來分析。


swi指令執行前后對比變化

如何同時跳轉并切換模式?從swi異常返回時,我們需要執行兩個動作:

  1. 將spsr拷貝會cpsr,
  2. pc = lr 跳轉回原來的位置

這兩個動作都必須要執行,但是如果分步執行的話,spsr拷貝回去后,當前模式就變回了usr模式,那么對應的lr的值就變成了lr_usr,此時的值0x0【之前沒有執行過bl指令】,那怎么跳轉會去呢?我們可以用以下命令

  1. movs pc, lr 

此命令同時執行兩個動作:

  1. pc = lr  
  2. cpsr = spsr 返回 SVC -> USER 

從而實現了同時跳轉并切換模式。如果入口已經使用ldm壓棧可以用一下指令回復:

  1. LDMFD  SP_excp!,  {r0-r12,  pc}^ 

參見第五章。

如何獲取軟中斷號?

1.要獲取swi指令的中斷號,我們只能從swi的機器碼中得到對應的值,

2. 而要想得到swi這條指令的內容,就要先找到這條指令的地址, 而lr的值是swi這條指令的下一條指令的地址,所以我們可以通過以下代碼得到軟中斷號。

  1. ldr r0, [lr, #-4] ; 獲得SWI指令的機器碼,lr前面那個指令是swi指令,下標在該指令中 
  2. bic r0, r0, #0xff000000  ; 通過機器碼獲得SWI NUMBER  

系統調用與swi

系統調用

linux的應用程序有很多的系統調用,比如open,read,socket等實際上會觸發swi異常,觸發系統調用sys_open,sys_read等,內核根據swi的值來執行具體的操作。

每個系統調用都有自己惟一的編號,系統調用函數的標識符在以下文件定義:

  1. linux/arch/arm/kernel/calls.S 

內容如下:

  1. /* 0 */  CALL(sys_restart_syscall) 
  2.   CALL(sys_exit) 
  3.   CALL(sys_fork) 
  4.   CALL(sys_read) 
  5.   CALL(sys_write) 
  6.   ………… 
  7. /* 375 */ CALL(sys_setns) 
  8.   CALL(sys_process_vm_readv) 
  9.   CALL(sys_process_vm_writev) 
  10.   CALL(sys_kcmp) 
  11.   CALL(sys_finit_module) 
  12. #ifndef syscalls_counted 
  13. .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls 
  14. #define syscalls_counted 
  15. #endif 
  16. .rept syscalls_padding 
  17.   CALL(sys_ni_syscall) 
  18. .endr 

SWI代碼片段分析

搜索下vector_swi,找到入口函數

  1. arch\arm\kernel\entry-common.S 

  1. .align  5 
  2. Y(vector_swi) 
  3. @ 保存現場 
  4.  
  5. sub sp, sp, #S_FRAME_SIZE 
  6. stmia   sp, {r0 - r12}          @ Calling r0 - r12 
  7. add r8, sp, #S_PC 
  8. stmdb   r8, {sp, lr}^           @ Calling sp, lr 
  9. mrs r8, spsr            @ called from non-FIQ mode, so ok. 
  10. str lr, [sp, #S_PC]         @ Save calling PC 
  11. str r8, [sp, #S_PSR]        @ Save CPSR 
  12. str r0, [sp, #S_OLD_R0]     @ Save OLD_R0 
  13. zero_fp 
  14.  
  15. @ 獲得swi的指令地址,確保是swi指令 
  16. ldr scno, [lr, #-4]         @ get SWI instruction 
  17. A710(   and ip, scno, #0x0f000000       @ check for SWI     ) 
  18. A710(   teq ip, #0x0f000000                     ) 
  19. A710(   bne .Larm710bug                     ) 
  20.  
  21. @ tbl等于數組表基地址 
  22. get_thread_info tsk 
  23. adr tbl, sys_call_table     @ load syscall table pointer 
  24. ldr ip, [tsk, #TI_FLAGS]        @ check for syscall tracing 
  25.  
  26. @清除高8位 
  27. bic scno, scno, #0xff000000     @ mask off SWI op-code 
  28. @ #define __NR_SYSCALL_BASE 0x900000  這里swi的值實際上是0x900000 0x900001 ...所以要清除這個高位的9 
  29. eor scno, scno, #__NR_SYSCALL_BASE  @ check OS number 
  30.  
  31. @根據索引號,去tbl 這個數組中調用函數 
  32. @ tbl:數組表基地址,  scno:要調用的sys_write()的索引值     lsl #2:左移2位,一個函數指針占據4個字節 
  33. cmp scno, #NR_syscalls      @ check upper syscall limit 
  34. adr lr, ret_fast_syscall        @ return address 
  35. ldrcc   pc, [tbl, scno, lsl #2]     @ call sys_* routine 

1.這里首先獲得swi這條指令的內容,swi指令位于lr-4,原因如下圖

2. 然后分析確保是swi指令,也就是

  1. and ip, scno, #0x0f000000 

 

 3. 獲得全局的一個存有系統調用函數的數組的地址

4. 通過swi的值去找到這個數組的索引,執行函數

 

責任編輯:姜華 來源: 一口Linux
相關推薦

2011-03-29 15:44:41

對日軟件外包

2021-07-12 07:01:39

AST前端abstract sy

2021-05-25 11:50:32

ARMuboot網絡協議棧

2020-12-11 09:05:04

ARMMDKGNU

2021-01-13 11:51:25

ARM位置無關碼

2019-04-03 09:10:35

Rediskey-value數據庫

2019-11-21 15:08:13

DevOps云計算管理

2010-08-19 10:12:34

路由器標準

2021-01-08 12:06:59

WDT定時裝置

2025-08-06 06:15:00

2013-11-11 10:07:43

靜態路由配置

2018-07-16 09:00:32

LinuxBash數組

2017-03-13 17:25:00

移動支付技術支撐易寶

2021-01-16 11:40:28

ARM嵌入式開發ADC應用

2015-06-05 09:52:41

公有云風險成本

2025-08-28 06:05:00

2017-12-26 11:37:32

云原生CNCF容器

2012-02-21 09:20:50

Hadoop大數據

2021-01-14 08:31:54

Web開發應用程序

2010-07-27 09:00:32

MySQL鎖
點贊
收藏

51CTO技術棧公眾號

日韩三级视频在线观看| 国产欧美一区二区精品忘忧草| 久久综合久中文字幕青草| 毛毛毛毛毛毛毛片123| 日本不卡影院| 久久综合久久综合亚洲| 国产精品三级美女白浆呻吟 | 久久精品亚洲麻豆av一区二区| 国产精品私拍pans大尺度在线| 久草视频免费在线播放| 欧洲美女日日| 亚洲精品一区二区三区在线观看| 国产三级三级三级看三级| 羞羞污视频在线观看| 久久亚洲欧美国产精品乐播| 亚洲精品免费网站| 欧美日韩在线视频播放| 国产精品国码视频| 中文字幕v亚洲ⅴv天堂| 精品影片一区二区入口| 国产精品xnxxcom| 色偷偷成人一区二区三区91 | 精品精品导航| 国产精品久久久久影院| 久久久久久九九九九| 99国产精品一区二区三区| 日韩电影免费在线| 97视频在线播放| 国产大学生自拍| 日韩aaaa| 一道本无吗dⅴd在线播放一区| 老熟妇精品一区二区三区| 国产成人久久精品一区二区三区| 欧洲视频一区二区| 无码人妻h动漫| 白白色在线观看| 一级做a爱片久久| 国产精品无码乱伦| 99青草视频在线播放视| 久久精品一区二区| 久久综合入口| 污污的视频网站在线观看| 国产白丝网站精品污在线入口| 成人免费看吃奶视频网站| 中文字幕日日夜夜| 视频一区二区国产| 欧美又大粗又爽又黄大片视频| 国产一级在线免费观看| 精品动漫3d一区二区三区免费版 | 日韩精品电影网| 黑人玩弄人妻一区二区三区| 最新精品在线| 亚洲精品一区二区三区精华液 | 欧美日韩成人在线播放| 国产精品嫩草影院俄罗斯| 欧美第一精品| 久久伊人精品天天| 青娱乐免费在线视频| 中文乱码免费一区二区三区下载| 久久天天躁狠狠躁老女人| 黄色a级片在线观看| 亚洲精品网址| 欧美精品videos性欧美| 国产大片中文字幕在线观看| 日韩午夜黄色| 国产成人精品一区二区三区| 超碰在线免费97| 蜜臀av国产精品久久久久| 国产日韩欧美视频在线| 国产欧美第一页| 国产成人欧美日韩在线电影| 91久久精品一区二区别| 日韩在线观看视频一区二区三区 | 国产精品一区二区三区在线| 无码精品在线观看| 中文字幕第一区综合| 永久免费精品视频网站| 直接在线观看的三级网址| 亚洲国产另类精品专区| 亚洲熟女乱色一区二区三区| 91综合国产| 日韩一区二区在线观看| 国产成人精品无码片区在线| 久久99国内| 久久伊人色综合| 亚洲综合一二三| 日本成人在线一区| 成人黄视频免费| 国产在线高清| 伊人开心综合网| 欧美日韩第二页| 国产一区二区三区免费观看在线| 亚洲国产精品推荐| 91视频最新网址| 亚洲制服av| 91久久在线播放| 九色视频在线观看免费播放| 亚洲色大成网站www久久九九| 人人妻人人添人人爽欧美一区| 日韩欧美2区| 亚洲精品一区二区三区四区高清| 国产午夜福利一区| 在线精品亚洲| 91久久久久久久| 男人av在线| 亚洲一区二区三区国产| 久草在在线视频| 国产毛片精品| 久久久精品在线| 一二三区免费视频| 成人国产亚洲欧美成人综合网| 亚洲国产精品视频一区| 看黄在线观看| 欧美成人在线直播| 黄色av片三级三级三级免费看| 99在线|亚洲一区二区| 亚洲影影院av| 伊人免费在线| 在线免费一区三区| 亚洲中文字幕无码av| 影音先锋成人在线电影| 国产精品一区电影| 青青久在线视频免费观看| 亚洲一区二区综合| 中文字幕第66页| 97精品国产福利一区二区三区| 66m—66摸成人免费视频| 国产三级视频在线播放| 中文字幕日韩一区| 青青草精品视频在线观看| 首页亚洲中字| 韩剧1988在线观看免费完整版| 国产手机av在线| 亚洲天堂av一区| 日韩高清第一页| 久久密一区二区三区| 国产精品久久久久91| 精品无人乱码| 色av一区二区| 精品人妻一区二区三区四区| 久久激情久久| 欧美专区一二三| 欧美天堂视频| 夜夜嗨av色综合久久久综合网| 欧美亚洲另类小说| 国产网红主播福利一区二区| 日韩视频在线免费看| 精品freesex老太交| 国产成人在线一区| 电影av一区| 欧美日韩日日骚| 中文字幕91视频| 极品少妇xxxx精品少妇| 国产四区在线观看| 欧洲精品99毛片免费高清观看 | 亚欧精品在线| 欧美a一级片| 久久久999精品免费| 国产av无码专区亚洲av麻豆| 亚洲激情图片小说视频| 中文字幕18页| 亚洲看片一区| 欧美视频1区| 亚洲青青一区| 久久久久久国产| 视频福利在线| 欧美三级视频在线观看| 神马久久精品综合| 国产不卡在线视频| 91免费视频网站在线观看| 欧美少妇xxxx| 亚洲一区美女视频在线观看免费| 毛片大全在线观看| 亚洲欧美激情一区| 国产精品视频在线观看免费| 一区二区视频免费在线观看| 99久久免费看精品国产一区| 丝袜亚洲另类欧美| av磁力番号网| 日韩理论电影中文字幕| 国产在线一区二区三区| 久草在线资源站资源站| 亚洲色图狂野欧美| 99在线观看免费| 欧美视频中文在线看| 永久av免费网站| 99久久综合精品| 日本久久久久久久久久久久| 欧美激情1区2区| 麻豆av福利av久久av| 亚洲欧美一级| 热久久这里只有| 成人福利片网站| 日韩国产精品亚洲а∨天堂免| 中文字幕第一页在线播放| 一区二区三区四区五区视频在线观看| 稀缺小u女呦精品呦| 美女精品在线| 欧美黄色免费网址| 青青一区二区三区| 精品国产乱码久久久久软件| 91成人精品观看| 日韩美女毛茸茸| 国产美女情趣调教h一区二区| 国产一区二区三区日韩欧美| 亚洲女人18毛片水真多| 欧美三级午夜理伦三级中视频| 九九热国产视频| 亚洲人妖av一区二区| 亚洲a v网站| 成人黄色国产精品网站大全在线免费观看| 国产九九在线视频| 香蕉久久a毛片| 国产欧美日韩小视频| 欧美激情黄色片| 日本精品一区| 日韩最新在线| 国产欧美日韩视频一区二区三区| 91成人小视频| 国产精品丝袜视频| 日韩伦理三区| 日本电影亚洲天堂| 不卡视频观看| 欧美国产乱视频| av免费在线观看网站| 最近2019中文字幕第三页视频| 五月婷婷免费视频| 欧美tk丨vk视频| 国产精品无码白浆高潮| 欧美日韩在线三区| 蜜臀尤物一区二区三区直播| 欧美日韩午夜视频在线观看| 久久视频免费看| 一区二区三区精品| 国产精品成人免费观看| 18成人在线视频| 日韩av毛片在线观看| 日本一区二区三级电影在线观看| 黄色a一级视频| 不卡区在线中文字幕| 又大又长粗又爽又黄少妇视频| 韩日欧美一区二区三区| 国产精品嫩草影视| 国产一区二区三区美女| 午夜剧场在线免费观看| 精品午夜一区二区三区在线观看| 狠狠操狠狠干视频| 精品在线你懂的| 亚洲天堂伊人网| 韩国成人福利片在线播放| 欧美一级特黄aaa| 国产精品一区二区三区网站| 欧美体内she精高潮| 国产精品一区二区男女羞羞无遮挡| 久久久福利影院| 高清不卡一二三区| 欧美做受高潮中文字幕| proumb性欧美在线观看| 中文字幕第3页| 91丝袜美腿高跟国产极品老师| 播金莲一级淫片aaaaaaa| 久久精品视频网| 免费一级黄色录像| 亚洲色图第一区| 久久久久久久久久99| 五月激情综合色| 不卡av电影在线| 欧美日韩亚洲综合| 国产特级黄色片| 亚洲精品美女在线| 国产高清免费av在线| 美乳少妇欧美精品| 欧亚av在线| 国产精品视频1区| 国产精品一区二区精品| 国产一区二区视频在线免费观看| 女厕嘘嘘一区二区在线播放| 一区二区免费在线观看| 欧美激情亚洲| 日本黄网站免费| 九九精品视频在线看| 少妇熟女视频一区二区三区 | 欧美一级黄色片| 午夜福利一区二区三区| 中文字幕亚洲欧美日韩在线不卡| 综合久久2o19| 欧美一区二区影院| 91九色成人| 麻豆av一区二区三区久久| 日韩激情免费| 日韩人妻无码精品久久久不卡| 久久综合导航| 国产成人精品综合久久久久99| 99久久精品久久久久久清纯| 少妇的滋味中文字幕bd| 午夜欧美视频在线观看 | а√天堂中文在线资源8| 国产精品69精品一区二区三区| 国产精品视频一区二区三区综合| 麻豆av一区二区三区久久| 欧美精品福利| 在线看的黄色网址| 99精品视频一区二区| 国产午夜手机精彩视频| 日本道在线观看一区二区| 成人免费一级视频| xxxxx91麻豆| 天天免费亚洲黑人免费| 国产精品18毛片一区二区| 99re66热这里只有精品8| 自拍日韩亚洲一区在线| 国产一区二区剧情av在线| 亚洲精品乱码久久久久久久久久久久| 亚洲制服丝袜av| 97人妻精品一区二区三区| 亚洲欧洲日产国码av系列天堂| 国产丝袜精品丝袜| 91亚洲国产成人久久精品网站 | www.在线成人| 九九热最新地址| 欧美色视频一区| 欧美成人片在线| 97精品免费视频| 日韩高清一区| 特级毛片在线免费观看| 日本欧美一区二区三区| 国产三级国产精品| 午夜精品福利一区二区蜜股av| 性色av蜜臀av| 久久亚洲精品国产亚洲老地址| 四虎成人在线| 日本一区二区在线| 久久久久久久波多野高潮日日| 国产激情第一页| 欧美日韩精品在线视频| 人妻91麻豆一区二区三区| 九九精品在线观看| 久久伊人影院| 国内自拍中文字幕| 国产乱码精品一区二区三| 午夜剧场免费在线观看| 欧美日本在线看| 日韩专区在线| 91麻豆桃色免费看| 在线观看国产精品入口| 中文字幕第22页| 曰韩精品一区二区| 亚洲黄色精品视频| 欧美精品国产精品日韩精品| 91精品短视频| 大伊香蕉精品视频在线| 丁香六月久久综合狠狠色| 久久久久久久久久久久久久久久久 | 国内精品视频在线观看| 久久网站免费视频| 国产日韩欧美精品在线| 中文字幕人妻色偷偷久久| 久久精品国产69国产精品亚洲 | 日韩欧美电影一二三| 美女网站视频在线| 精品欧美一区二区久久久伦 | 免费黄频在线观看| 亚洲精品国产精品乱码不99 | 国产午夜久久av| 成人免费看片'免费看| 99久久国产综合色|国产精品| www.国产一区二区| 国产亚洲精品成人av久久ww| 粉嫩一区二区三区在线观看| 国产精品videossex国产高清| 91在线观看一区二区| 波多野结衣视频观看| 久久精品视频在线| 动漫av一区| 久久久久久久少妇| 亚洲免费av在线| 日本wwwxxxx| 国产美女久久精品香蕉69| 亚洲成人一区| 国产熟女高潮一区二区三区| 欧洲另类一二三四区| 18加网站在线| 久久www免费人成精品| 精品亚洲成av人在线观看| 日本少妇激情舌吻| 最近中文字幕日韩精品 | 日韩伦理一区二区| 精品人妻少妇一区二区| 国产精品女主播av| 亚洲精品国产精品乱码不卡| 日韩免费av在线| 黄色亚洲在线| 老司机福利在线观看| 欧美大胆人体bbbb| 国产成+人+综合+亚洲欧美| 欧日韩免费视频| 国产精品传媒入口麻豆| 日韩欧美在线观看一区二区| 91免费国产网站| 丝袜a∨在线一区二区三区不卡|