Linux核心(linux kernel)

Linux核心

linux kernel一般指本詞條

Linux是一種開源電腦作業系統核心。它是一個用C語言寫成,符合POSIX標準的類Unix作業系統。

Linux最早是由芬蘭 Linus Torvalds為嘗試在英特爾x86架構上提供自由的類Unix作業系統而開發的。該計畫開始於1991年,在計畫的早期有一些Minix 黑客提供了協助,而今天全球無數程式設計師正在為該計畫無償提供幫助。

基本介紹

  • 軟體名稱:Linux核心
  • 軟體語言:C語言
  • 軟體授權:免費
  • 發明者:Linus Torvalds
  • 使用時間:1991年
核心結構,版本號,發展歷史,結構屬性,開發規範,主要子系統,系統調用接口,進程管理,記憶體管理,虛擬檔案系統,特性,可移植性,網路支持,動態核心,系統管理程式,組成,發行版,常量定義,初始定義,解壓縮符號,核心符號,構架宏,

核心結構

作業系統是一個用來和硬體打交道並為用戶程式提供一個有限服務集的低級支撐軟體。一個計算機系統是一個硬體和軟體的共生體,它們互相依賴,不可分割。計算機的硬體,含有外圍設備、處理器、記憶體、硬碟和其他的電子設備組成計算機的發動機。但是沒有軟體來操作和控制它,自身是不能工作的。完成這個控制工作的軟體就稱為作業系統,在Linux的術語中被稱為“核心”,也可以稱為“核心”。Linux核心的主要模組(或組件)分以下幾個部分:存儲管理、CPU和進程管理、檔案系統、設備管理和驅動、網路通信,以及系統的初始化(引導)、系統調用等。

版本號

Linux核心使用三種不同的版本編號方式。
第一種方式用於1.0版本之前(包括1.0)。第一個版本是0.01,緊接著是0.02、0.03、0.10、0.11、0.12、0.95、0.96、0.97、0.98、0.99和之後的1.0。
第二種方式用於1.0之後到2.6,數字由三部分“A.B.C”,A代表主版本號,B代表次主版本號,C代表較小的末版本號。只有在核心發生很大變化時(歷史上只發生過兩次,1994年的1.0,1996年的2.0),A才變化。可以通過數字B來判斷Linux是否穩定,偶數的B代表穩定版,奇數的B代表開發版。C代表一些bug修復,安全更新,新特性和驅動的次數。以版本2.4.0為例,2代表主版本號,4代表次版本號,0代表改動較小的末版本號。在版本號中,序號的第二位為偶數的版本表明這是一個可以使用的穩定版本,如2.2.5,而序號的第二位為奇數的版本一般有一些新的東西加入,是個不一定很穩定的測試版本,如2.3.1。這樣穩定版本來源於上一個測試版升級版本號,而一個穩定版本發展到完全成熟後就不再發展。
第三種方式從2004年2.6.0版本開始,使用一種“time-based”的方式。3.0版本之前,是一種“A.B.C.D”的格式。七年裡,前兩個數字A.B即“2.6”保持不變,C隨著新版本的發布而增加,D代表一些bug修復,安全更新,添加新特性和驅動的次數。3.0版本之後是“A.B.C”格式,B隨著新版本的發布而增加,C代表一些bug修復,安全更新,新特性和驅動的次數。第三種方式中不再使用偶數代表穩定版,奇數代表開發版這樣的命名方式。舉個例子:3.7.0代表的不是開發版,而是穩定版!

發展歷史

Linux最早是由芬蘭人Linus Torvalds設計的。當時由於UNⅨ的商業化,Andrew Tannebaum教授開發了Minix作業系統以便於不受AT&T許可協定的約束,為教學科研提供一個作業系統。當時發布在Internet上,免費給全世界的學生使用。Minix具有較多UNⅨ的特點,但與UNⅨ不完全兼容。1991年10月5日,Linus為了給Minix用戶設計一個比較有效的UNⅨ PC版本,自己動手寫了一個“類Minix”的作業系統。整個故事從兩個在終端上列印AAAA...和BBBB...的進程開始的,當時最初的核心版本是0.02。Linus Torvalds將它發到了Minix新聞組,很快就得到了反應。Linus Torvalds在這種簡單的任務切換機制上進行擴展,並在很多熱心支持者的幫助下開發和推出了Linux的第一個穩定的工作版本。1991年11月,Linux0.10版本推出,0.11版本隨後在1991年12月推出,當時將它發布在Internet上,免費供人們使用。當Linux非常接近於一種可靠的/穩定的系統時,Linus決定將0.13版本稱為0.95版本。1994年3月,正式的Linux 1.0齣現了,這差不多是一種正式的獨立宣言。截至那時為止,它的用戶基數已經發展得很大,而且Linux的核心開發隊伍也建立起來了。
主要 Linux 核心發行版簡史主要 Linux 核心發行版簡史

