Linux內核


Linux內核
 
Linux是最受歡迎的自由電腦 操作系統內核。它是一個用C語言寫成,符合POSIX標准的類Unix操作系統。Linux最早是由 芬蘭 黑客 Linus Torvalds為嘗試在英特爾x86架構上提供自由免費的類Unix操作系統而開發的。該計划開始於1991年,在計划的早期有一些Minix 黑客提供了協助,而今天全球無數程序員正在為該計划無償提供幫助。 技術上說Linux是一個內核。“內核”指的是一個提供 硬件抽象層、磁盤及文件系統控制、多任務等功能的 系統軟件。一個內核不是一套完整的操作系統。一套基於Linux內核的完整操作系統叫作Linux操作系統,或是GNU/Linux。
 
 

1特性

架構

Linux系統

  Linux系統

Linux是一個一體化 內核(monolithic kernel)系統。 設備驅動程序可以完全訪問硬件。Linux內的 設備驅動程序可以方便地以 模塊化(modularize)的形式設置,並在系統運行期間可直接裝載或 卸載

可移植性

盡管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
微軟公司: Xbox
ARM系列

發表形式

原先Linus Torvalds將Linux置於一個禁止任何商業行為的條例之下,但之后改用 GNU通用公共許可證第二版。該協議允許任何人對 軟件進行修改或發行,包括商業行為,只要其遵守該協議,所有基於Linux的軟件也必須以該協議的形式發表,並提供 源代碼
Linus Torvalds曾經公開聲稱將Linux置於GNU通用公共許可證之下是他一生中所做的“最好的決定”。

2組成

進程管理(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 co mmunication)、9
網絡管理(network management)、 10
系統啟動(system init)等操作系統功能的實現。11

3內核

概念

[1] 操作系統是一個用來和硬件打交道並為 用戶程序提供一個有限服務集的低級 支撐軟件。一個 計算機系統是一個硬件和 軟件的共生體,它們互相依賴,不可分割。計算機的硬件,含有外圍設備、處理器、 內存、硬盤和其他的 電子設備組成計算機的發動機。但是沒有 軟件來操作和控制它,自身是不能工作的。完成這個控制工作的 軟件就稱為操作系統,在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Ⅸ的
主要 Linux 內核發行版簡史

  主要 Linux 內核發行版簡史

商業化,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 也可以看作是一個整體,因為它會將所有這些基本服務都集成到內核中。這與 微內核體系結構不同,后者會提供一些基本的服務,例如 通信I/O內存進程管理,更具體的服務都是插入到微內核層中的。
隨着時間的流逝,Linux 內核在 內存和 CPU 使用方面具有較高的效率,並且非常穩定。但是對於 Linux 來說,最為有趣的是在這種大小和復雜性的前提下,依然具有良好的 可移植性。Linux 編譯后可在大量處理器和具有不同 體系結構約束和需求的平台上運行。一個例子是 Linux 可以在一個具有 內存管理單元(MMU)的處理器上運行,也可以在那些不提供 MMU的處理器上運行。Linux 內核的 uClinux移植提供了對非 MMU 的支持。

開發和規范

核心的開發和規范一直是由Linux社區控制着,版本也是唯一的。實際上,操作系統的 內核版本指的是在Linux本人領導下的開發小組開發出的系統內核的版本號。自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 中可以找到依賴於 體系結構的源代碼。
內存管理:內核所管理的另外一個重要資源是內存。為了提高效率,如果由硬
VFS 在用戶和文件系統之間提供了一個交換層

  VFS 在用戶和文件系統之間提供了一個交換層

