內核以物理頁做爲內存的基本單位,內存管理單元(MMU)正式以頁做爲單位進行處理,內存管理單元硬件負責將虛擬地址轉爲物理地址。因此從虛擬內存的角度來看,頁就是最小的單位。node
多數32位體系結構的頁大小爲4KB,而64位體系結構則爲8KB。也就是說1G大小的內存會被劃分爲262144個頁來進行管理。linux內核使用page結構來描述物理頁,位於linux/mm_types.h中。這個結構體大小爲40B,對於頁大小爲8KB內存大小爲4GB的系統來講,要描述全部內存則須要524288個物理頁,總大小爲20MB。linux
內核會把頁劃分爲不一樣的區,將類似特性的頁分爲一組,有些頁位於內存特定的物理地址上,因此不能用於特定任務。因爲硬件的限制,內核須要對物理頁區分對待。好比某些硬件只能經過某些特定的內存地址來執行直接內存訪問。還有一些體系結構的內存物理尋址範圍比虛擬尋址範圍大,因而某些內存就不能永久地映射到內核空間上。算法
linux經過四種區來區份內存頁,後端
32位x86系統中,小於16MB的物理內存爲ZONE_DMA區,能用DMA操做。從16MB到896MB物理內存爲ZONE_NORMAL區,正常可尋址頁。高於896M的全部內存爲ZONE_HIGHEM區,動態映射頁。緩存
內核的棧不能像用戶空間那樣奢侈分配,內核棧大小是固定的,每一個進程都分配到一個固定大小的內核棧。每一個進程的內核棧大小與體系結構和編譯選項有關,一般每一個進程有2個頁大小的內核棧,因此32位和64位的內核棧大小分別爲8KB和16KB。此外,中斷棧不共享進程的內核棧,中斷棧專門爲進程提供用於中斷處理程序的棧。網絡
虛擬文件系統即VFS,屬於內核子系統,爲用戶空間提供文件和文件系統相關接口。全部文件系統都依賴VFS共存且協同工做,經過VFS可使用標準UINX系統調用完成文件操做。VFS讓用戶可以直接使用open、read、write等系統調用來實現不一樣物理介質的文件操做,它對不一樣文件系統進行抽象並提供統一的操做。數據結構
系統調用經過VFS接口提供給用戶空間使用,它實現了具體的文件系統細節。好比用戶空間調用write()函數,會間接調用sys_wirte()函數,而後調用具體的文件系統去與物理介質交互。機器學習
unix的文件系統提供了四種抽象概念:文件、目錄項、索引節點和安裝點。文件和文件相關信息進行分離,文件相關的信息保存在索引節點中,即inode。分佈式
VFS包括四個主要的對象類型:函數
可以隨機訪問固定大小數據的硬件設備稱爲塊設備,塊就是這裏固定大小的數據。常見塊設備有硬盤、軟盤、閃存等等。相對於塊設備,還有一類設備被稱爲字符設備。字符設備就是按照字符流的方式有序地訪問,好比串口、鍵盤等。數據的隨機訪問是區分它們的主要依據。內核沒有專門的子系統處理字符設備,但提供了專門的子系統來管理塊設備,由於塊設備的執行性能要求很高。
塊設備最小可尋址單元是扇區,是塊設備的基本單元,扇區大小爲2的整數倍,常見的是512字節。塊是最小邏輯可尋址單元,內核的全部操做都是按照塊來執行的,塊的大小不能超過頁大小。扇區也稱硬扇區或設備塊,塊也稱文件塊或I/O塊。
當一個塊被調入內存時會存儲在一個緩衝區中,每一個緩衝區與塊相對應。內核須要知道哪一個塊設備和對應哪一個緩衝區,因此須要一個描述符來描述,它使用buffer_head結構體來表示,即緩衝區頭。對於磁盤來講,它的做用就是來描述磁盤塊和物理內存緩衝區之間的映射關係。
塊設備會將掛起的I/O請求放到請求隊列中,該隊列由reques_queue結構體表示,是一個雙向鏈表。塊設備驅動程序會根據請求隊列的請求去操做塊設備。
磁盤尋址是最慢的操做之一,每次尋址都會耗費較多時間,因此須要儘可能提高尋址性能。爲了提高尋址性能,不能簡單地按請求順序去執行操做,而是會作一些合併和排序的預操做,以此來提高總體性能。內核中負責I/O請求的子系統稱爲I/O調度程序。
IO調度主要經過合併和排序來減小尋址時間,合併就是將兩個或兩個以上請求合併爲一個請求,好比扇區相鄰的請求就能夠合併,只需一次就能拿到屢次請求的數據。而排序就是讓整個請求隊列按照扇區增加的方向有序地排序,這樣就能保證磁盤頭以直線方向移動,從而縮短尋址時間。
內核除了管理自身內存外還要管理用戶空間的進程的內存,這個內存就是進程地址空間,即用戶空間看到的內存。linux採用虛擬內存技術,每一個用戶進程都以虛擬方式來共享內存,對某個進程它就像能訪問全部物理內存。
進程地址空間由進程可尋址的虛擬內存組成,內核容許進程使用虛擬內存中的地址。一個進程的地址空間能夠與另一個進程的地址空間相同,它們彼此不相干,便是線程。
進程只能訪問有效內存區域的內存地址,每一個內存區域具備相關權限,若是一個進程訪問不在有效範圍內的內存區域,則內核會將該進程終止。
內存區域包括如下對象:
內核經過mm_struct結構體來描述進程的地址空間,它包含了全部相關信息。
當程序訪問一個虛擬地址時須要將虛擬地址轉爲物理地址,而後CPU才能解析地址訪問請求。地址的轉換須要經過查頁表來完成,將虛擬地址分段,使每一個虛擬地址都做爲一個索引指向頁表,頁表則會指向下一級的頁表或最終的物理頁面。
linux使用三級頁表來完成地址轉換,利用多級頁表可以節約地址轉換須要佔用的存放空間。頂級頁表是頁全局目錄,二級頁表是中間頁目錄,最後一級頁表指向物理頁面。每一個進程都有本身的頁表,線程則會共享頁表。
頁高速緩存是linux內核實現的磁盤緩存,做用是減小磁盤的IO操做。主要是將磁盤數據緩存到物理內存中,從而讓對磁盤的訪問變爲對物理內存的訪問。這個主要的思想就是數據被一旦被訪問,那麼它極可能短時間會再次被訪問。
有些設備是虛擬的,僅僅提供訪問內核功能而已,稱爲僞設備。好比內核隨機數發生器、空設備、零設備、滿設備、內存設備。
專一於人工智能、讀書與感想、聊聊數學、計算機科學、分佈式、機器學習、深度學習、天然語言處理、算法與數據結構、Java深度、Tomcat內核等。