結構屬性

在討論大型而複雜的系統的體系結構時,可以從很多角度來審視系統。體系結構分析的一個目標是提供一種方法更好地理解原始碼
Linux 核心實現了很多重要的體系結構屬性。在或高或低的層次上,核心被劃分為多個子系統。Linux 也可以看作是一個整體,因為它會將所有這些基本服務都集成到核心中。這與微核心的體系結構不同,後者會提供一些基本的服務,例如通信、I/O、記憶體和進程管理,更具體的服務都是插入到微核心層中的。
隨著時間的流逝,Linux 核心在記憶體和 CPU 使用方面具有較高的效率,並且非常穩定。但是對於 Linux 來說,最為有趣的是在這種大小和複雜性的前提下,依然具有良好的可移植性。Linux 編譯後可在大量處理器和具有不同體系結構約束和需求的平台上運行。一個例子是 Linux 可以在一個具有記憶體管理單元(MMU)的處理器上運行,也可以在那些不提供MMU的處理器上運行。Linux 核心的uClinux移植提供了對非 MMU 的支持。

開發規範

核心的開發和規範一直是由Linux社區控制著,版本也是唯一的。實際上,作業系統的核心版本指的是在Linus本人領導下的開發小組開發出的系統核心的版本號。自1994年3月14日發布了第一個正式版本Linux 1.0以來,每隔一段時間就有新的版本或其修訂版公布。
Linux將標準的GNU許可協定改稱Copyleft,以便與Copyright相對照。通用的公共許可(GPL)允許用戶銷售、拷貝和改變具有Copyleft的應用程式。當然這些程式也可以是Copyright的,但是你必須允許進一步的銷售、拷貝和對其代碼進行改變,同時也必須使他人可以免費得到修改後的原始碼。事實證明,GPL對於Linux的成功起到了極大的作用。它啟動了一個十分繁榮的商用Linux階段,還為編程人員提供了一種凝聚力,誘使大家加入這個充滿了慈善精神的Linux運動。

主要子系統

系統調用接口

SCI 層提供了某些機制執行從用戶空間到核心的函式調用。正如前面討論的一樣,這個接口依賴於體系結構,甚至在相同的處理器家族內也是如此。SCI 實際上是一個非常有用的函式調用多路復用和多路分解服務。在 ./linux/kernel 中您可以找到 SCI 的實現,並在 ./linux/arch 中找到依賴於體系結構的部分。

進程管理

進程管理的重點是進程的執行。在核心中,這些進程稱為執行緒,代表了單獨的處理器虛擬化(執行緒代碼、數據、堆疊和 CPU暫存器)。在用戶空間,通常使用進程 這個術語,不過 Linux 實現並沒有區分這兩個概念(進程和執行緒)。核心通過 SCI 提供了一個應用程式編程接口API)來創建一個新進程(fork、exec 或 Portable Operating System Interface [POSⅨ] 函式),停止進程(kill、exit),並在它們之間進行通信和同步(signal 或者 POSⅨ 機制)。
進程管理還包括處理活動進程之間共享 CPU 的需求。核心實現了一種新型的調度算法,不管有多少個執行緒在競爭 CPU,這種算法都可以在固定時間內進行操作。這種算法就稱為 O⑴ 調度程式,這個名字就表示它調度多個執行緒所使用的時間和調度一個執行緒所使用的時間是相同的。O⑴ 調度程式也可以支持多處理器(稱為對稱多處理器或 SMP)。您可以在 ./linux/kernel 中找到進程管理原始碼,在 ./linux/arch 中可以找到依賴於體系結構的原始碼。

記憶體管理

核心所管理的另外一個重要資源是記憶體。為了提高效率,如果由硬管理虛擬記憶體,記憶體是按照所謂的記憶體頁 方式進行管理的(對於大部分體系結構來說都是 4KB)。Linux 包括了管理可用記憶體的方式,以及物理和虛擬映射所使用的硬體機制。
VFS 在用戶和檔案系統之間提供了一個交換層VFS 在用戶和檔案系統之間提供了一個交換層
不過記憶體管理要管理的可不止 4KB緩衝區。Linux 提供了對 4KB緩衝區的抽象,例如 slab 分配器。這種記憶體管理模式使用 4KB緩衝區為基數,然後從中分配結構,並跟蹤記憶體頁使用情況,比如哪些記憶體頁是滿的,哪些頁面沒有完全使用,哪些頁面為空。這樣就允許該模式根據系統需要來動態調整記憶體使用。
為了支持多個用戶使用記憶體,有時會出現可用記憶體被消耗光的情況。由於這個原因,頁面可以移出記憶體並放入磁碟中。這個過程稱為交換,因為頁面會被從記憶體交換到硬碟上。記憶體管理原始碼可以在 ./linux/mm 中找到。

