国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Linux從頭學:【中斷】那么重要,它的本質到底是什么?

系統 Linux
在軟件開發中,中斷是一個繞不開的重要話題,但是,不知道您是否遇到過這樣的困惑:這篇文章我們講解的就是在實模式下的中斷,這一點請大家先明白。

[[417671]]

在軟件開發中,中斷是一個繞不開的重要話題,但是,不知道您是否遇到過這樣的困惑:

很多書籍、文章在介紹中斷相關的知識點時,說的都挺有道理。

這篇文章對中斷的講解很正確,那篇文章在描述中斷的時候也挺對的,但是,這兩篇文章中,怎么有些內容是矛盾的啊?!

圖片

單獨看任何一篇文章感覺都有道理,看的越多,反而越迷糊?

好比在森林里迷路了,如果只有一個指南針,肯定能走出來。

但是,如果你有 2 個指南針,所指的方向卻是相反的,這個時候應該相信誰呢?!

我們仔細梳理了一下就會發現:每一篇文章都是在一定的語境、一定的上下文環境中來講解的,不同文章的矛盾之處,恰恰是它們所描述的那個上下文大環境不同。

上下文環境,就是描述當前正在執行的程序相關的靜態信息,比如:有哪些代碼段,棧空間在哪里,進程描述信息在什么位置,當前執行到哪一條指令等等。

如果我們沒有一個全局的視角,在同一個上下文環境中來對比不同的文章,就會讓自己的理解和認識越來越蒙圈。

因此,對于這種概念比較龐雜,無法用某種確定的邏輯來貫穿的知識點,在腦袋中一定要有一幅全局的地圖。

[[417673]]

只有對這個全局的地圖掌握了,在具體學習每一個局部的知識點時,才能知道自己所處的位置在哪里,才不至于走偏。

這篇文章,我們繼續去繁從簡,從 8086 這個最簡單的處理器入手,來聊一下關于中斷的一些知識。

有了這個儲備,理清了基本的脈絡之后,以后再去學習 Linux 系統中的中斷相關內容時,才會有原來如此的感覺!

中斷向量與中斷描述符

中斷向量這個詞很時髦,也很神秘!

按道理,不應該在第一部分就端上中斷向量這盤硬菜,應該從中斷源開始聊起。

但是,畢竟我們已經學習過那么多關于中斷的知識了,腦袋中肯定是對中斷已經有了一些的基本認知。

所以,在這里我們還是首先來明確一下中斷向量和中斷描述符這個問題。

在前面的文章中已經聊過關于實模式和保護模式的問題,在 【Linux 從頭學】這個系列中,我們一直以來描述的都是實模式下的事情。

本文是實模式下的最后一篇文章,下一篇文章將會進入保護模式。

那么,中斷向量就是工作在實模式下的,處理器通過中斷號和中斷向量,來定位到相應的中斷處理程序。

而中斷描述符呢,就是工作在保護模式下,處理器通過中斷號和中斷描述符,來定位到相應的中斷處理程序。

也就是說:中斷向量和中斷描述符,它倆的根本作用是一樣的。

只是它們存在于不同的大環境中,而且從描述上也能感覺到,保護模式下的中斷描述符會更復雜一些,功能也更強大一些。

它倆就像一對兄弟一樣,從外表上看是差不多,功能也是類似。但是透入到內部去看,就會發現有很多的不同之處。

[[417674]]

因此,這篇文章我們講解的就是在實模式下的中斷,這一點請大家先明白。

中斷的分類

在 x86 系統中,中斷的分類如下:

圖片

內部中斷

所謂的內部中斷,是在 CPU 內部產生并進行處理的。比如:

  1. CPU 遇到一條除以 0 的指令時,將產生 0 號中斷,并調用相應的中斷處理程序;
  2. CPU 遇到一條不存在的非法指令時,將產生 6 號中斷,并調用相應的中斷處理程序;

對于內部中斷,有時候也稱之為異常。

軟中斷也屬于內部中斷,是非常有用的,它是由 int 指令觸發的。比如 int3 這條指令,gdb 就是利用它來實現對應用程序的調試。

很久之前寫過這樣的一篇文章原來gdb的底層調試原理這么簡單,其中就描述了 gdb 是如何通過插入一個 int 指令,來替換被調試程序的指令碼,從而實現斷點調試功能的。

圖片

外部中斷

