linux x86 關機 過程,linux在x86上的中斷處理過程(詳細)

Linux在x86上的中斷處理過程

一:引言

在Intel的文檔中,把中斷分為兩種。一種是異常,也叫同步同斷。一種稱之為中斷,也叫異常中斷。同步中斷指的是由CPU控制單元產生,之所以稱之為同步,是因為只有一條指令執行完畢后才會發出中斷。例如除法運算中,除數為零的時候,就會產生一個異常。異步中斷是由外部設備按照CPU的時鐘隨機產生的。例如,網卡檢測到一個數據到來就會產生一個中斷。

二:x86的中斷處理過程

由于中斷是開著的,所以當執行完一條指令后,cs和eip這對寄存器中已經包含了下一條將要執行的指令的邏輯地址。在處理那條指令之前,控制單元會檢查在運行前一條指令時是否發生了一個中斷或異常。如果發生了一個中斷和異常,那么控制單元執行下列操作:

1. 確定與中斷或異常關聯的向量i(0≤ i ≤255)

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

3. 從gdtr寄存器獲得GDT的基地址,并在GDT中查找,以讀取IDT表項中的選擇符標識的段描述符。這個描述符指定中斷或異常處理程序所在的段的基地址。

4. 確信中斷是由授權的(中斷)發生源發出的。首先將當前特權級CPL(存放在cs寄存器的低兩位)與段描述符(存放在GDT中)的描述符特權級DPL比較。如果CPL小于DPL,就產生一個“通常保護”異常,因為中斷處理程序的特權級不能低于引起中斷的程序的特權。對于編程異常,則做進一步的安全檢查:比較CPL與處于IDT中的門描述符的DPL,如果DPL小于CPL,就產生一個“通常保護”異常,這最后一個檢查可以避免用戶應用程序訪問特殊的陷阱門和中斷門。

5. 檢查是否發生了特權級的變化,也就是說,CPL是否不同于所選擇的段描述符的DPL。如果是,控制單元必須開始使用與新的特權級相關的棧,通過執行以下步驟來保證這一點:

A. 讀tr寄存器,以訪問運行進程的TSS段。

B. 用與新特權級相關的棧段和棧指針的正確值裝載ss和esp寄存器。這些值可以在TSS中找到。

C. 在新的棧中保存ss和esp以前的值,這些值定義了與舊特權級相關的棧的邏輯地址。

6. 如果故障已發生,用引起異常的指令地址裝載cs和eip寄存器,從而使得這條指令能再次被執行。

7. 在棧中保存eflag、cs和eip的內容。

8. 如果異常產生了一個硬件出錯碼,則將它保存在棧中。

9. 裝載cs和eip寄存器,其值分別是IDT表中第i項門描述符的段選擇符和偏移量字段。這些值給出了中斷或者異常處理程序的第一條指令的邏輯地址。控制單元所執行的最后一步就是跳轉到中斷或異常處理程序。換句話說,處理完中斷信號后,控制單元所執行的指令就是被選中處理程序的第一條指令。

上面的處理過程的描述摘自<>,其中有幾點值得注意的地方:

1:通過門后,只能提高運行級別。就像上面所述的 “當前特權級CPL(存放在cs寄存器的低兩位)與段描述符(存放在GDT中)的描述符特權級DPL比較。如果CPL小于DPL,就產生一個“通常保護”異常”。在中斷處理中,通常把IDT中的相應段選擇符設為__KERNEL_CS。即最高的運行級別

2:上面C所述:“在新的棧中保存ss和esp以前的值,這些值定義了與舊特權級相關的棧的邏輯地址”,那ss,esp以前的值是如何找到的呢?應該是從TSS中。在中斷發生的時候,如果檢測到運行級別發生了改了,將寄存器SS,ESP中的值保存進TSS的相應級別位置。再加載新的SS,ESP的值,然后從TSS中取出舊的SS,ESP值,再壓棧。

3:堆棧的改變,如下圖所示:

925a04e5db66152fc581af117062e2e0.png

從上圖中可以看到,硬件自動保存的硬件環境是非常少,要在中斷后恢復到以前的環境,還需要保存更多的寄存器值,這是由操作系統完成的。這在內核的代碼中可以看到中斷和異常被處理完畢后,相應的處理程序必須產生一條iret指令,把控制權轉交給被中斷的進程,這將迫使控制單元:

1. 用保存在棧中的值裝載cs、eip和eflag寄存器。如果一個硬件出錯碼曾被壓入棧中,并且在eip內容的上面,那么,執行iret指令前必須先彈出這個硬件出錯碼。

2. 檢查處理程序的CPL是否等于cs中的低兩位的值。如果是,iret終止返回;否則,轉入下一步。

3. 從棧中轉載ss和esp寄存器,因此,返回到與舊特權級相關的棧。

