前言:作業系統(英文:OperatingSystem,簡寫:OS)是管理電腦硬體與軟體資源的系統軟體,同時也是電腦系統的核心與基石。作業系統須要處理如管理與設定顯存、決定係統資源供需的優先順序、控制輸入與輸出設備、操作網路與管理檔案系統等基本事務。作業系統也提供一個讓使用者與系統互動的操作介面。
#一,Linux核心預備工作
理解Linux核心最好預備的知識點:
懂C語言
懂一點作業系統的知識
熟悉少量相關演算法
懂電腦體系結構
Linux核心的特徵:
##Linux核心的任務:
1.從技術層面講,核心是硬體與軟體之間的一個中間層。作用是將應用層序的懇求傳遞給硬件,並充當底層驅動程序,對系統中的各類設備和組件進行輪詢。
2.從應用程式的層面講,應用程式與硬體沒有聯繫,只與核心有聯繫,核心是應用程式曉得的層次中的最底層。在實際工作中內核具象了相關細節。
3.核心是一個資源管理程式。負責將可用的共享資源(CPU時間、磁碟空間、網路聯接等)分配得到各個系統流程。
4.核心如同一個函式庫,提供了一組以系統為導向的指令。系統呼叫對於應用程式來說,如同呼叫普通函數一樣。
內核實作策略:
1.微內核。最基本的功能由中央內核(微內核)實現。所有其他的功能都委託給一些獨立進程,這種進程透過明確定義的通訊插口與中心核心通訊。
2.巨集核心。核心的所有程式碼,包括子系統(如顯存管理、檔案管理、裝置驅動程式)都打包到一個檔案中。核心中的每一個函數都可以存取到核心中所有其他部分。目前支援模組的動態裝卸(剪裁)。 Linux核心就是基於這個策略實現的。
什麼地方用到了核心機制?
1.進程(在cpu的虛擬顯存中分配位址空間,各個進程的位址空間完全獨立;同時執行的進程數最多不超過cpu數量)之間進行通信,必須使用特定的核心機制。
2.進程間切換(同時執行的進程數最多不超過cpu數量),也必須用到核心機制。
進程切換也必須像FreeRTOS任務切換一樣儲存狀態,並將進程放在閒置狀態/復原狀態。
3.進程的調度。確認那個進程運行多長的時間。
Linux進程:
1.採用層次結構,每位行程都依賴一個父進程。核心啟動init程式作為第一個行程。該進程負責進一步的系統初始化操作。 init進程是進程樹的根,所有的進程都直接或則間接起源於該進程。
2.透過pstree指令查詢。實際上得係統第一個進程是systemd,而不是init(這也是疑惑點)
3.系統中每一個行程都有一個惟一標示符(ID),使用者(或其他行程)可以使用ID來存取進程。
二,Linux核心原始碼的目錄結構
Linux核心原始碼包含三個主要部份:
1.核心核心程式碼,包括第3章所描述的各個子系統和子模組,以及其它的支撐子系統,例如電源管理、Linux初始化等
2.其它非核心程式碼,例如庫檔案(由於Linux核心是一個自包含的內核,即內核不依賴其它的任何軟體,自己就可以編譯通過)、韌體集合、KVM(虛擬機技術)等
3.編譯腳本、設定檔、說明文件、版權說明等輔助性文件
使用ls指令聽到的核心原始碼的頂層目錄結構,具體描述如下:
include/----核心頭文件,須要提供給外部模組(例如使用者空間程式碼)使用。 kernel/----Linux核心的核心程式碼,包含了3.2小節所描述的進程調度子系統,以及和進程調度相關的模組。 mm/----顯存管理子系統(3.3小節)。 fs/----VFS子系統(3.4小節)。 net/----不包含網路設備驅動的網路子系統(3.5小節)。 ipc/----IPC(進程間通訊)子系統。 arch//----體系結構相關的程式碼,譬如arm,x86等等。 arch//mach-----具體的machine/board相關的程式碼。 arch//include/asm----體系結構相關的頭檔。 arch//boot/dts----設備樹(DeviceTree)檔案。 init/----Linux系統啟動初始化相關的程式碼。 block/----提供塊設備的層次。 sound/----音訊相關的驅動及子系統,可視為「音頻子系統」。 drivers/----裝置驅動程式(在Linuxkernel3.10中,裝置驅動佔了49.4的程式碼量)。 lib/----實作必須在核心中使用的函式庫函數,如CRC、FIFO、list、MD5等。 crypto/-----加密、解密相關的函式庫函數。 security/----提供安全特性(SELinux)。 virt/----提供虛擬機器技術(KVM等)的支援。 usr/----用來產生initramfs的程式碼。 firmware/----保存用於驅動第三方設備的韌體。 samples/----一些範例程式碼。 tools/----一些常用工具,如效能分析、自我測驗等。 Kconfig,Kbuild,Makefile,scripts/----用於核心編譯的設定檔、腳本等。 COPYING----版權申明。 MAINTAINERS----維護者名單。 CREDITS----Linux主要的貢獻者名單。 REPORTING-BUGS----Bug上報的手冊。 Documentation,README----幫助、說明文件。
【文章福利】小編推薦自己的Linux核心技術交流群:【865977150】整理了一些個人認為比較好的學習書籍、視訊資料共享在群組文件上面,有須要的可以自行添加哦! ! !前100名進群發放,額外附贈價值699的核心資料包(含影片教學、電子書、實戰項目及程式碼)
##三,Linux核心體系結構評析簡述
#圖一Linux系統層次結構
最前面是使用者(或應用程式)空間。這是用戶應用程式執行的地方。使用者空間之下就是核心空間,Linux核心正是坐落這兒。 GNUCLibrary(glibc)也在這裡。它提供了聯接核心的系統呼叫插口,也提供了在用戶空間應用程式和核心之間進行轉換的機制。這點十分重要,由於核心和用戶空間的應用程式使用的是不同的保護位址空間。每位使用者空間的進程都使用自己的虛擬位址空間,而核心則佔用單獨的位址空間。
Linux核心可以進一步界定成3層。最前面是系統呼叫插口,它實作了一些基本的功能,像是read和write。系統呼叫插口之下是內核程式碼,可以更精確地定義為獨立於體系結構的內核程式碼。這種程式碼是Linux所支援的所有處理器體系結構所通用的。在這種程式碼之下是依賴體系結構的程式碼,構成了一般稱為BSP(BoardSupportPackage)的部分。這種程式碼用作給定體系結構的處理器和特定於平台的程式碼。
Linux核心實作了很多重要的體系結構屬性。在或高或低的層次上,內核被界定為多個子系統。 Linux也可以看作是一個整體,由於它會將所有那些基本服務整合到核心中。這與微核心的體系結構不同linux核心詳解,前者會提供一些基本的服務,例如通訊、I/O、記憶體和行程管理,更具體的服務都是插入微核心層中的。每種內核都有自己的優點,不過這兒並不對此進行討論。
隨著時間的流逝紅旗linux系統下載,Linux核心在顯存和CPU使用方面具有較高的效率,而且十分穩定。並且對於Linux來說,最有趣的是在這些大小和複雜性的前提下,仍然具有良好的可移植性。 Linux編譯後可在大量處理器和具有不同體系結構約束和需求的平台上運作。一個反例是Linux可以在一個具有顯存管理單元(MMU)的處理器上運行,也可以在這些不提供MMU的處理器上運行。
Linux核心的uClinux移植提供了對非MMU的支援。
#圖二Linux核心體系結構
Linux核心的主要元件有:系統呼叫插口、行程管理、記憶體管理、虛擬檔案系統、網路堆疊、裝置驅動程式、硬體構架的相關程式碼。
(1)系統呼叫插口
SCI層提供了個別機制執行從用戶空間到內核的函數呼叫。正如上面討論的一樣,這個插口依賴體系結構,甚至在相同的處理器家族內也是如此。 SCI其實是一個十分有用的函數呼叫多路復用和多路分解服務。在./linux/kernel中您可以找到SCI的實現,並在./linux/arch中找到依賴體系結構的部分。
(2)進程管理
進程管理的重點是進程的執行。在核心中,這種程序稱為線程,代表了單獨的處理器虛擬化(線程代碼、資料、堆疊和CPU寄存器)。在使用者空間,一般使用行程這個術語,不過Linux實作並沒有分辨這兩個概念(行程和執行緒)。核心透過SCI提供了一個應用程式編程插口(API)來創建一個新進程(fork、exec或PortableOperatingSystemInterface[POSIX]函數),停止進程(kill、exit),並在它們之間進行通訊和同步(signal或則POSIX機制)。
進程管理還包括處理活動進程之間共享CPU的需求。核心實作了一種新型的調度演算法,不管有多少個執行緒在競爭CPU,這些演算法都可以在固定時間內進行操作。這些演算法就稱為O(1)調度程序,這個名子就表示它調度多個執行緒所使用的時間和調度一個執行緒所使用的時間是相同的。 O(1)調度程序也可以支援多處理器(稱為對稱多處理器或SMP)。您可以在./linux/kernel中找到進程管理的原始程式碼,在./linux/arch中可以找到依賴體系結構的原始程式碼。
(3)顯存管理
核心所管理的另一個重要資源是顯存。為了提升效率,倘若由硬體管理虛擬顯存,顯存是根據所謂的顯存頁形式進行管理的(對於大部份體系結構來說都是4KB)。 Linux包含了管理可用顯存的方法,以及化學和虛擬映射所使用的硬體機制。不過顯存管理要管理的可不只4KB緩衝區。 Linux提供了對4KB緩衝區的具象,例如slab分配器。這些顯存管理模式使用4KB緩衝區為基數,之後從中分配結構,並追蹤顯存頁使用情況,例如什麼顯存頁是滿的,什麼頁面沒有完全使用,什麼頁為空。這樣就容許該模式依據系統須要來動態調整顯存使用。為了支援多個使用者使用顯存,有時會出現可用顯存被消耗光的情況。因為這個緣由linux內核,頁面可以移出顯存並放入c盤中。這個過程稱為交換,由於頁面會被從顯存交換到硬盤。顯示記憶體管理的原始程式碼可以在./linux/mm中找到。
(4)虛擬檔案系統
#虛擬檔案系統(VFS)是Linux核心中十分有用的一個面向,由於它為檔案系統提供了一個通用的插口具象。 VFS在SCI和核心所支援的檔案系統之間提供了一個交換層(請參考圖4)。
#圖3Linux檔案系統層次結構
在VFS裡面,是對例如open、close、read和write之類的函數的一個通用API具象。在VFS下邊是檔案系統具象,它定義了下層函數的實作方法。它們是給定檔案系統(超過50個)的插件。檔案系統的源代碼可以在./linux/fs中找到。檔案系統層之下是緩衝區緩存,它為檔案系統層提供了一個通用函數集(與特定檔案系統無關)。這個快取層透過將資料保留一段時間(或則隨後預先讀取資料便於在須要是就可用)優化了對化學設備的存取。緩衝區快取之下是設備驅動程序,它實現了特定化學設備的插口。
(5)網路堆疊
網路堆疊在設計上依循模擬合約本身的分層體系結構。回想一下,InternetProtocol(IP)是傳輸合約(一般稱為傳輸控制合約或TCP)下邊的核心網路層合約。 TCP裡面是socket層,它是透過SCI來呼叫的。 socket層是網路子系統的標準API,它為各類網路合約提供了一個使用者插口。從原始幀存取到IP合約資料單元(PDU),再到TCP和UserDatagramProtocol(UDP),socket層提供了一種標準化的方式來管理聯接,並在各個終點之間聯通資料。核心中網路原始碼可以在./linux/net中找到。
(6)裝置驅動程式
Linux核心中有大量程式碼都在裝置驅動程式中,它們就能運作特定的硬體裝置。 Linux原始碼樹提供了一個驅動程式子目錄,這個目錄又進一步界定為各類支援設備,例如Bluetooth、I2C、serial等。裝置驅動程式的程式碼可以在./linux/drivers中找到。
(7)依賴體系結構的程式碼
雖然Linux很大程度上獨立於所運作的體系結構,有些元素則必須考慮體系結構能夠正常運作並實現更高效率。 ./linux/arch子目錄定義了核心原始碼中依賴體系結構的部份,其中包含了各類別特定於體系結構的子目錄(共同組成了BSP)。對於一個典型的桌上型系統來說,使用的是x86目錄。每個體系結構子目錄都包含了很多其他子目錄,每個子目錄都專注於核心中的一個特定方面,例如引導、核心、記憶體管理等。這種依賴體系結構的程式碼可以在./linux/arch中找到。
假如Linux內核的可移植性和效率還不夠好,Linux還提供了其他一些特點,它們難以界定到裡面的分類中。作為一個生產作業系統和開源軟體linux核心詳解,Linux是測試新合約及其提高的良好平台。 Linux支援大量網路合約,包括典型的TCP/IP,以及高速網路的擴充(小於1GigabitEthernet[GbE]和10GbE)。 Linux也可以支援例如串流控制傳輸合約(SCTP)之類的合同,它提供了很多比TCP更中級的特點(是傳輸層合約的接替者)。
Linux還是動態內核,支援動態新增或刪掉軟體元件。被稱為動態可載入核心模組,它們可以在引導時按照須要(當前特定設備須要這個模組)或在任何時侯由使用者插入。
Linux最新的一個提高是可以用作其他作業系統的作業系統(稱為系統管理程式)。近來,對核心進行了更改,稱為基於核心的虛擬機器(KVM)。這個變更為用戶空間啟用了一個新的插口,它可以容許其他作業系統在啟用了KVM的核心之上運行。不僅執行Linux的其他實例之外,MicrosoftWindows也可以進行虛擬化。唯一的限制是底層處理器必須支援新的虛擬化指令。
四,Linux體系結構與內核結構區別
1.當被問到Linux體系結構(就是Linux系統是如何構成的)時,我們可以參考右圖如此回答:從大的方面講,Linux體系結構可以分為兩塊:
#2. Linux體系結構要分成使用者空間和核心空間的緣由:
1)現代CPU一般都實作了不同的工作模式,
以ARM為例:ARM實作了7種工作模式,不同模式下CPU可以執行的指令或則存取的暫存器不同:
以(2)X86为例:X86实现了4个不同级别的权限,Ring0—Ring3;Ring0下可以执行特权指令,可以访问IO设备;Ring3则有好多的限制
2)所以,Linux从CPU的角度出发,为了保护内核的安全,把系统分成了2部份;
3.用户空间和内核空间是程序执行的两种不同状态,我们可以通过“系统调用”和“硬件中断“来完成用户空间到内核空间的转移
4.Linux的内核结构(注意分辨LInux体系结构和Linux内核结构)
五,Linux驱动的platform机制
Linux的这些platformdriver机制和传统的device_driver机制相比,一个非常显著的优势在于platform机制将本身的资源注册进内核,由内核统一管理,在驱动程序中使用这种资源时通过platform_device提供的标准插口进行申请并使用。这样提升了驱动和资源管理的独立性,但是拥有较好的可移植性和安全性。下边是SPI驱动层次示意图,Linux中的SPI总线可理解为SPI控制器引出的总线:
和传统的驱动一样,platform机制也分为三个步骤:
1、总线注册阶段:
内核启动初始化时的main.c文件中的kernel_init()→do_basic_setup()→driver_init()→platform_bus_init()→bus_register(&platform_bus_type),注册了一条platform总线(虚拟总线,platform_bus)。
2、添加设备阶段:
设备注册的时侯Platform_device_register()→platform_device_add()→(pdev→dev.bus=&platform_bus_type)→device_add(),就这样把设备给挂到虚拟的总线上。
3、驱动注册阶段:
Platform_driver_register()→driver_register()→bus_add_driver()→driver_attach()→bus_for_each_dev(),对在每位挂在虚拟的platformbus的设备作__driver_attach()→driver_probe_device(),判定drv→bus→match()是否执行成功,此时通过表针执行platform_match→strncmp(pdev→name,drv→name,BUS_ID_SIZE),倘若相符就调用really_probe(实际就是执行相应设备的platform_driver→probe(platform_device)。)开始真正的侦测,假如probe成功,则绑定设备到该驱动。
从里面可以看出,platform机制最后还是调用了bus_register(),device_add(),driver_register()这三个关键的函数。
Platform_device结构体描述了一个platform结构的设备,在其中包含了通常设备的结构体structdevicedev;设备的资源结构体structresource*resource;还有设备的名子constchar*name。(注意,这个名子一定要和前面platform_driver.driveràname相同,缘由会在前面说明。)
该结构体中最重要的就是resource结构,这也是之所以引入platform机制的缘由。
名子要一致的缘由:
#裡面說的驅動在註冊的時侯會調用函數bus_for_each_dev(),對在每位掛在虛擬的platformbus的設備作__driver_attach()→driver_probe_device(),在此函數中會對dev和drv做初步的匹配,呼叫的是drv->bus->match所指向的函數。 platform_driver_register函數中drv->driver.bus=&platform_bus_type,所以drv->bus->match就為platform_bus_type→match,為platform_match函數。
是比較dev和drv的name,相同則會步入really_probe()函數,因而步入自己寫的probe函數做進一步的匹配。所以dev→name和driver→drv→name在初始化時一定要填一樣的。
不同類型的驅動,其match函數是不一樣的,這個platform的驅動,比較的是dev和drv的名子,還記得usb類別驅動裡的match嗎?它比較的是ProductID和VendorID。
個人總結Platform機制的益處:
1、提供platform_bus_type類型的匯流排,把這些不是總線型的soc設備都加到這條虛擬總線上。促使,總線——設備——驅動的模式可以普及。
2、提供platform_device和platform_driver類型的資料結構,將傳統的device和driver資料結構嵌入其中,但是加入resource成員,以易於和OpenFirmware這些動態傳遞設備資源的新型bootloader和kernel接軌。
六,Linux核心體系結構
由於Linux核心是單晶片的,所以它比其他類型的核心佔用空間最大,複雜度也最高。這是一個設計特點,在Linux初期造成了相當多的爭辯,但是依然帶有一些與單核心固有的相同的設計缺陷。
#為了解決這種缺陷,Linux核心開發人員所做的一件事就是讓核心模組可以在執行時間載入和卸載,這意味著您可以動態地新增或刪除核心的特性。這除了可以為核心添加硬體功能,還可以包括運行伺服器進程的模組,例如低階虛擬化,但也可以替換整個內核,而不須在個別情況下重啟電腦。
想像一下,假若您可以升級到Windows服務包,而不須要重新啟動…
#七,核心模組
假如Windows早已安裝了所有可用的驅動程序,而您只須要打開所需的驅動程序怎樣?這本質上就是內核模組為Linux所做的。核心模組,也稱為可載入核心模組(LKM),對於保持核心在不消耗所有可用顯存的情況下與所有硬體一起工作是必不可少的。
#模組一般會為基本核心添加設備、檔案系統和系統呼叫等功能。 lkm的檔案擴充名是.ko,一般儲存在/lib/modules目錄中。因為模組的特點,您可以透過在啟動時使用menuconfig命令將模組設為load或notload,或則透過編輯/boot/config文件,或則使用modprobe命令動態地加載和卸載模組,輕鬆訂製核心。
第三方和封閉原始碼模組在某些發行版中是可用的,例如Ubuntu,預設可能難以安裝,由於這種模組的原始碼是不可用的。該軟體的開發人員(即nVidia、ATI等)不提供原始程式碼,而是建立自己的模組並編譯所需的.ko檔案便於分發。其實這種模組像beer一樣是免費的,但它們不像speech那樣是免費的,因而不包括在一些發行版中,由於維護人員覺得它通過提供非免費軟體“污染”了內核。
核心並不神奇,但對於任何正常運行的電腦來說,它都是必不可少的。 Linux核心不同於OSX和Windows,由於它包含核心層級的驅動程序,並使許多東西「開箱即用」。希望您能對軟體和硬體怎麼協同工作以及啟動電腦所需的文件有更多的了解。
結語:興趣的力量是無窮的。興趣能帶來熱情,如果工作可以和興趣結合在一起,工作上去就會有熱情,這麼工作就不只是工作了,更是一種享受。
以上是Linux核心預備工作理解:懂C語言懂一點作業系統的詳細內容。更多資訊請關注PHP中文網其他相關文章!