Linux內核
Linux內核 |
軟件名稱: Linux內核 軟件語言: C語言 軟件授權: 免費 發明者: Linus Torvalds 使用時間: 1991年 |
Linux是一種開源電腦操作系統內核。它是一個用C語言寫成,符合POSIX標準的類Unix操作系統。Linux最早是由芬蘭 Linus Torvalds為嘗試在英特爾x86架構上提供自由的類Unix操作系統而開發的。該計劃開始於1991年,在計劃的早期有一些Minix 黑客提供了協助,而今天全球無數程序員正在為該計劃無償提供幫助。[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 內核發行版簡史
商業化,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社區控制着,版本也是唯一的。實際上,操作系統的內核版本指的是在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 中可以找到依賴於體系結構的源代碼。
內存管理
內核所管理的另外一個重要資源是內存。為了提高效率,如果由硬
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 中找到。
文件系統層之下是緩衝區緩存,它為文件系統層提供了一個通用函數集(與具體文件系統無關)。這個緩存層通過將數據保留一段時間(或者隨即預先讀取數據以便在需要是就可用)優化了對物理設備的訪問。緩衝區緩存之下是設備驅動程序,它實現了特定物理設備的接口。
特性
可移植性
儘管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系列
網絡支持
作為一個生產操作系統和開源軟件,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版本升級
定時器(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。一些組織或廠家,將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發行版。
原先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)
用於初始化中斷的機器相關的函數。
參考資料
- ↑ [ ], , 2020-01-18