摘要:CPU也是,當它不執行程序的時候,是沒有什麼狀態的,當它執行的程序是用戶程序的時候就叫用戶態,當執行的程序是操作系統的代碼時就叫系統態或者內核態。系統調用與中斷在處理機制上非常類似,但有所不同,中斷是程序在執行的過程中,隨時被打斷,正在執行的進程可能在用戶態也可能在內核態,但系統調用不同,只有用戶態程序才能調用系統調用,比如dos中的int 21H(參看Hello world視頻),Unix/Linux中的read()函數,調用了系統調用後,執行權就從用戶態切換到內核態。

帶着問題上路(課前預習寶典)

陳老師寫在前面:

疫情所致,本學期的本科網絡教學,讓我與學生全然地進入一個嶄新的世界,新意味着幾乎徹底拋棄固有的思維模式,開學前一週就與課程組同事全身心投入其中,在每一個模式的迭代中,都有新的發現,一週以來,學生提交的作品讓老師驚喜連連。

雲那端一個個鮮活的生命被激活,他們不再是被動的接受,而是以自己的節奏帶着老師不斷的改進和創新。在下週第三次上課之前,忽然就有了寫一個導讀的願望,結果一下手一發不可收拾,幾乎不用思考,這些文字自然流出,似乎與學生有心的對接。

01

什麼是操作系統的

運行環境和運行機制?

什麼是環境,想想你的宿舍環境吧,舍友如果是打遊戲的豬友,你要好好學習會被鄙視的。 那OS的環境是什麼? 簡單的說就是硬件吧,可是硬件的說法太籠統,更具體的說就是CPU,內存,硬盤等,有這些就能運行起來? 舍友沒有網和電腦能玩起遊戲? CPU要運行程序是否是要一組寄存器配合它(存儲思想),否則它要每個字節都從內存讀取那還不把它累死,有哪些寄存器呢?去看CPU的運行現場有哪些寄存器吧。

且慢,那要敲鍵盤咋辦? CPU要傻傻的等嗎?NO,你在敲鍵盤時CPU早都去玩股票去了,爲啥可以這樣,因爲當你把字符敲完後可以向CPU發出一個請求信號,CPU就可以不玩股票來處理你的請求,這就是中斷機制。

如果我想要從磁盤讀取數據,或者想讓一個進程生個兒子等這些髒活累活該怎麼辦,總不能讓我們每個用戶都辛辛苦苦的與硬件打交道吧,且慢,這些活操作系統都扛起來了,你只需要簡單的調用一下函數就可以,比如read()讀數據,fork()生孩子,這就是系統調用。

02

什麼是處理器(CPU)的狀態?

其實,CPU本來是沒有什麼狀態的,就像你不幹事的時候既沒有興奮的狀態,也沒有厭煩的狀態,可是當老師給你佈置了任務,你可能就煩了。CPU也是,當它不執行程序的時候,是沒有什麼狀態的,當它執行的程序是用戶程序的時候就叫用戶態,當執行的程序是操作系統的代碼時就叫系統態或者內核態。

03

什麼是特權指令和非特權指令?

一聽特權我們一般都很反感,其實計算機中也有特權,誰有?那就是操作系統。也就是有一部分指令只有操作系統能使用,用戶不能使用,這就叫特權指令。而有一部分指令用戶態和操作系統都能使用,這就是非特權指令。(參看1.5節)

04

什麼是CPU運行現場,

CPU的狀態放在哪裏?

CPU運行現場到底是什麼?你聯想一下車禍現場。CPU運行現場簡單說就是一組寄存器的集合,因爲CPU在運行過程中無非是一組寄存器與它配合,也即是存放指令和地址的一組寄存器,專業的說就是CPU運行現場指在程序的執行過程中任一時刻狀態信息的集合。那麼CPU的狀態又是什麼呢,存放在哪?就存放在程序狀態寄存器(PSW)中。

05

中斷到底什麼時候發生?

CPU執行指令的過程是取指執行,在每條指令執行前,都要進行檢查(圖中黃色圈),看是否有中斷髮生,怎麼檢查,就是在每條指令的最後時刻都掃描中斷寄存器(圖中紅色圈),很簡單是不是,如果有中斷信號(CPU其實很傻,只認信號),中斷硬件機制就把程序狀態寄存器(PSW)的相應位置1,每個外設的中斷都對應一箇中斷類型碼(或叫中斷號),如圖所示:

如果真有中斷髮生,CPU就轉去執行中斷處理程序,若無,就繼續執行指令,這個過程循環往復。(參看1.5節,並查看相關資料)

問題:中斷處理和子程序調用都需要壓棧以保護現場,中斷處理一定會保存而子程序調用不需要保存其內容的是(    )

A、程序計數器

B、程序狀態字寄存器

C、通用數據寄存器

D、通用地址寄存器

答:壓棧保護現場這件事就像出了車禍要保存現場一樣,中斷處理程序與一般程序有什麼相同呢,都是CPU本來好好的執行指令,然後有事情來打擾CPU,就需要把CPU的現場保存下來,以便回來的時候知道當時離開的時候做什麼。