x86 CPU 上有 2 個中斷引腳:INT 和 INTR,分別對應:不可屏蔽中斷和可屏蔽中斷。

所謂不可屏蔽,就是說:中斷不可以被忽視,CPU 必須處理這個中斷。

如果不處理,程序就沒法繼續執行。

而對于可屏蔽中斷,CPU 可以忽略它不執行,因為這類中斷不會對系統的執行造成致命的影響。

對于外部的可屏蔽中斷,CPU 上只有一根 INTR 引腳,但是需要產生中斷信號的設備那么多,如何對眾多的中斷信號進行區分呢?

一般都是通過可編程中斷控制器(Programmable Interrupt Controller, PIC),在計算機中使用最多的就是 8259a 芯片。

雖然現代計算機都已經是 APIC(高級可編程中斷控制器) 了,但是由于 8259a 芯片是那么的經典,大部分描述外部中斷的文章都會用它來舉例。

每一片 8259a 可以提供 8 個中斷輸入引腳,兩片芯片級聯在一起,就可以提供 15 個中斷信號:

圖片
  1. 主片的輸出引腳 INT 連接到 CPU 的 INTR 引腳上;
  2. 從片的輸出引腳 INT 連接到主片的引腳 2 上;

這樣的話,兩片 8259a 芯片就可以向 CPU 提供 15 個中斷信號了,比如:鼠標、鍵盤、串口、硬盤等等外設。

1. 8259a 之所以稱作可編程,是因為它的內部有相關的寄存器。

2. 可以通過指定的端口號,對這些寄存器進行設置,讓 8 根 IRQ 中斷線上的信號,在送到 CPU 時,對應不同的中斷號。

另外,對于外部可屏蔽中斷,有 2 層的屏蔽機制:

  1. 在 8259 芯片中,有中斷屏蔽寄存器,可以對 IRQ0 ~ IRQ7 輸入引腳進行屏蔽;
  2. 在 CPU 內部,也有一個標志寄存器,可以對某一類中斷信號進行屏蔽;

中斷號

在 x86 處理器中,一共支持 256 個中斷,每一個中斷都分配了一個中斷號,從 0 到 255。

其中,0 ~ 31 號中斷向量被保留,用來處理異常和非屏蔽中斷(其中只有 2 號向量用于非屏蔽中斷,其余全部是異常)。

當 BIOS 或者操作系統提供了異常處理程序之后,當一個異常產生時,就會通過中斷向量表找到響應的異常處理程序,查找的過程馬上就會介紹到。

從中斷號 32 開始,全部分配給外部中斷。

比如:

1. 系統定時器中斷 IRQ0,分配的就是 32 號中斷;

2. Linux 的系統調用,分配的就是 128 號中斷;

我們來分別看一下內部中斷和外部中斷相關的中斷號:

圖片

對于通過 8259a 可編程中斷控制器接入的中斷信號分配如下圖所示:

圖片

剛才已經說過,8259a 是可編程的,假如我們通過配置寄存器,把 IRQ0 的中斷號設置為 32, 那么主片上 IRQ1 ~ IRQ7 所對應的中斷號依次加 1,從片上 IRQ8~IRQ15 對應的中斷號也是依次遞增。

所以,有時候我們可以在代碼中斷看到下面的宏定義:

圖片

中斷向量和中斷處理程序

當一個中斷發生的時候,CPU 獲取到該中斷對應的中斷號,下一步就是要確定調用哪一個函數來處理這個中斷,這個函數就稱作中斷服務程序(Interrupt Service Routine,ISR),有時候也稱作中斷處理程序、中斷處理函數,本質都一樣。

中斷向,就是通過中斷號去查找處理程序的重要的橋梁!

圖片

中斷向量的本質

在 8086 中,一個中斷向量,就是一個 段地址:中斷處理函數偏移量 這樣的一對數據,通過這個數據,就可以定位到內存中指定位置的那個中斷處理函數。

非常類似于高級編程語言中的函數指針,就是用來指向一個函數的開始地址。

8086 規定:256 個中斷向量,必須從內存的 0 地址處開始存放。

每一個中斷向量占用 4 個字節(2 個字節的段地址,2 個字節的偏移地址),256 個中斷一共占用了 1024 個字節的空間。

之前的文章中,已經介紹過相關的內存模型,如下圖所示:

圖片

如果把一個中斷向量看作函數指針,那么這個中斷向量表就相當于是函數指針數組。

舉例:

假設 2 號中斷被觸發了,CPU 就會到中斷向量表中查找 2 號中斷的中斷向量。

因為每一個中斷向量占據 4 個字節,那么 2 號中斷向量的開始地址就是 2 * 4 = 8,第 8 個字節。

然后在第 8 個字節開始,取 4 個字節的內容:0x1000:0x2000。

圖片

意思是:2 號中斷的處理函數,在段地址為 0x1000,偏移量為 0x2000 的位置處。

那么 CPU 就按照 8086 的物理地址計算方式,得到中斷處理函數的物理地址為 0x12000 (段地址左移 4 位 + 偏移地址),于是就跳轉到該函數地址處去執行。

1. 由于 Linux 系統是運行在保護模式,在這個模式下,當發生中斷時,是通過中斷描述符來查找中斷處理函數的。

2. 每一個中斷描述符,描述了一個中斷處理函數所在段的選擇子和偏移量,本質上也是用來查找一個中斷處理函數。

中斷處理程序的安裝

既然通過中斷向量,找到了中斷處理程序,那么這些中斷處理程序都是誰放在內存中的呢?

如果您看過一些比較底層的計算機書籍,就能看到一般都會舉例:如何手動的把一個普通函數設置為一個中斷處理函數。

操作步驟是:

  1. 在代碼中,寫一個普通函數;
  2. 把這個函數的指令碼,搬運到內存中的某一個位置;
  3. 把這個位置(段地址:偏移量),作為一個中斷向量,設置到中斷向量表中;

此時,如果發生了該中斷,你所提供的函數就作為中斷處理函數被執行了。

當然了,在一個計算機系統中,BIOS、操作系統和各種外設,會自動為我們提供很多基本的中斷處理函數的。

比如:BIOS 中就提供了軟中斷、內部中斷、硬件中斷等處理函數,這些函數是固化在 BIOS 的代碼中的(映射到 BIOS 所在的 ROM 芯片上),BIOS 只需要把這些處理函數的地址,寫入到中斷向量表中的相應位置即可。

在之前的文章中提到過,內存中的某些位置是映射到外設的 ROM,在這些外設的 ROM 中也存在一些外設自帶的程序。

BIOS 在啟動時,會掃描這些映射到外設的內存空間,通過某些關鍵字信息,如果發現外設有自帶的程序,就會去執行。

這些外設程序一般是進行一些自身的初始化,并填寫相關的中斷向量表,使它們指向外設自帶的中斷處理程序。

對于操作系統來說就更不用說了,它會重新安排自己需要的中斷處理函數,這部分內容我們以后再一起學習、討論!

[[417676]]

中斷現場的保護和恢復

當一個中斷發生的時候,肯定有一個正在執行的程序被打斷。

當中斷處理函數執行結束之后,這個被打斷的程序需要從剛才被打斷的地方繼續執行(暫時先不要考慮從中斷返回點,進行多任務切換的事情)。

而一個程序執行的上下文環境,就是處理器中的各種寄存器內容:代碼段寄存器 cs,指令指針寄存器 sp,標志寄存器 FLAGS。

但是,在中斷處理程序中,也需要使用這些寄存器。

處理器中的這些寄存器,就是每一個程序執行時上下文信息的存儲容器,當然也包括終端處理程序!

因此,在進入中斷處理程序之前,CPU 會自動的把這些寄存器 push 到棧中保存起來,然后再跳轉到中斷處理程序中去執行。

當中斷處理程序執行結束后,CPU 會從棧中彈出這些內容,恢復到相應的寄存器中,于是被打斷的程序就可以繼續執行了。

總結:中斷的本質

從功能的角度看,中斷有 2 個作用:

提供執行異步序列的機制;

給應用程序提供進入系統層的入口;

關于第 2 點,以后在介紹到 Linux 中的 int 0x80 中斷就非常清楚了,也就是通過中斷,讓應用層的程序有機會進入到系統代碼中去執行。

因為應用層與操作系統層的代碼,是工作在不同的安全級別。

為了系統的安全,Linux 操作系統提供了這樣的一個機制,讓低安全級別的應用程序,進入到高安全級別的操作系統代碼中去執行,畢竟所有的硬件等系統資源都是由操作系統來統一管理的。

我們再從中斷處理程序的安裝角度來看,中斷本質上就是增加了一層間接性:通過固定位置的中斷向量表,讓中斷處理函數的實際地址可以被動態的放在任意位置。

