日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > 21ic電子網
[導讀]前言 鍵盤可以說是我們最常使用的輸入硬件設備了,但身為程序員的你,你知道「鍵盤敲入 A 字母時,操作系統(tǒng)期間發(fā)生了什么嗎」? 那要想知道這個發(fā)生的過程,我們得先了解了解「操作系統(tǒng)是如何管理多種多樣的的輸入輸出設備」的,等了解完這個后,我們再來看

鍵盤敲入 A 字母時,操作系統(tǒng)期間發(fā)生了什么...

前言

鍵盤可以說是我們最常使用的輸入硬件設備了,但身為程序員的你,你知道「鍵盤敲入 A 字母時,操作系統(tǒng)期間發(fā)生了什么嗎」?

那要想知道這個發(fā)生的過程,我們得先了解了解「操作系統(tǒng)是如何管理多種多樣的的輸入輸出設備」的,等了解完這個后,我們再來看看這個問題,你就會發(fā)現問題已經被迎刃而解了。

鍵盤敲入 A 字母時,操作系統(tǒng)期間發(fā)生了什么...

正文

設備控制器

我們的電腦設備可以接非常多的輸入輸出設備,比如鍵盤、鼠標、顯示器、網卡、硬盤、打印機、音響等等,每個設備的用法和功能都不同,那操作系統(tǒng)是如何把這些輸入輸出設備統(tǒng)一管理的呢?