虛擬檔案系統

虛擬檔案系統(VFS)是 Linux 核心中非常有用的一個方面,因為它為檔案系統提供了一個通用的接口抽象。VFS 在 SCI 和核心所支持的檔案系統之間提供了一個交換層。
VFS 在用戶和檔案系統之間提供了一個交換層
在 VFS 上面,是對諸如 open、close、read 和 write 之類的函式的一個通用 API 抽象。在 VFS 下面是檔案系統抽象,它定義了上層函式的實現方式。它們是給定檔案系統(超過 50 個)的外掛程式。檔案系統的原始碼可以在 ./linux/fs 中找到。
檔案系統層之下是緩衝區快取,它為檔案系統層提供了一個通用函式集(與具體檔案系統無關)。這個快取層通過將數據保留一段時間(或者隨即預先讀取數據以便在需要是就可用)最佳化了對物理設備的訪問。緩衝區快取之下是設備驅動程式,它實現了特定物理設備的接口。

特性

可移植性

儘管Linus Torvalds的初衷不是使Linux成為一個可移植的作業系統,今天的Linux卻是全球被最廣泛移植的作業系統核心。從掌上電腦iPad到巨型電腦IBM S/390,甚至於微軟出品的遊戲機XBOX都可以看到Linux核心的蹤跡。Linux也是IBM超級計算機Blue Gene的作業系統。
Linux可以在以下結構上運行:
Acorn:Archimedes,A5000和RiscPC系列
康柏:Alpha
惠普:PA-RISC
IA64:英特爾Itanium個人電腦
IBM的S/390和AS/400
英特爾80386及之後的兼容產品:80386,80486和整個奔騰系列;AMD Athlon,Duron,Thunderbird; Cyrix系列。對英特爾8086,8088,80186,80188和80280晶片的支持正在開發中。
Mips
摩托羅拉68020及以上: 新的Amigas,一些蘋果電腦
PowerPC:所有較新的蘋果電腦
SPARC和UltraSPARC:太陽微系統的工作站
Hitachi SuperH: SEGA Dreamcast
索尼公司: PlayStation 2
ARM系列

網路支持

作為一個生產作業系統和開源軟體,Linux 是測試新協定及其增強的良好平台。Linux 支持大量網路協定,包括典型的 TCP/IP,以及高速網路的擴展(大於 1 Gigabit Ethernet [GbE] 和 10 GbE)。Linux 也可以支持諸如流控制傳輸協定(SCTP)之類的協定,它提供了很多比 TCP 更高級的特性(是傳輸層協定的接替者)。

動態核心

Linux 還是一個動態核心,支持動態添加或刪除軟體組件。被稱為動態可載入核心模組,它們可以在引導時根據需要(當前特定設備需要這個模組)或在任何時候由用戶插入。

系統管理程式

Linux 最新的一個增強是可以用作其他作業系統的作業系統(稱為系統管理程式)。該系統對核心進行了修改,稱為基於核心的虛擬機(KVM)。這個修改為用戶空間啟用了一個新的接口,它可以允許其他作業系統在啟用了 KVM 的核心之上運行。除了運行 Linux 的其他實例之外, Microsoft® Windows® 也可以進行虛擬化。惟一的限制是底層處理器必須支持新的虛擬化指令

組成

進程管理(process management)、 1
linux kernel版本升級linux kernel版本升級
定時器(timer)、 2
中斷管理(interrupt management)、 3
記憶體管理(memory management)、 4
模組管理(module management)、 5
虛擬檔案系統接口(VFS layer)、 6
檔案系統(file system)、 7
設備驅動程式(device driver)、 8
進程間通信(inter-process communication)、9
網路管理(network management)、 10
系統啟動(system init)等作業系統功能的實現。11

發行版

