IO操作底层调用过程 | 用户态切换内核态原理 | 中断概念
IO操作底層調用過程|內核|中斷|
做后端的程序員都知道我們編寫的程序主要分方法程序和IO操作程序。
有什么不一樣呢?
方法程序就不多說了。IO程序有什么不同呢?IO操作指的是對硬件設備操作,比如鍵盤、鼠標、網卡、顯卡…
那又有什么區別呢?
那就得說說系統調用
先看下面簡單的一個圖,cpu主要從內存拉取數據執行,將返回結果返回給內存,是我們程序的執行過程(今天重點不是這)
系統程序kernel和 用戶程序 都是程序。
系統啟動之前兩者都是存在磁盤中、系統啟動啟動之后先調用內核程序操作系統相關程序比如:用戶登錄等,完成系統啟動。
此時內程序會執行在內核空間中,用戶程序執行時候是在用戶空間中
那么問題來了,為什么分內核和用戶空間呢?內核空間有什么用?
內核空間是用來給執行系統程序,操作系統硬件程序,并且給用戶程序提供操作設備的方法調用,比如調用系統的IO設備啥的。
但是!!!!!
系統程序執行的時候會開啟保護模式GDT** 。
用戶程序在用戶空間執行,他是訪問不了內核空間的數據的,只能訪問用戶空間數據(因為被保護了),而內核程序執行時可以調用整個內存空間的數據的(可以理解為特權,后面就知道為什么了)。
那為什么要這樣呢?
可以理解,內核程序是用來操作系統的程序,如果能被用戶程序訪問,那操作系統很容易就被惡意破壞了。
那么問題(老伙伴)它又來了,明明我們程序里面是可以操作IO的啊,怎么說不能呢?而且用戶程序都不能訪問內核空間咋調用內核程序操作IO呢?
這就是神奇的地方了!!!
在這之前得知道一個知識,相比大家都知道cpu切換,多線程的時候大家都知道cpu會在各個線程里面來回切換,保證線程都能被執行…
那是怎么做的呢?
CPU內部有一個硬件叫做晶振器,他是由直流電進,出來的時候,會產生震動(簡單這么理解),
每次震動的時候,會讓CPU產生時鐘中斷。
怎么理解中斷:CPU停止當前線程的執行,此時將執行信息保存在寄存器中,資源還給內存(保護現場)。
上面這個過程是CPU多線程切換的原理,不僅晶振器可以中斷cpu,io操作也可以中斷。。。。
在內核程序開始進入內存的時候,會有一個表IDT(中斷表) 來記錄中斷的號碼和對應的回調函數記錄當前執行的程序。而這個表是放在內核程序里面的。(重點)
現在回過頭來說說為什么用戶這邊能通過內核程序調用系統IO?
剛才說了不僅時鐘中斷可以中斷CPU,IO操作也會中斷CPU
比如:程序中執行System.out.print的時候最終會被編譯成 write()+ INT0x80 ,這個write方法就是內核程序讓顯卡打印的程序,INT0x80 是讓CPU中斷的指令。(!!!轉折點)
神奇的過程!!!!
用戶程序在執行 System.out.print 之后 等于 最終執行了 write()+ INT0x80 ,當執行到INT0x80的時候,啪 ! CPU被中斷了,這個時候CPU就要保存現場,然后把當前執行的程序也就是write() 作為參數放到回調函數里面放到IDT表,保存起來。(記住IDT表是放在內核程序里面的),下一次CPU需要繼續執行這個方法時,怎么著?它得沖IDT去調用 回調函數啊,正好執行了write(
)方法(完成了IO操作)。
以上就是IO操作的一個用戶態(用戶程序執行時,用戶空間的狀態)切換成內核態(用戶程序執行時,內核空間的狀態)的過程。
總結:
總結
以上是生活随笔為你收集整理的IO操作底层调用过程 | 用户态切换内核态原理 | 中断概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat配置参数优化
- 下一篇: 单机版音乐播放器--ZTPlayer