程序計數器(PC)存放程序第一條指令的執行地址,不管是中斷還是子程序調用都需要保存,而通用數據寄存器和通用地址寄存器是壓棧時都需要保存的,只有程序狀態字寄存器(PSW)纔是中斷處理需要保存的內容。(參看1.5節)

06

中斷模型是一種C/S結構嗎?

C/S模型的本質就是請求/服務模型,我們看中斷模型,中斷控制器相當於中介,把外設與CPU鏈接在一起,只要外設發出中斷請求,CPU就要去響應,也即是去服務,所謂服務,就是執行中斷處理程序,是不是一種C/S模型?(參看中斷概述)

07

爲什麼要引入中斷?

當你通過鍵盤敲了個字符,儘管你以爲敲的飛速,但在CPU看來,你慢如蝸牛,我CPU總不能死等你鍵盤吧,CPU在你敲鍵盤時,趁機運行微信了,這樣看來,似乎CPU與鍵盤並行操作,而實際上,只是當你把字符敲完後,趕緊向CPU發了箇中斷請求,CPU纔來處理你的請求,看見了吧,中斷的引入使得外設可以與CPU看起來並行工作,效率,又是效率,這不是操作系統始終追求的目標麼!(參看中斷概述)

08

系統調用

系統調用的實現從用戶態切換到內核態,執行完系統調用程序後又從內核態切換回用戶態,對系統調用進行優化是因爲這種來回切換的代價很大嗎?(參看1.5節)

系統調用與中斷在處理機制上非常類似,但有所不同,中斷是程序在執行的過程中,隨時被打斷,正在執行的進程可能在用戶態也可能在內核態,但系統調用不同,只有用戶態程序才能調用系統調用,比如dos中的int 21H(參看Hello world視頻),Unix/Linux中的read()函數,調用了系統調用後,執行權就從用戶態切換到內核態。

切換到底有什麼代價,想想美國總統換屆就知道了,不管是中斷、異常和系統調用、切換都需要保留現場,返回後要恢復現場,能否對陷入內核,從內核返回的速度稍微提升一點,因爲一個程序執行會調用很多系統調用,這一點可以通過Linux下的trace命令追蹤,比如,trace ls(追蹤ls命令), 可以看到調用了多少系統調用,因此說, 底層稍微一點的優化,對整個系統性能的影響會非常巨大。  

問題:從哪個角度會使用到操作系統的系統調用( )

A、使用者

B、普通開發者

C、操作系統設計者

D、鏈接程序設計者

從這個圖可以看出,一般使用者通過圖形接口和命令終端使用計算機,開發者通過程序接口使用操作系統提供的系統調用,而鏈接程序設計者是設計鏈接程序把編譯後的二進制代碼鏈接起來,操作系統設計者是對操作系統的進程管理,內存管理,設備管理,文件管理進行設計,並給用戶提供系統調用接口。(參看1.2節)

問題:系統調用是(    )。

A、一條機器指令

B、中斷子程序

C、用戶子程序

D、提供編程人員的接口

給大家看一下Linux中系統調用getpid()在內核中的實現:

long sys_getpid(void)

{

return current->pid;

}

眼見爲實,我們看到,獲得進程的pid在內核的實現就是一個函數,給用戶提供的接口爲getpid(),答案是什麼,大家可以自己判斷了。

09

CPU在執行過程中出錯了叫什麼?

CPU是老大,它會不會出錯,如果在程序執行的過程中它出錯了怎麼辦?我們必須假定任何事情都會出錯,而且CPU出錯的話事態比較嚴重,因此給起了個名字就叫異常。

問題:能不能在哪看看系統中到底發生了哪些中斷?

可以,

cd /proc

cat interrupts

這裏會列出很多信息,你可以自己瞭解這些信息到底代表了什麼。

10

爲什麼要學Linux內核?

爲這裏是全世界大牛的作品集合,有多少人蔘與?2萬左右的頂級大神,100多個國家,google,微軟,紅帽子,Intel,華爲等全球大廠都在這裏爭先恐後提交代碼(有排名),以排名先後彰顯自己的技術實力?應用在哪,看這張圖就知道,無處不在,嵌入式,可穿戴計算機,移動計算機,桌面,到計算機集羣和超級計算機。

11

Linux內核作爲一個宏內核,

能否方便的寫代碼併合併到內核中?

你問的問題就是Linus早都想到的,玩過積木吧,Linux內核可加載模塊就可以做到這點,通過內核模塊,你就可以進入內核態寫程序了,這可是從來沒有幹過的事,儘管你原來寫了很多程序,也都是在用戶態敲敲代碼。進入內核寫代碼,與大牛思維大碰撞,你不願意?

12

Linux內核模塊編程要注意哪些事項?

首先說權限吧,你有root權限才能把內核模塊插入到內核,其次,你在用戶態用的那些函數庫不能使用了,爲啥?因爲你現在打怪升級了,有特權了,不能再還想着原來那些碎碎念念的事,現在要與大牛爲伍了,先閱讀內核的編碼風格吧,不管能否出高質量的代碼,但代碼長的樣子一定要高大上,與國際接軌,最後,動手實踐吧,參看學堂在線《Linux內核分析與應用》1.5節動手實踐-寫一個Linux內核模塊,順便告訴你,你可以看看內核中的求最大數怎麼寫,就明白了什麼叫高大上了。

相關文章