為了屏蔽設備之間的差異,每個設備都有一個叫設備控制器(Device Control 的組件,比如硬盤有硬盤控制器、顯示器有視頻控制器等。

因為這些控制器都很清楚的知道對應設備的用法和功能,所以 CPU 是通過設備控制器來和設備打交道的。

設備控制器里有芯片,它可執(zhí)行自己的邏輯,也有自己的寄存器,用來與 CPU 進行通信,比如:

  • 通過寫入這些寄存器,操作系統(tǒng)可以命令設備發(fā)送數據、接收數據、開啟或關閉,或者執(zhí)行某些其他操作。

  • 通過讀取這些寄存器,操作系統(tǒng)可以了解設備的狀態(tài),是否準備好接收一個新的命令等。

實際上,控制器是有三類寄存器,它們分別是狀態(tài)寄存器(Status Register、 命令寄存器(Command Register以及數據寄存器(Data Register,如下圖:

鍵盤敲入 A 字母時,操作系統(tǒng)期間發(fā)生了什么...

這三個寄存器的作用:

  • 數據寄存器,CPU 向 I/O 設備寫入需要傳輸的數據,比如要打印的內容是「Hello」,CPU 就要先發(fā)送一個 H 字符給到對應的 I/O 設備。

  • 命令寄存器,CPU 發(fā)送一個命令,告訴 I/O 設備,要進行輸入/輸出操作,于是就會交給 I/O 設備去工作,任務完成后,會把狀態(tài)寄存器里面的狀態(tài)標記為完成。

  • 狀態(tài)寄存器,目的是告訴 CPU ,現在已經在工作或工作已經完成,如果已經在工作狀態(tài),CPU 再發(fā)送數據或者命令過來,都是沒有用的,直到前面的工作已經完成,狀態(tài)寄存標記成已完成,CPU 才能發(fā)送下一個字符和命令。

CPU 通過讀、寫設備控制器中的寄存器來控制設備,這可比 CPU 直接控制輸入輸出設備,要方便和標準很多。

另外, 輸入輸出設備可分為兩大類 :塊設備(Block Device字符設備(Character Device

  • 塊設備,把數據存儲在固定大小的塊中,每個塊有自己的地址,硬盤、USB 是常見的塊設備。

  • 字符設備,以字符為單位發(fā)送或接收一個字符流,字符設備是不可尋址的,也沒有任何尋道操作,鼠標是常見的字符設備。

塊設備通常傳輸的數據量會非常大,于是控制器設立了一個可讀寫的數據緩沖區(qū)。

  • CPU 寫入數據到控制器的緩沖區(qū)時,當緩沖區(qū)的數據囤夠了一部分,才會發(fā)給設備。

  • CPU 從控制器的緩沖區(qū)讀取數據時,也需要緩沖區(qū)囤夠了一部分,才拷貝到內存。

這樣做是為了,減少對設備的操作次數。

那 CPU 是如何與設備的控制寄存器和數據緩沖區(qū)進行通信的?存在兩個方法:

  • 端口 I/O,每個控制寄存器被分配一個 I/O 端口,可以通過特殊的匯編指令操作這些寄存器,比如 in/out類似的指令。

  • 內存映射 I/O,將所有控制寄存器映射到內存空間中,這樣就可以像讀寫內存一樣讀寫數據緩沖區(qū)。


I/O 控制方式

在前面我知道,每種設備都有一個設備控制器,控制器相當于一個小 CPU,它可以自己處理一些事情,但有個問題是,當 CPU 給設備發(fā)送了一個指令,讓設備控制器去讀設備的數據,它讀完的時候,要怎么通知 CPU 呢?

控制器的寄存器一般會有狀態(tài)標記位,用來標識輸入或輸出操作是否完成。于是,我們想到第一種輪詢等待的方法,讓 CPU 一直查寄存器的狀態(tài),直到狀態(tài)標記為完成,很明顯,這種方式非常的傻瓜,它會占用 CPU 的全部時間。

那我們就想到第二種方法 —— 中斷,通知操作系統(tǒng)數據已經準備好了。我們一般會有一個硬件的中斷控制器,當設備完成任務后觸發(fā)中斷到中斷控制器,中斷控制器就通知 CPU,一個中斷產生了,CPU 需要停下當前手里的事情來處理中斷。

另外,中斷有兩種,一種軟中斷,例如代碼調用 INT指令觸發(fā),一種是硬件中斷,就是硬件通過中斷控制器觸發(fā)的。

但中斷的方式對于頻繁讀寫數據的磁盤,并不友好,這樣 CPU 容易經常被打斷,會占用 CPU 大量的時間。對于這一類設備的問題的解決方法是使用 DMA(Direct Memory Access 功能,它可以使得設備在 CPU 不參與的情況下,能夠自行完成把設備 I/O 數據放入到內存。那要實現 DMA 功能要有 「DMA 控制器」硬件的支持。

鍵盤敲入 A 字母時,操作系統(tǒng)期間發(fā)生了什么...

DMA 的工作方式如下:

  • CPU 需對 DMA 控制器下發(fā)指令,告訴它想讀取多少數據,讀完的數據放在內存的某個地方就可以了;

  • 接下來,DMA 控制器會向磁盤控制器發(fā)出指令,通知它從磁盤讀數據到其內部的緩沖區(qū)中,接著磁盤控制器將緩沖區(qū)的數據傳輸到內存;

  • 當磁盤控制器把數據傳輸到內存的操作完成后,磁盤控制器在總線上發(fā)出一個確認成功的信號到 DMA 控制器;

  • DMA 控制器收到信號后,DMA 控制器發(fā)中斷通知 CPU 指令完成,CPU 就可以直接用內存里面現成的數據了;

可以看到, CPU 當要讀取磁盤數據的時候,只需給 DMA 控制器發(fā)送指令,然后返回去做其他事情,當磁盤數據拷貝到內存后,DMA 控制機器通過中斷的方式,告訴 CPU 數據已經準備好了,可以從內存讀數據了。僅僅在傳送開始和結束時需要 CPU 干預。


設備驅動程序

雖然設備控制器屏蔽了設備的眾多細節(jié),但每種設備的控制器的寄存器、緩沖區(qū)等使用模式都是不同的,所以為了屏蔽「設備控制器」的差異,引入了設備驅動程序。

設備控制器不屬于操作系統(tǒng)范疇,它是屬于硬件,而設備驅動程序屬于操作系統(tǒng)的一部分,操作系統(tǒng)的內核代碼可以像本地調用代碼一樣使用設備驅動程序的接口,而設備驅動程序是面向設備控制器的代碼,它發(fā)出操控設備控制器的指令后,才可以操作設備控制器。

不同的設備控制器雖然功能不同,但是設備驅動程序會提供統(tǒng)一的接口給操作系統(tǒng),這樣不同的設備驅動程序,就可以以相同的方式接入操作系統(tǒng)。如下圖:

鍵盤敲入 A 字母時,操作系統(tǒng)期間發(fā)生了什么...

前面提到了不少關于中斷的事情,設備完成了事情,則會發(fā)送中斷來通知操作系統(tǒng)。那操作系統(tǒng)就需要有一個地方來處理這個中斷,這個地方也就是在設備驅動程序里,它會及時響應控制器發(fā)來的中斷請求,并根據這個中斷的類型調用響應的中斷處理程序進行處理。

通常,設備驅動程序初始化的時候,要先注冊一個該設備的中斷處理函數。

鍵盤敲入 A 字母時,操作系統(tǒng)期間發(fā)生了什么...

我們來看看,中斷處理程序的處理流程:

  1. 在 I/O 時,設備控制器如果已經準備好數據,則會通過中斷控制器向 CPU 發(fā)送中斷請求;

  2. 保護被中斷進程的 CPU 上下文;

  3. 轉入相應的設備中斷處理函數;

  4. 進行中斷處理;

  5. 恢復被中斷進程的上下文;


通用塊層

對于塊設備,為了減少不同塊設備的差異帶來的影響,Linux 通過一個統(tǒng)一的通用塊層,來管理不同的塊設備。

通用塊層是處于文件系統(tǒng)和磁盤驅動中間的一個塊設備抽象層,它主要有兩個功能:

  • 第一個功能,向上為文件系統(tǒng)和應用程序,提供訪問塊設備的標準接口,向下把各種不同的磁盤設備抽象為統(tǒng)一的塊設備,并在內核層面,提供一個框架來管理這些設備的驅動程序;

  • 第二功能,通用層還會給文件系統(tǒng)和應用程序發(fā)來的 I/O 請求排隊,接著會對隊列重新排序、請求合并等方式,也就是 I/O 調度,主要目的是為了提高磁盤讀寫的效率。

Linux 內存支持 5 種 I/O 調度算法,分別是:

  • 沒有調度算法

  • 先入先出調度算法

  • 完全公平調度算法

  • 優(yōu)先級調度

  • 最終期限調度算法

第一種,沒有調度算法,是的,你沒聽錯,它不對文件系統(tǒng)和應用程序的 I/O 做任何處理,這種算法常用在虛擬機 I/O 中,此時磁盤 I/O 調度算法交由物理機系統(tǒng)負責。

第二種,先入先出調度算法,這是最簡單的 I/O 調度算法,先進入 I/O 調度隊列的 I/O 請求先發(fā)生。

第三種,完全公平調度算法,大部分系統(tǒng)都把這個算法作為默認的 I/O 調度器,它為每個進程維護了一個 I/O 調度隊列,并按照時間片來均勻分布每個進程的 I/O 請求。

第四種,優(yōu)先級調度算法,顧名思義,優(yōu)先級高的 I/O 請求先發(fā)生, 它適用于運行大量進程的系統(tǒng),像是桌面環(huán)境、多媒體應用等。

第五種,最終期限調度算法,分別為讀、寫請求創(chuàng)建了不同的 I/O 隊列,這樣可以提高機械磁盤的吞吐量,并確保達到最終期限的請求被優(yōu)先處理,適用于在 I/O 壓力比較大的場景,比如數據庫等。


存儲系統(tǒng) I/O 軟件分層

前面說到了不少東西,設備、設備控制器、驅動程序、通用塊層,現在再結合文件系統(tǒng)原理,我們來看看 Linux 存儲系統(tǒng)的 I/O 軟件分層。

可以把 Linux 存儲系統(tǒng)的 I/O 由上到下可以分為三個層次,分別是文件系統(tǒng)層、通用塊層、設備層。他們整個的層次關系如下圖:

鍵盤敲入 A 字母時,操作系統(tǒng)期間發(fā)生了什么...

這三個層次的作用是:

  • 文件系統(tǒng)層,包括虛擬文件系統(tǒng)和其他文件系統(tǒng)的具體實現,它向上為應用程序統(tǒng)一提供了標準的文件訪問接口,向下會通過通用塊層來存儲和管理磁盤數據。

  • 通用塊層,包括塊設備的 I/O 隊列和 I/O 調度器,它會對文件系統(tǒng)的 I/O 請求進行排隊,再通過 I/O 調度器,選擇一個 I/O 發(fā)給下一層的設備層。

  • 設備層,包括硬件設備、設備控制器和驅動程序,負責最終物理設備的 I/O 操作。

有了文件系統(tǒng)接口之后,不但可以通過文件系統(tǒng)的命令行操作設備,也可以通過應用程序,調用 read、write函數,就像讀寫文件一樣操作設備,所以說設備在 Linux 下,也只是一個特殊的文件。

但是,除了讀寫操作,還需要有檢查特定于設備的功能和屬性。于是,需要 ioctl接口,它表示輸入輸出控制接口,是用于配置和修改特定設備屬性的通用接口。

另外,存儲系統(tǒng)的 I/O 是整個系統(tǒng)最慢的一個環(huán)節(jié),所以 Linux 提供了不少緩存機制來提高 I/O 的效率。

  • 為了提高文件訪問的效率,會使用頁緩存、索引節(jié)點緩存、目錄項緩存等多種緩存機制,目的是為了減少對塊設備的直接調用。

  • 為了提高塊設備的訪問效率, 會使用緩沖區(qū),來緩存塊設備的數據。


鍵盤敲入字母時,期間發(fā)生了什么?

看完前面的內容,相信你對輸入輸出設備的管理有了一定的認識,那接下來就從操作系統(tǒng)的角度回答開頭的問題「鍵盤敲入字母時,操作系統(tǒng)期間發(fā)生了什么?」

CPU 里面的內存接口,直接和系統(tǒng)總線通信,然后系統(tǒng)總線再接入一個 I/O 橋接器,這個 I/O 橋接器,另一邊接入了內存總線,使得 CPU 和內存通信。再另一邊,又接入了一個 I/O 總線,用來連接 I/O 設備,比如鍵盤、顯示器等。

那當用戶輸入了鍵盤字符,鍵盤控制器就會產生掃描碼數據,并將其緩沖在鍵盤控制器的寄存器中,緊接著鍵盤控制器通過總線給 CPU 發(fā)送中斷請求。

CPU 收到中斷請求后,操作系統(tǒng)保存被中斷進程的 CPU 上下文,然后調用鍵盤的中斷處理程序。

鍵盤的中斷處理程序是在鍵盤驅動程序初始化時注冊的,那鍵盤中斷處理函數的功能就是從鍵盤控制器的寄存器的緩沖區(qū)讀取掃描碼,再根據掃描碼找到用戶在鍵盤輸入的字符,如果輸入的字符是顯示字符,那就會把掃描碼翻譯成對應顯示字符的  ASCII 碼,比如用戶在鍵盤輸入的是字母 A,是顯示字符,于是就會把掃描碼翻譯成 A 字符的 ASCII 碼。

得到了顯示字符的 ASCII 碼后,就會把 ASCII 碼放到「讀緩沖區(qū)隊列」,接下來就是要把顯示字符顯示屏幕了,顯示設備的驅動程序會定時從「讀緩沖區(qū)隊列」讀取數據放到「寫緩沖區(qū)隊列」,最后把「寫緩沖區(qū)隊列」的數據一個一個寫入到顯示設備的控制器的寄存器中的數據緩沖區(qū),最后將這些數據顯示在屏幕里。

顯示出結果后,恢復被中斷進程的上下文。


免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯系我們,謝謝!

21ic電子網

掃描二維碼,關注更多精彩內容

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