為什么這么做?

假如操作系統想為某一個中斷提供處理函數,那么這個處理函數的地址放在內存中的什么位置比較合適?

需要考慮 CPU, 內存大小和布局等多種因素,非常復雜!

而通過使用中斷向量表,就在一個固定位置處存放了很多個“指針”。

當中斷處理函數放在內存中某個任意位置之后,讓“指針”指向這個函數的地址就可以了,從而達到解耦的目的。

這樣的話,無論是發生硬件中斷,還是應用層代碼通過中斷門來調用操作系統提供的函數,只要觸發相應的中斷就可以了,簡化了 CPU 的設計。

End 

關于中斷的相關內容,還有很多需要學習,任重而道遠!

特別是在 Linux 系統中,中斷處理又分為上半部分、下半部分,而下半部分又可以根據不同的功能需求采取不同的機制來處理。

我仍然是持有之前的觀點:磨刀不誤砍柴工。

把學習周期拉長,一點一滴的積累,Haste Makes Waste!

本文轉載自微信公眾號「 IOT物聯網小鎮」

 

責任編輯:姜華 來源: IOT物聯網小鎮
相關推薦

2021-09-03 09:12:09

Linux中斷軟件

2014-10-10 13:46:33

Docker

2022-03-24 14:25:39

5G安全物聯網

2020-11-06 17:04:17

強化學習機器學習人工智能

2013-08-28 13:19:30

百度輕應用百度移動戰略Light App

2022-10-08 00:00:00

Spring數據庫項目

2020-03-05 10:28:19

MySQLMRR磁盤讀

2020-09-27 06:53:57

MavenCDNwrapper

2020-10-14 06:22:14

UWB技術感知

2010-11-01 01:25:36

Windows NT

2020-09-22 08:22:28

快充

2011-04-27 09:30:48

企業架構

2023-10-11 08:29:54

volatileJava原子性

2009-06-09 22:11:44

JavaScriptObject

2021-01-21 21:24:34

DevOps開發工具

2021-07-07 05:07:15

JDKIterator迭代器

2021-02-05 10:03:31

區塊鏈技術智能

2024-02-04 00:01:00

云原生技術容器

2023-07-12 15:32:49

人工智能AI

2021-09-01 23:29:37

Golang語言gRPC
點贊
收藏

51CTO技術棧公眾號

