歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> 對Linux內核的總結認識

對Linux內核的總結認識

日期:2017/2/28 16:32:42   编辑:Linux內核

第一次接觸Linux是高三那時,後來在大學裡捨友T總的影響便開始了對Linux的不斷追求與學習。讀萬卷書不如行萬裡路,以前在學校裡看了那麼多書還不如工作中在代碼中煅練,當然關鍵是找到個入門口點,我選擇驅動程序開始!下面總結和談下學習驅動後對其的理解與認識。

1.內核是怎樣實現其管理的職能?

以前在學校時一直不能理解內核是怎麼做管理?比如內核如何知道在什麼時候對各個進程做調度,又在什麼時候知道缺頁從而執行內存比如內核如何知道在什麼時候對各個進程做調度,又在什麼時候知道缺頁從而執行內存管理的代碼,內核為什麼在會需要它管理的時候被喚醒,進程在用戶態跑的好好的,又是誰喚醒內核轉入核心態去check一下?內核管理職能的實現一方面可以是通過中斷觸發,這些中斷包括系統調用,硬件中斷;另一方面有一些內核線程長期運行在內核態。因為系統調用往往觸發相應驅動程序代碼的執行,而驅動程序本身包含大量可以導致進程休眠的代碼,例如一個系統調用read把CPU從用戶態轉到核心態,經過虛擬文件系統VFS傳入到設備相關的驅動程序中file_operations的真正實現函數read,這個系統調用可能引發內核中很多管理模塊的執行,假如驅動中發現設備沒有可用的數據時對於阻塞型的調用,驅動程序會把與其相關聯的用戶執行線程掛起休眠,從而讓出了CPU實現了進程調度器的調度。另外,一般來說CPU定時器會周期性地喚醒內核讓其check一下,看一下有沒有東西需要它處理的(主要是引發了軟中斷的產生,進而可能執行一些軟中斷的任務,稍後解釋什麼是軟中斷)。這就是內核的“心跳”,一般PC上會把這個心跳值HZ(每秒定時器中斷次數)設置為100~1000,jiffies是開機累計心跳值。同樣,CPU外部的器件會產生大量的中斷,這樣使得內核也知道了它將要干什麼。最後,內核線程kernel thread在內核態周期性地執行,例如磁盤高速緩存的刷新,網絡連接的維護,頁面的換入換出等。

2.代碼執行空間及其可見度

以前看一本書操作系統的書搞得好頭痛,x86上又是什麼GDT,又是什麼LDT,MMU的存在搞得內存這塊非常的難懂。現在看來在區分用戶態和核心態的32位系統上,用戶進程所能看到的空間僅僅分配給它的4G虛擬地址空間,用戶進程要想通往內核的唯一途徑是內核事先定義的有限數目的“系統調用”。系統調用的實質是該進程把數據(包括中斷號,系統調用的參數)放進 CPU特定寄存器並向CPU發送一個異常。通往內核並不意味著用戶進程就能看到並且干預內核空間,它能且僅能通過系統調用給定的接口參數向內核申請服務,這樣內核會接手和代表用戶進程並借用該用戶進程的上下文繼續執行(英文context的翻譯,是指程序計數器、棧和一組寄存器等),CPU轉入核心態,內核代碼就執行該系統調用在內核中的“實現部分”以滿足用戶進程對數據操作的需要,就執行路線上說,此時的內核執行處於“該用戶進程上下文” 中,內核能夠看到該用戶進程的空間並且該執行路線是與用戶進程相關,內核訪問用戶空間的代碼隨體系結構不同而有不同的實現,而且需要經過地址轉換。待內核處理完系統調用返回後,則轉回用戶態,用戶態進程就在該系統調用返回繼續前行。在這種多任務的操作系統中,內核代碼存在著多條執行路線,所以內核代碼非常講究代碼可重入性設計。在內核中,中斷不與任何一個用戶進程相關,包括定時器中斷或者外圍硬件中斷和甚至“軟中斷”,即不是運行在任何一個進程的上下文中而是運行在中斷上下文擁有自己的程序計數器、棧和一組寄存器;常常硬件中斷的發生並且被響應必定意味著切換CPU上下文。中斷上下文不代表用戶進程,所以中斷執行例程不能訪問用戶空間的一切內容。

3.驅動程序是什麼?及其與內核的關系

驅動程序本身就是內核的一部分,從www.kernel.org下載回來的內核代碼,單從代碼量來說驅動程序超過占65%,當然因為內核配置和條件編譯的關系,並不是所有的驅動都會被選上。內核中除掉驅動程序以外的代碼是一個框架,該框架提供一個公有的屬性,不隨CPU體系架構和具體硬件型號而變化,也是一個高度抽象模塊集,更是內核的“基礎設施”,這個基礎設施向驅動程序提供一些接口和定義一些標准。驅動程序的設計要遵循內核給定給驅動程序的標准並使用內核和接口,這樣就把操作具體硬件相關的工作交給了驅動程序,抽象出更一般的模塊,提高了操作系統的可移植性,可擴展性,和標准化。就像做填空題那樣,驅動程序在內核給定的空格上填好這個固定的空以使整個表達式是正確的。嚴格來說驅動程序包括:CPU體系架構驅動,各種各樣的硬件設施驅動。一般的驅動開發者其實工作的重點是除CPU外的設備的適配。基於CPU體系架構的實現依賴於具體的平台如ARM,X86,SPARC,PPC,MIPS等,所以具體到平台的實現部分有些是用匯編語言寫的,這些匯編因不同的體系結構而不同(某種原因是C語言實現不了的操作,某些是基於采用匯編實現效率更高更安全)。比如在關中斷開斷的實現又或切換進程上下文等操作采用匯編。除CPU外的設備一般C語言就完成了,因為大多數是與操作寄存器和數據讀寫有關。這裡應該指明,現在的嵌入式芯片應該稱之為SOC(System On Chip)更適合,而本文的CPU指的是處理器內核比如ARM926EJ-S。設備驅動程序是跟設備操作相關的系統調用的內核實現版本。就是說對設備的操作(比如ioctl(fd,…))其在內核的實現是由驅動完成。所以驅動要做的事情就是實現file_operations結構的函數指針,安排中斷例程。當然驅動也有分層的,有些模塊純粹是一種軟件抽象。比如USB驅動分層。驅動程序是直接面對硬件,內核通過驅動與硬件交互。對內核的核心來說驅動屏蔽了硬件的實現細節。驅動對硬件的操作集中表現在對寄存器的訪問及數據讀寫。

Copyright © Linux教程網 All Rights Reserved