4. 檢查ds、es、fs及gs段寄存器的內容,如果其中一個寄存器包含的選擇符是一個段描述符,并且其DPL值小于CPL,那么,清相關的段寄存器。控制單元這么做是為了禁止用戶態的程序利用內核以前所用的段寄存器。如果不清除這些寄存器的話,惡意的用戶程序就會利用他們來訪問內核地址空間。

注意到4:舉例說明一下。如果通過系統調用進入內核態。然后將DS,ES的值賦為__KERNEL_DS(在2。4的內核里),處理完后(調用iret后),恢復CS,EIP的值,此時CS的CPL是3。因為DS,ES被設為了__KERNEL_DS,所以其DPL是0,所以要將DS,ES中的值清除。在2。6內核中,發生中斷或異常后,將DS,ES的值設為了__USER_DS,避免了上述的清除過程,提高了效率。

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

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

相關文章

thymealf 高級用法_Thymeleaf

JSP 已經存在很長時間了&#xff0c;很多公司還在用&#xff0c;它看起來像 HTML&#xff0c;但其實并不是&#xff0c;它有一些缺陷。比如&#xff0c;每個頁面頂部都需要有如下聲明與 Servlet 規范緊密耦合的&#xff0c;依賴 Servlet 容器(意味著無法直接瀏覽效果)。工作過的…

linux 顯卡轉碼,ffmpeg用GPU轉碼

8種機械鍵盤軸體對比本人程序員&#xff0c;要買一個寫代碼的鍵盤&#xff0c;請問紅軸和茶軸怎么選&#xff1f;有些視頻編碼太屌&#xff0c;播放起來對CPU消耗巨大&#xff0c;而在電視上或者電視盒子上看視頻&#xff0c;編碼就需要合適&#xff0c;樓主用的FireTV Stick&a…

ant實例 jmeter_Jmeter+ant搭建環境

1.將jmeter3.3和ant1.9.6放在一個文件夾下2.配置環境a、安裝jdk&#xff0c;配置環境變量變量名&#xff1a; JAVA_HOME變量值&#xff1a; C:\Program Files\Java\jdk1.8.0_91 (即jdk安裝的位置)變量名&#xff1a; Path (這個變量名已在系統變量中存在&#xff0c;現只需在這…

c語言課程設計作業五子棋,C語言課程設計報告五子棋游戲課程設計

C語言課程設計報告五子棋游戲課程設計 C語言課程設計報告_五子棋游戲-課程設計C語言課程設計報告_五子棋游戲|c語言程序代碼編程小程序設計|c語言課程設計報告課程案例**********************************************************//* 本程序在Turbo C或Borland C下編譯通過 */…

sqlmap圖形化_Web安全:SQL注入工具

原標題&#xff1a;Web安全&#xff1a;SQL注入工具SQL注入工具主要是針對Web服務器后臺數據庫的注入&#xff0c;其主要目的是獲取數據庫中的數據。以前常用的SQL注入工具有啊D注入工具及Domain(明小子注入工具)&#xff0c;現在常用的SQL注入工具有HackBar、SQLMap、Pangolin…

在c語言程序中 對文件進行操作首先要,《C語言程序設計》試題八及答案

版權聲明&#xff1a;以上文章中所選用的圖片及文字來源于網絡以及用戶投稿&#xff0c;由于未聯系到知識產權人或未發現有關知識產權的登記&#xff0c;如有知識產權人并不愿意我們使用&#xff0c;如果有侵權請立即聯系&#xff1a;55525090qq.com&#xff0c;我們立即下架或…

vue中多行文本標簽_vue控制多行文字展開收起的實現示例

這里講一下&#xff0c;如何使用vue控制多行文字展開收起(也叫控制文字展開隱藏)。效果&#xff1a;這里設置了控制三行&#xff0c;如果超過三行會展示&#xff0c;“顯示更多” 超出文字顯示省略號。點擊“顯示更多”會展開所有文案&#xff0c;按鈕變成“收起”(未超出三行的…

c語言什么時候需要加分號,歸納一下html中什么時候需要分號什么時候需要冒

公告&#xff1a; 為響應國家凈網行動&#xff0c;部分內容已經刪除&#xff0c;感謝讀者理解。話題&#xff1a;歸納一下html中什么時候需要分號什么時候需要冒號什么時候問題詳情&#xff1a;最近初學html和php&#xff0c;弄暈了回答&#xff1a;一般情況下&#xff0c;HTML…

python wheel使用_【轉載】Python,使用Wheel打包

轉載自&#xff1a; http://blog.sina.com.cn/s/blog_1318255b00102wbtz.htmlPython的第一個主流打包格式是.egg文件&#xff0c;現在大家庭中又有了一個叫做Wheel(*.whl)的新成員。wheel“被設計成包含PEP 376兼容安裝(一種非常接近于磁盤上的格式)的所有文件”。在本文中&…