免费大片在线观看www| 久久久久久网址| 日韩女优中文字幕| 欧美变态网站| 国产免费亚洲高清| 最新不卡av在线| 欧美大片免费| 黄瓜视频免费观看在线观看www| 欧美久久久久中文字幕| 激情久久久久久| 2017亚洲天堂1024| 国产伦理久久久| 色噜噜狠狠成人中文综合| 国产精品久久久久久久久妇女| 如如影视在线观看经典| 国产精品吊钟奶在线| 欧美午夜美女看片| 免费视频一区二区三区在线观看| 在线毛片网站| 一区二区三区在线视频看| 国产一区二区三区在线观看网站 | caoliu在线| 亚洲free嫩bbb| 91精品国产入口在线| 国产精品性做久久久久久| 清纯唯美激情亚洲| 亚洲第一se情网站| 亚洲国产另类久久久精品极度| 一区二区欧美久久| 亚洲午夜久久久久中文字幕久| 在线播放不卡| 欧美日韩在线精品一区二区三区激情综合| 免费毛片网站在线观看| 国产成人91久久精品| 91精品欧美久久久久久动漫| 粉嫩aⅴ一区二区三区四区| 欧美激情极品| 麻豆av在线免费观看| 无罩大乳的熟妇正在播放| 成人中文字幕在线观看| 国产视频精品免费播放| 亚洲成人激情自拍| av不卡在线播放| 亚洲国产电影| 亚洲福利影视| 岛国大片在线观看| 国产精品白浆| 中文字幕亚洲综合久久筱田步美| 国产精品99久久久久久久女警 | 综合激情在线| 全球最大av网站久久| 91av久久| 在线观看入口黄最新永久免费国产| 欧美成人在线免费视频| 国产精品456露脸| 亚洲美女黄色| 夜夜爽av福利精品导航| 伊人成人在线| 激情欧美一区| 国产一区视频导航| 日本vs亚洲vs韩国一区三区二区| 在线日韩欧美| 国产精品亚洲综合色区韩国| 亚洲午夜91| 青青草国产精品97视觉盛宴| 久久xxxx精品视频| 日韩国产欧美一区二区三区| 日产欧产美韩系列久久99| 欧美裸体在线版观看完整版| 九九热爱视频精品视频| 吉吉日韩欧美| 国内精彩免费自拍视频在线观看网址 | 最近2019好看的中文字幕免费| 欧美xxxx老人做受| 日本一区二区三区四区在线视频| 国产一区二区女| 懂色av中文字幕一区二区三区| 国产精品一区二区你懂的| 91在线视频在线| 亚洲一区二区在线免费观看视频| 日韩一级黄色大片| 日韩欧美三级在线| 欧美一级黑人aaaaaaa做受| 精品国产乱码久久久久软件| 无码人妻丰满熟妇区毛片| 欧美zozo| 午夜视频在线观看网站| 久草影视在线| 免费av在线| 成人在线app| 久久久久久久久免费视频| 在线看视频你懂的| 1769在线观看| 男人天堂亚洲二区| 亚洲女人天堂| 韩日在线视频| 成全视频全集| 久草在线网址| 哥也色在线视频| 亚洲网站三级| 国产精品视频一区二区三区四区五区| www亚洲欧美| 午夜精品久久久久久久99水蜜桃| 国产精品国产三级在线观看| 婷婷福利视频导航| 亚洲一区二区在| 自拍偷拍视频在线| 97蝌蚪自拍自窝| 91av在线免费播放| 调教视频在线观看| 日韩精品分区| 在线观看精品| 国产一级成人av| 欧美日韩看看2015永久免费| 国产精品黄色| 在线亚洲自拍| 国产色视频在线播放| 日韩伦理片在线观看| 91精品大全| 国产精品久久久久久久久免费高清 | 亚洲精品久久久久久久久| 中文字幕精品在线视频| 欧美激情欧美激情在线五月| 7777奇米亚洲综合久久| 国产日韩欧美精品在线观看| 无套内精的网站| 欧美videosex性极品hd| 91精品在线免费视频| 99在线观看免费视频精品观看| 成人免费毛片a| 欧美日韩一区二区三区不卡 | eeuss国产一区二区三区| 欧美性猛交xxxx免费看漫画| 日韩中文娱乐网| 精品一区二区视频| 黄页网站视频在线观看| 韩国理伦片久久电影网| 国产精品尤物| 色视频一区二区| 97在线观看免费高清| 99久热在线精品视频| 影音先锋在线播放| 色135综合网| 亚洲精品视频在线观看免费| 日韩精品欧美国产精品忘忧草 | 日韩欧美中文字幕在线播放| 国产成人鲁鲁免费视频a| 国产精品无码av无码| 99蜜月精品久久91| 美腿丝袜亚洲色图| 日韩精品久久久久久久玫瑰园| 国产精品18久久久久久麻辣| 精品少妇一区二区三区在线| 欧美xxxx免费虐| 亚洲欧美日韩国产一区二区| 婷婷激情综合网| 国产精品久久久久久影视| 黄色av网址在线播放| 性欧美又大又长又硬| 国产视频中文字幕在线观看| 日韩精品一二三| 亚洲视频视频在线| 日韩视频在线免费看| 日本精品影院| 色综合天天综合网国产成人综合天 | 热这里只有精品| 一本大道香蕉久在线播放29| 韩国精品视频在线观看| 自拍偷拍亚洲| 亚洲人成7777| 国产福利精品视频| 高清色视频在线观看| 久久久久久久久国产一区| 亚洲美女在线国产| 国产中文一区二区| 国产美女福利在线观看| 久久久美女毛片| 欧美在线激情视频| 亚洲成人基地| 蜜臀91精品一区二区三区 | 蜜臀av亚洲一区中文字幕| 中文字幕日韩综合av| 无码人妻丰满熟妇区五十路百度| 日韩成人一级| 色婷婷激情久久| 日本精品福利视频| 波多野结衣欧美| 欧美性猛交xxxx乱大交3| 黄色网址在线免费看| 91免费精品国偷自产在线在线| 亚洲国产aⅴ成人精品无吗| 91免费看片在线| 范冰冰一级做a爰片久久毛片| 亚洲欧美成人一区二区三区| 精品日韩欧美| www.国产精品| 欧美午夜精品久久久久久超碰 | 在线视频国产日韩| 午夜影院韩国伦理在线| 日本在线不卡视频一二三区|