Linux核心的發展過程中,我們還不得不提一下各種Linux發行版的作用,因為正是它們推動了Linux的套用,從而也讓更多的人開始關注Linux。一些組織或廠家,將Linux系統的核心與外圍實用程式(Utilities)軟體和文檔包裝起來,並提供一些系統安裝界面和系統配置、設定與管理工具,就構成了一種發行版本(distribution),Linux的發行版本其實就是Linux核心再加上外圍的實用程式組成的一個大軟體包而已。相對於Linux作業系統核心版本,發行版本的版本號隨發布者的不同而不同,與Linux系統核心的版本號是相對獨立的。因此把SUSE、RedHat、Ubuntu、Slackware等直接說成是Linux是不確切的,它們是Linux的發行版本,更確切地說,應該叫做“以Linux為核心的作業系統軟體包”。根據GPL準則,這些發行版本雖然都源自一個核心,並且都有自己各自的貢獻,但都沒有自己的著作權。Linux的各個發行版本(distribution),都是使用Linus主導開發並發布的同一個Linux核心,因此在核心層不存在什麼兼容性問題。每個版本都不一樣的感覺,只是在發行版本的最外層才有所體現,而絕不是Linux本身特別是核心不統一或是不兼容。
Linux核心的編程教程Linux核心的編程教程
90年代初期Linux開始出現的時候,僅僅是以原始碼形式出現,用戶需要在其他作業系統下進行編譯才能使用。後來出現了一些正式版本。目前最流行的幾個正式版本有:SUSE、RedHat、Fedora、Debian、Ubuntu、CentOS、Gentoo,等等。用戶可根據自己的經驗和喜好選用合適的Linux發行版。
原先Linus Torvalds將Linux置於一個禁止任何商業行為的條例之下,但之後改用GNU通用公共許可證第二版。該協定允許任何人對軟體進行修改或發行,包括商業行為,只要其遵守該協定,所有基於Linux的軟體也必須以該協定的形式發表,並提供原始碼
Linus Torvalds曾經公開聲稱將Linux置於GNU通用公共許可證之下是他一生中所做的“最好的決定”。

常量定義

初始定義

宏phys定義了你的機器上的地址轉換__virt_to_phys()。這個宏用於把虛擬地址轉換為一個物理地址。通常情況下:
phys = virt - PAGE_OFFSET PHYS_OFFSET

解壓縮符號

解壓縮器的地址地址。由於當你調用解壓縮器代碼時,通常關閉MMU,因此這裡並不討論虛擬地址和物理地址的問題。通常你在這個地址處調用核心,開始引導核心。它不需要在RAM中,只需要位於FLASH或其他唯讀或讀/寫的可定址的存儲設備中。
l ZBSSADDR
解壓縮器的初始化為0的工作區的起始地址。必須位於RAM中,解壓縮器會替你把它初始化為0,此外,需要關閉MMU。
l ZRELADDR
解壓縮核心將被寫入的地址和最終的執行地址,必須滿足:
__virt_to_phys(TEXTADDR) == ZRELADDR
核心的開始部分被編碼為與位置無關的代碼。
l INITRD_PHYS
放置初始RAM盤的物理地址。僅當你使用bootpImage時相關(這是一種非常老的param_struct結構)
l INITRD_ⅥRT
初始RAM盤的虛擬地址。必須滿足:
__virt_to_phys(INITRD_ⅥRT) == INITRD_PHYS
l PARAMS_PHYS
param_struct 結構體或tag lis的物理地址,用於給定核心執行環境下的不同參數。

核心符號

RAM第一個BANK的物理地址地址。
l PAGE_OFFSET
RAM第一個BANK的虛擬地址地址。在核心引導階段,虛擬地址PAGE_OFFSE將被映射為物理地址PHYS_OFFSET,它應該與TASK_SIZE具有相同的值。
l TASK_SIZE
一個用戶進程的最大值,單位為byte。用戶空間堆疊從這個地址處向下增長。
任何一個低於TASK_SIZE的虛擬地址對用戶進程來說都是不可見的,因此,核心通過進程偏移對每個進行進行動態的管理。我把這叫做用戶段。任何高於TASK_SIZE的對所有進程都是相同的,稱之為核心段。(換句話說,你不能把IO映射放在低於TASK_SIZE和PAGE_OFFSET的位置處。)
l TEXTADDR
核心的虛擬起始地址,通常為PAGE_OFFSET 0x8000。核心映射必須在此結束。
l DATAADDR
核心數據段的虛擬地址,不能在使用解壓縮器的情況下定義。
l VMALLOC_START
l VMALLOC_END
用於限制vmalloc()區域的虛擬地址。此地址必須位於核心段。通常,vmalloc()區域在最後的虛擬RAM地址以上開始VMALLOC_OFFSET位元組。
l VMALLOC_OFFSET
Offset normally incorporated into VMALLOC_START to provide a hole between virtual RAM and the vmalloc area. We do this to allow out of bounds memory accesses (eg,something writing off the end of the mapped memory map) to be caught. Normally set to 8MB.

構架宏

pram——指定了RAM起始的物理地址,必須始終存在,並應等於PHYS_OFFSET。
pio——是供arch/arm/kernel/debug-armv.S中的調試宏使用的,包含IO的8 MB區域的物理地址。
vio——是8MB調試區域的虛擬地址。
這個調試區域將被位於代碼中(通過MAPIO函式)的隨後的構架相關代碼再次進行初始化。
l BOOT_PARAMS
參見 PARAMS_PHYS.
l FⅨUP(func)
機器相關的修正,在存儲子系統被初始化前運行。
l MAPIO(func)
機器相關的函式,用於IO區域的映射(包括上面的調試區)。
l INITIRQ(func)
用於初始化中斷的機器相關的函式。

相關詞條

熱門詞條

聯絡我們