c語言提取七位數講解,C語言-體育彩票7位數,感受身中500萬的fell

//體育彩票7位數&#xff0c;感受身中500萬的fell#include #include #include #include //用到隨機數函數#include int main(){int iUser[7]; //保存我們購買彩票的號碼int iSys[7];//保存開獎的號碼int i, j;int count 0;//保存我們中獎號碼的個數//srand((unsigned)time(0…

cuda linux編譯器_linux下如何編譯CUDA+QT(qtcreator下)

具體操作&#xff0c;修改qt項目配置文件pro&#xff0c;在配置后面加入如下代碼&#xff0c;我們就實現了qtcuda的交叉編譯。# 讓你的項目可以看到后綴cu的cuda代碼文件OTHER_FILES ./Bll/ImageReconstruction/Cuda/CudaFDK.cu \./Bll/ImageReconstruction/Cuda/CudaFDK_ker…

linux的sonar安裝,Linux安裝sonar

前置依賴? mysql 5.6 or 5.7? jdk 1.81.下載2.安裝unzip并解壓sonarqube并移動到/usr/localyum install unzipunzip sonarqube-6.7.4.zipmv sonarqube-6.7.4 /usr/local/3.mysql里新增數據庫CREATE DATABASE sonar DEFAULT CHARACTER SET utf8;4.修改sonarqube相應的配置vim …

redis內存淘汰和持久化_redis 持久化

一、RDB持久化&#xff08;一&#xff09;、RDB介紹可以在指定的時間間隔內生成數據集的 時間點快照&#xff08;point-in-time snapshot&#xff09;&#xff0c;新快照會覆蓋老快照&#xff08;二&#xff09;、優點壓縮格式&#xff0c;恢復速度快&#xff0c;適合于用做備份…

android實現后臺靜默安裝,Android 靜默安裝實現方法

Android靜默安裝的方法&#xff0c;靜默安裝就是繞過安裝程序時的提示窗口&#xff0c;直接在后臺安裝。注意&#xff1a;靜默安裝的前提是設備有ROOT權限。代碼如下&#xff1a;/*** 靜默安裝* param file* return*/public boolean slientInstall(File file) {boolean result …

pythonwrite連續寫入_python文件寫入write()的操作

本文實例為大家分享了python文件寫入write()的操作的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下filename pragramming.txtwith open(filename,w) as fileobject: #使用‘w來提醒python用寫入的方式打開fileobject.write(i love your name!\ni love your cloth!\…

最新變態傳奇android,新開變態傳奇單職業

新開變態傳奇單職業這款傳奇手游中擁有這極為豐富的游戲玩法&#xff0c;玩家既可以進入各種副本中&#xff0c;挑戰那些強大的副本boss&#xff0c;也可以和自己的兄弟好友們一起組隊&#xff0c;前往各種跨服戰場&#xff0c;和全服的高手玩家們一起進行最激烈的戰斗。游戲中…

spark sql讀取hive底層_[大數據]spark sql讀寫Hive數據不一致

在大數據公司中&#xff0c;任何一家公司都不會只使用一個框架吧&#xff1f;&#xff01;skr&#xff0c;skr~~那我們今天就來聊一段 Hive 與 Spark的愛恨情仇就像在一些場景中&#xff0c;需要將外部的數據導入到Hive表中&#xff0c;然后再對這些數據進行額外的處理&#xf…

android手機微信收藏功能實現,Android模仿微信收藏文件的標簽處理功能

最近需要用到微信的標簽功能(如下圖所示)。該功能可以添加已有標簽&#xff0c;也可以自定義標簽。也可以刪除已編輯菜單。研究了一番。發現還是挺有意思的&#xff0c;模擬實現相關功能。該功能使用類似FlowLayout的功能。Flowlayout為一個開源軟件(https://github.com/ApmeM/…

strocli64 源碼_storcli 簡易使用介紹

MegaCli 是LSI公司官方提供的SCSI卡管理工具&#xff0c;由于LSI被收購變成了現在的Broadcom&#xff0c;所以現在想下載MegaCli&#xff0c;需要去Broadcom官網查找Legacy產品支持&#xff0c;搜索MegaRAID即可。關于MegaCli 的使用可以看我的另一篇博文&#xff0c;這里就不再…

android 電話號碼標記,強化電話標記功能 360手機衛士3.0安卓版體驗

作為“房產商”&#xff0c;上海仁恒置地集團營銷總監姚偉示通常每天也要接到20個左右房產或其他推銷電話。“現在已經形成了一個機械的對應方式&#xff0c;對于此類推銷電話&#xff0c;很多人包括我自己已經麻木了。”針對這種情況&#xff0c;360手機衛士發布了3.0.0正式版…