管理 虛擬內存,內存是按照所謂的內存頁 方式進行管理的(對於大部分 體系結構來說都是 4KB)。Linux 包括了管理可用 內存的方式,以及物理和虛擬映射所使用的硬件機制。
不過 內存管理要管理的可不止 4KB 緩沖區。Linux 提供了對 4KB 緩沖區的抽象,例如 slab 分配器。這種 內存管理模式使用 4KB 緩沖區為基數,然后從中分配結構,並跟蹤內存頁使用情況, 比如哪些內存頁是滿的,哪些頁面沒有完全使用,哪些頁面為空。這樣就允許該模式根據系統需要來動態調整 內存使用。
為了支持多個用戶使用 內存,有時會出現可用內存被消耗光的情況。由於這個原因,頁面可以移出 內存並放入磁盤中。這個過程稱為交換,因為頁面會被從 內存交換到硬盤上。 內存管理源代碼可以在 ./ linux/mm 中找到。
虛擬文件系統:虛擬文件系統(VFS)是 Linux 內核中非常有用的一個方面,因為它為文件系統提供了一個通用的接口抽象。VFS 在 SCI 和內核所支持的文件系統之間提供了一個交換層。
VFS 在用戶和文件系統之間提供了一個交換層
在 VFS 上面,是對諸如 open、close、read 和 write 之類的函數的一個通用 API 抽象。在 VFS 下面是文件系統抽象,它定義了上層函數的實現方式。它們是給定文件系統(超過 50 個)的插件。文件系統的 源代碼可以在 ./ linux/fs 中找到。
文件系統層之下是 緩沖區緩存,它為文件系統層提供了一個通用函數集(與具體文件系統無關)。這個緩存層通過將數據保留一段時間(或者隨即預先讀取數據以便在需要是就可用)優化了對 物理設備的訪問。 緩沖區緩存之下是 設備驅動程序,它實現了特定 物理設備的接口。

特性

如果 Linux 內核的 可移植性和效率還不夠好,Linux 還提供了其他一些特性,它們無法划分到上面的分類中。
作為一個生產操作系統和 開源軟件,Linux 是測試新協議及其增強的良好平台。Linux 支持大量 網絡協議,包括典型的 TCP/IP,以及高速網絡的擴展(大於 1 Gigabit Ethernet [GbE] 和 10 GbE)。Linux 也可以支持諸如 流控制傳輸協議(SCTP)之類的協議,它提供了很多比 TCP 更高級的特性(是傳輸層協議的接替者)。
Linux 還是一個動態內核,支持動態添加或刪除 軟件組件。被稱為動態可加載內核模塊,它們可以在引導時根據需要(當前特定設備需要這個模塊)或在任何時候由用戶插入。
Linux 最新的一個增強是可以用作其他操作系統的操作系統(稱為 系統管理程序)。該系統對內核進行了修改,稱為基於內核的 虛擬機(KVM)。這個修改為 用戶空間啟用了一個新的接口,它可以允許其他操作系統在啟用了 KVM 的內核之上運行。除了運行 Linux 的其他實例之外, Microsoft® Windows® 也可以進行虛擬化。惟一的限制是底層處理器必須支持新的虛擬化指令

4發行版

Linux內核的發展過程中,我們還不得不提一下各種Linux發行版的作用,因為正是它們推動
Linux內核的編程教程

  Linux內核的編程教程

了Linux的應用,從而也讓更多的人開始關注Linux。一些組織或廠家,將Linux系統的內核與外圍實用程序(Utilities) 軟件和文檔包裝起來,並提供一些系統安裝界面和 系統配置、設定與 管理工具,就構成了一種發行版本(distribution),Linux的發行版本其實就是Linux核心再加上外圍的實用程序組成的一個大 軟件包而已。相對於Linux 操作系統內核版本,發行版本的版本號隨發布者的不同而不同,與Linux系統內核的版本號是相對獨立的。因此把SUSE、RedHat、Ubuntu、Slackware等直接說成是Linux是不確切的,它們是Linux的發行版本,更確切地說,應該叫做“以Linux為核心的操作系統軟件包”。根據GPL准則,這些發行版本雖然都源自一個內核,並且都有自己各自的貢獻,但都沒有自己的版權。Linux的各個發行版本(distribution),都是使用Linus主導開發並發布的同一個Linux內核,因此在內核層不存在什么兼容性問題。每個版本都不一樣的感覺,只是在發行版本的最外層才有所體現,而絕不是Linux本身特別是內核不統一或是不兼容。
90年代初期Linux開始出現的時候,僅僅是以 源代碼形式出現,用戶需要在其他操作系統下進行編譯才能使用。后來出現了一些正式版本。目前最流行的幾個正式版本有:SUSE、RedHat、Fedora、Debian、Ubuntu、CentOS、Gentoo,等等。用戶可根據自己的經驗和喜好選用合適的Linux發行版。

5常量定義

初始定義

宏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)
用於初始化中斷的機器相關的函數 [4]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM