arm linux 中斷 分析,armlinux中斷異常的處理分析.pdf

基于 ARM Linux 中斷、異常的處理分析

本文是基于ARM S3C2410X 系統的Linux 2.6 中斷、異常和系統調用的處理分析。

主要有以下幾個部分:

1. ARM 的硬件中斷機制

2. Linux 2.6 對 ARM 中斷向量表的初始化

3. Linux 2.6 對 ARM 中斷、異常的處理(從匯編-->C 語言函數;asm_do_IRQ )

一、 ARM 的硬件中斷機制

1、中斷的基本概念

在嵌入式系統中外部設備的功能實現主要是依靠中斷機制來實現的,即將設

備功能程序的實現以中斷服務子程序的形式進行組織。

中斷 (interrupt )通常被定義為一個事件,該事件改變處理器執行的指令順序。

這樣的事件與 CPU 芯片外部硬件電路產生的電信號相對應。

中斷的產生 每個能夠發出中斷請求的硬件設備控制器都有一條稱為

IRQ(Interrupt ReQuest) 的輸出線。所有的IRQ 線都與一個中斷控制器的輸入引腳

相連,中斷控制器與 CPU 的INTR 引腳相連。

設備

設備

控制器

中斷

控制器

IRQ

CPU

INTR

中斷向量 每個中斷和異常由 0~255 之間的一個數(8 位)來標識,Intel 稱其為

中斷向量。

中斷描述符表 (Interrupt Descriptor Table ,IDT )是一個系統表,它與每一個中斷

或異常向量相聯系,每一個向量在表中有相應的中斷或異常處理程序的入口地

址。內核在允許中斷發生前,必須適當地初始化 IDT 。表中的每一項對應一個中

斷或異常向量,每個向量由 8 個字節組成。因此,最多需要 256*8=2048 字節來

存放 IDT 。CPU 的idtr 寄存器指向 IDT 表的物理基地址。

2、中斷和異常的硬件處理

在內核被 Init 進程初始化后,CPU 運行在保護模式下。當執行了一條指令后,

cs 和 eip 這對寄存器包含了下一條將要執行的指令的邏輯地址。在執行這條指令

之前,CPU 控制單元會檢查在運行前一條指令時是否發生了一個中斷或者異常。

如果發生了一個中斷或異常,那么 CPU 控制單元執行下列操作:

(1) 確定與中斷或者異常關聯的向量 i (0~255 )。

(2) 讀由 idtr 寄存器指向的 IDT 表中的第 i 項。

(3) 從 gdtr 寄存器獲得 GDT 的基地址,并在 GDT 中查找,以讀取IDT 表項中的

選擇符所標識的段描述符,這個描述符指定中斷或異常處理程序所在段的基

地址。

(4) 確定中斷是由授權的發生源發出的。

中斷:中斷處理程序的特權不能低于引起中斷的程序的特權(當前特權級CPL

—對應 CS 寄存器中的低兩位 其值應該小于段描述符—對應 GDT 表

項中的描述符特權級 DPL ,特權級高于DPL ,即當前代碼是能夠訪問

相應的段的,產生一個“General protection ”異常);

編程異常:還需進一步比較 CPL 與對應 IDT 表項中的門描述符的 DPL 。

即當 CPL 的特權級高于 GDT 表項中的描述符特權級 DPL ,但低于 IDT 表

項中的門描述符的 DPL ,就是異常。

(5) 檢查是否發生了特權級的變化,一般指是否由用戶態陷入了內核態。也就是

說 CPL 是否不同于所選擇的段描述符的 DPL ,如果是,控制單元必須開始使

用與新的特權級相關的堆棧,通過以下操作來做到這點:

A 、讀tr 寄存器,訪問運行進程的 TSS 段;

B 、用與新特權級相關的棧段和棧指針裝載 ss 和 esp 寄存器。這些值可以在

進程的 TSS 段中找到;

C、在新的棧中保存 ss 和 esp 以前的值,這些值指明了與舊特權級相關的棧

的邏輯地址。

(6) 若發

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453304.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453304.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453304.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(數據科學學習手札03)Python與R在隨機數生成上的異同

隨機數的使用是很多算法的關鍵步驟,例如蒙特卡洛法、遺傳算法中的輪盤賭法的過程,因此對于任意一種語言,掌握其各類型隨機數生成的方法至關重要,Python與R在隨機數底層生成上都依靠梅森旋轉(twister)來生成…

音視頻編解碼知識學習詳解(分多部分進行詳細分析)

1. 常用的基本知識 基本概念 編解碼 編解碼器(codec)指的是一個能夠對一個信號或者一個數據流進行變換的設備或者程序。這里指的變換既包括將信號或者數據流進行編碼(通常是為了傳輸、存儲或者加密)或者提取得到一個編碼流的操作…

二叉樹非遞歸后序遍歷算法

與正常的非遞歸中序遍歷算法不同于兩點: 一 比正常的中序遍歷算法多了對數據元素的標記。 在壓數據元素入棧(標記記為0,用來表示訪問了其左子樹)時標記, 還有訪問完左子樹利用gettop()獲取雙親…

SQL*Plus命令

SQL*Plus命令 前言 一:SQL*Plus 與數據庫的交互 二:設置SQL* Plus的運行環境 二 - 1 :SET命令概述 二 - 2 :使用SET命令設置運行環境 二 - 2 ____1:Pagesize 變量 1 SYSorcl> show pagesize2 pages…

redis-day1

1 Redis 概述 REmote DIctionary Server(Redis)是一個基于key-value鍵值對的持久化數據庫存儲系統。redis和大名鼎鼎的Memcached緩存服務軟件很像,但是Redis支持的數據存儲類型比Memcached更豐富,包括strings(字符串)、lists&…

C語言數碼管是共陰共陽程序,C語言實現共陰極數碼管操作

共陰極或者共陽極數碼管,因為其需要電流大,而一般51輸出電流低,需要鎖存器。買的開發板使用的共陰極數碼管。至于其構造,找個相關方面的書看看,這里主要是對做好的電路板進行編程。剛開始的時候,感覺在數碼…

數據庫主要特點

(1)實現數據共享。數據共享包含所有用戶可同時存取數據庫中的數據,也包括用戶可以用各種方式通過接口使用數據庫,并提供數據共享。 (2)減少數據的冗余度。同文件系統相比,由于數據庫實現了數據共享,從而避免了用戶各自建立應用文…

百度與華為全面戰略合作 人工智能手機真的要來了

視頻加載中...12月21日百度和華為在北京宣布達成全面戰略合作。這次合作內容主要包括三點,首先是在語音、語義、視覺和VR上的自然交互,這是百度為華為手機AI賦能的基礎層。第二是基于華為HiAI平臺和百度PaddlePaddle深度學習框架,共建人工智能…

JavaScript數據類型

一、JavaScript數據類型主要分為原始類型和引用數據類型。 原始類型包括(不可拆分的東西):Number、String、Boolean、Null、Undefined。引用數據類型包括:Object(Array,Date,RegExp,Function)ty…

funcode拼圖游戲c語言程序,同求funcode平臺下拼圖游戲的C語言代碼

做了好幾天,寫了好多回就是不對,徹底崩潰。。#include "CommonAPI.h"//#include "LessonX.h"#include#define BLOCK_COUNT 4int g_iGameState;intg_iBlockState[BLOCK_COUNT][BLOCK_COUNT];charg_szBlockName[BLOCK_COUNT*BLOCK_COU…

什么是透明傳輸

透明傳輸是指不管所傳數據是什么樣的比特組合,都應當能夠在鏈路上傳送。當所傳數據中的比特組合恰巧與某一個控制信息完全一樣時,就必須采取適當的措施,使收方不會將這樣的數據誤認為是某種控制信息。這樣才能保證數據鏈路層的傳輸是透明的。…

Android 秒級編譯FreeLine

項目地址:FreeLine FreeLine官網: FreeLine 1. 安裝FreeLine插件 File->Settings->Plugins, 搜索輸入FreeLine Plugin, 查找到后進行安裝并重啟Android Studio。 圖1.png安裝好之后,在工具欄就會出一個圖標 圖2.png2. 配置gradle 根目錄build.gr…

JS實現大整數乘法(性能優化、正負整數)

本方法的思路為: 一:檢查了輸入的合法性(非空,無非法字符) 二:檢查輸入是否可以進行簡單計算(一個數為 0,1,1,-1) 三:去掉輸入最前面可…

c語言中- gt he,C語言中deta,fabs,lt;stdlib.hgt;,lt;stdio.hgt;分別是什么意思

fabs 編輯本段C語言數學函數:fabs 函數簡介  原型:在TC中原型是extern float fabs(float x);,在VC6.0中原型是double fabs( double x );。   用法:#include   功能:求浮點數x的絕對值   說明:計算|x|, 當x不為…

物理層

目的: 物理層要盡可能地屏蔽掉物理設備和傳輸媒體,通信手段的不同,使數據鏈路層感覺不到這些差異,只考慮完成本層的協議和服務。 給其服務用戶(數據鏈路層)在一條物理的傳輸媒體上傳送和接收比特流…

C語言中的二級指針(雙指針)

二級指針又叫雙指針。C語言中不存在引用,所以當你試圖改變一個指針的值的時候必須使用二級指針。C中可以使用引用類型來實現。 下面講解C中的二級指針的使用方法。 例如我們使用指針來交換兩個整型變量的值。 錯誤代碼如下: 一級指針 [cpp] view pla…

測試環境服務器硬盤塞滿問題排查

項目中出現的問題 某天下午測試環境服務器出現tab無法補全命令,給出的提示大概意思就是說,無可用空間無法創建臨時文件,不過這次跟上次出現的問題比較像,上次服務器出現的問題,因此樓主判斷可能是服務器數據盤被占滿,果…

alpine_glibc 構建sun jdk 8的docker鏡像

2019獨角獸企業重金招聘Python工程師標準>>> 構建系統基礎鏡像 alpine glibc 的Dockerfile內容如下&#xff1a; alpine:3.6 MAINTAINER tongqiang<tongqiangyingmail.com># Here we install GNU libc (aka glibc) and set C.UTF-8 locale as default.ENV ALP…

單工 半雙工 全雙工

1 單工 單工就是指A只能發信號&#xff0c;而B只能接收信號&#xff0c;通信是單向的&#xff0c;就象燈塔之于航船——燈塔發出光信號而航船只能接收信號以確保自己行駛在正確的航線上。 2 半雙工 半雙工就是指A能發信號給B&#xff0c;B也能發信號給A&#xff0c;但這兩…

c語言兩個循環的ys,c語言編程:從鍵盤輸入兩個數,求它們的最小公倍數

滿意答案flywisdom2019.06.20采納率&#xff1a;44% 等級&#xff1a;9已幫助&#xff1a;1064人main(){int p,r,n,m,temp;printf("Please enter 2 numbers n,m:");scanf("%d,%d",&n,&m);//輸入兩個正整數.if(n{tempn;nm;mtemp;}pn*m;//P是原來…