一文詳解Linux內(nèi)核基本概念
Linux內(nèi)核是一個(gè)操作系統(tǒng)(OS)內(nèi)核,本質(zhì)上定義為類Unix。它用于不同的操作系統(tǒng),主要是以不同的Linux發(fā)行版的形式。Linux內(nèi)核是第一個(gè)真正完整且突出的免費(fèi)和開(kāi)源軟件示例。Linux 內(nèi)核是第一個(gè)真正完整且突出的免費(fèi)和開(kāi)源軟件示例,促使其廣泛采用并得到了數(shù)千名開(kāi)發(fā)人員的貢獻(xiàn)。
Linux內(nèi)核?是操作系統(tǒng)的核心組件,作為開(kāi)源軟件由Linus Torvalds于1991年創(chuàng)建,負(fù)責(zé)管理硬件資源并為應(yīng)用程序提供基礎(chǔ)服務(wù)。
?Linux內(nèi)核的定義與起源?
Linux內(nèi)核是計(jì)算機(jī)操作系統(tǒng)最底層的核心程序,采用C語(yǔ)言編寫(xiě)并遵循POSIX標(biāo)準(zhǔn),具備類Unix特性。它由芬蘭程序員Linus Torvalds在1991年首次發(fā)布,并依托全球開(kāi)發(fā)者社區(qū)協(xié)作維護(hù),成為開(kāi)源軟件領(lǐng)域的典范。??
?核心功能特性?
Linux內(nèi)核通過(guò)以下機(jī)制實(shí)現(xiàn)硬件與軟件的協(xié)同工作:
?進(jìn)程管理?:采用層次化進(jìn)程結(jié)構(gòu),通過(guò)調(diào)度算法分配CPU時(shí)間片,支持多任務(wù)并發(fā)執(zhí)行。???
?內(nèi)存管理?:提供虛擬內(nèi)存機(jī)制,實(shí)現(xiàn)進(jìn)程間內(nèi)存隔離與共享,優(yōu)化物理內(nèi)存使用效率。??
?設(shè)備驅(qū)動(dòng)?:抽象硬件操作細(xì)節(jié),支持超過(guò)80%的常見(jiàn)硬件設(shè)備的即插即用。??
?文件系統(tǒng)?:基于虛擬文件系統(tǒng)(VFS)架構(gòu),兼容ext4、XFS等數(shù)十種文件格式。??
?網(wǎng)絡(luò)協(xié)議棧?:內(nèi)置TCP/IP協(xié)議族,支撐互聯(lián)網(wǎng)通信基礎(chǔ)功能。??
Linux 內(nèi)核(英語(yǔ):Linux kernel),是 Linux 操作系統(tǒng)的內(nèi)核,以 C 語(yǔ)言寫(xiě)成,符合 POSIX 標(biāo)準(zhǔn),以 GNU 通用公共許可證發(fā)布。Linux 最早是由芬蘭黑客林納斯·托瓦茲為嘗試在英特爾 x86 架構(gòu)上提供自由免費(fèi)的類 Unix 系統(tǒng)而開(kāi)發(fā)的。該計(jì)劃開(kāi)始于 1991 年,林納斯·托瓦茲當(dāng)時(shí)在 Usenet 新聞組 comp.os.minix 登載帖子,這份著名的帖子標(biāo)示著 Linux 計(jì)劃的正式開(kāi)始。
在計(jì)劃的早期有一些 Minix 黑客提供了協(xié)助,而今天全球無(wú)數(shù)程序員正在為該計(jì)劃無(wú)償提供幫助。
技術(shù)上說(shuō) Linux 是一個(gè)內(nèi)核?!皟?nèi)核”指的是一個(gè)提供硬件抽象層、磁盤(pán)及文件系統(tǒng)控制、多任務(wù)等功能的系統(tǒng)軟件。一個(gè)內(nèi)核不是一套完整的操作系統(tǒng)。一套基于 Linux 內(nèi)核的完整操作系統(tǒng)叫作 Linux 操作系統(tǒng),或是 GNU/Linux。
Linux 內(nèi)核是在 GNU 通用公共許可證第 2 版之下發(fā)布的(加上一些非自由固件、blob 與各種非自由許可證)。
貢獻(xiàn)者遍布世界各地,日常開(kāi)發(fā)在 Linux 內(nèi)核郵件列表。
源代碼
一般情況下 Linux 內(nèi)核源代碼位于 /usr/src/linux 目錄下。
/include子目錄包含了建立內(nèi)核代碼時(shí)所需的大部分包含文件,這個(gè)模塊利用其他模塊重建內(nèi)核。/init 子目錄包含了內(nèi)核的初始化代碼,這是內(nèi)核工作的開(kāi)始的起點(diǎn)。/arch 子目錄包含了所有硬件結(jié)構(gòu)特定的內(nèi)核代碼。如:i386,alpha/drivers 子目錄包含了內(nèi)核中所有的設(shè)備驅(qū)動(dòng)程序,如塊設(shè)備和SCSI設(shè)備。/fs 子目錄包含了所有的文件系統(tǒng)的代碼。如:ext2,vfat等。/net 子目錄包含了內(nèi)核的連網(wǎng)代碼。/mm 子目錄包含了所有內(nèi)存管理代碼。/ipc 子目錄包含了進(jìn)程間通信代碼。/kernel 子目錄包含了主內(nèi)核代碼。內(nèi)核程序
編譯完成新內(nèi)核后,會(huì)生成幾個(gè)文件,這些文件是內(nèi)核啟動(dòng)所需要的,這里簡(jiǎn)單介紹一下。
vmlinux,編譯出來(lái)的最原始的內(nèi)核文件,沒(méi)有壓縮,位于源碼根目錄下。該內(nèi)核文件不能用來(lái)啟動(dòng)系統(tǒng)。
vmlinuz,這個(gè)就是我們要引導(dǎo)的內(nèi)核,它一般是一個(gè)鏈接文件,位于根目錄下。真正的文件位于/boot 文件夾下。z 表示壓縮的內(nèi)核,vm 表示 virtual memory 的意思。linux 支持虛擬內(nèi)存,可利用硬盤(pán)空間作為虛擬內(nèi)存使用。在編譯內(nèi)核時(shí),通過(guò) make zImage 或 make bzImage 生成 zImage 或 bzImage 原始?jí)嚎s內(nèi)核文件,這些內(nèi)核文件位于 /usr/src/linux-2.6.23.9/arch/i386/boot 目錄下;接著我們會(huì)把它拷貝到 /boot 目錄下并改名為 vmlinuz;最后在根目錄下創(chuàng)建一個(gè)到該文件的同名鏈接文件。bzImage 表示 big zImage 的意思,zImage 是老式的內(nèi)核文件格式,在新的內(nèi)核版本中已不使用了,現(xiàn)在生成的內(nèi)核是 bzImage 格式的內(nèi)核文件。這兩種內(nèi)核文件的區(qū)別是,zImage 解壓縮內(nèi)核到低端內(nèi)存中(第一個(gè)640K),bzImage 解壓縮內(nèi)核到高端內(nèi)存中(1M以上)
這兩個(gè)內(nèi)核文件都是使用 gzip 軟件壓縮的,但文件頭部?jī)?nèi)嵌有 gzip 解壓縮代碼,能在啟動(dòng)時(shí)自動(dòng)解壓縮內(nèi)核。使用 gzip 是不能正常解壓內(nèi)核的。
在源碼根目錄生成的 vmlinux 是一個(gè)沒(méi)有壓縮的內(nèi)核文件。
如果在 /boot 目錄下存在多個(gè)版本的內(nèi)核文件,則可用 vmlinuz-xxxx 的方式命名。但根目錄下的 vmlinuz 鏈接文件名一般不變。
initrd-x.x.x.img,initrd 是"initial ramdisk"的簡(jiǎn)寫(xiě)。作用是在內(nèi)核引導(dǎo)前加載相應(yīng)的硬件模塊,為內(nèi)核引導(dǎo)做準(zhǔn)備。比如,使用的是 scsi 硬盤(pán),而內(nèi)核 vmlinuz 中并沒(méi)有這個(gè) scsi 硬件的驅(qū)動(dòng),那么在裝入 scsi 模塊之前,內(nèi)核不能加載根文件系統(tǒng),但 scsi 模塊存儲(chǔ)在根文件系統(tǒng)的/lib/modules 下。為了解決這個(gè)問(wèn)題,可以引導(dǎo)一個(gè)能夠讀實(shí)際內(nèi)核的 initrd 內(nèi)核并用 initrd 修正 scsi 引導(dǎo)問(wèn)題。initrd 可使用 mkinitrd 工具創(chuàng)建。
System.map,內(nèi)核符號(hào)映射文件,位于/boot 目錄下,與內(nèi)核名要對(duì)應(yīng)。內(nèi)核編譯完成后,在源碼根目錄下就會(huì)生成一個(gè) System.map 文件。我們要把它拷貝到/boot 目錄下并改成相關(guān)的名稱。如內(nèi)核名為 vmlinuz-2.6.23.9,則這個(gè)內(nèi)核符號(hào)映射文件就應(yīng)該命名為 System.map-2.6.23.9。
運(yùn)行空間
Linux 系統(tǒng)由用戶空間和內(nèi)核空間兩部分組成。
內(nèi)核空間與用戶空間是程序執(zhí)行的兩種不同狀態(tài),通過(guò)系統(tǒng)調(diào)用和硬件中斷能夠完成從用戶空間到內(nèi)核空間的轉(zhuǎn)移。
用戶空間分為:
User Applications(用戶應(yīng)用程序)GNU C Library (glibc 即 c 運(yùn)行庫(kù))內(nèi)核空間分為:
System Call Interface(系統(tǒng)調(diào)用接口)Kernel(內(nèi)核)Architecture Dependent Kernel Code(架構(gòu)體系內(nèi)核代碼)子系統(tǒng)
Linux內(nèi)核主要由五個(gè)子系統(tǒng)組成:進(jìn)程調(diào)度,內(nèi)存管理,虛擬文件系統(tǒng),網(wǎng)絡(luò)接口,進(jìn)程間通信。
進(jìn)程調(diào)度(SCHED):控制進(jìn)程對(duì)CPU的訪問(wèn)。當(dāng)需要選擇下一個(gè)進(jìn)程運(yùn)行時(shí),由調(diào)度程序選擇最值得運(yùn)行的進(jìn)程。可運(yùn)行進(jìn)程實(shí)際上是僅等待CPU資源的進(jìn)程,如果某個(gè)進(jìn)程在等待其它資源,則該進(jìn)程是不可運(yùn)行進(jìn)程。Linux使用了比較簡(jiǎn)單的基于優(yōu)先級(jí)的進(jìn)程調(diào)度算法選擇新的進(jìn)程。
內(nèi)存管理(MM):允許多個(gè)進(jìn)程安全的共享主內(nèi)存區(qū)域。Linux 的內(nèi)存管理支持虛擬內(nèi)存,即在計(jì)算機(jī)中運(yùn)行的程序,其代碼,數(shù)據(jù),堆棧的總量可以超過(guò)實(shí)際內(nèi)存的大小,操作系統(tǒng)只是把當(dāng)前使用的程序塊保留在內(nèi)存中,其余的程序塊則保留在磁盤(pán)中。必要時(shí),操作系統(tǒng)負(fù)責(zé)在磁盤(pán)和內(nèi)存間交換程序塊。內(nèi)存管理從邏輯上分為硬件無(wú)關(guān)部分和硬件有關(guān)部分。硬件無(wú)關(guān)部分提供了進(jìn)程的映射和邏輯內(nèi)存的對(duì)換;硬件相關(guān)的部分為內(nèi)存管理硬件提供了虛擬接口。
虛擬文件系統(tǒng)(VFS):隱藏了各種硬件的具體細(xì)節(jié),為所有的設(shè)備提供了統(tǒng)一的接口,VFS提供了多達(dá)數(shù)十種不同的文件系統(tǒng)。虛擬文件系統(tǒng)可以分為邏輯文件系統(tǒng)和設(shè)備驅(qū)動(dòng)程序。邏輯文件系統(tǒng)指 Linux 所支持的文件系統(tǒng),如 ext2,fat 等,設(shè)備驅(qū)動(dòng)程序指為每一種硬件控制器所編寫(xiě)的設(shè)備驅(qū)動(dòng)程序模塊。
網(wǎng)絡(luò)接口(NET):提供了對(duì)各種網(wǎng)絡(luò)標(biāo)準(zhǔn)的存取和各種網(wǎng)絡(luò)硬件的支持。網(wǎng)絡(luò)接口可分為網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)驅(qū)動(dòng)程序。網(wǎng)絡(luò)協(xié)議部分負(fù)責(zé)實(shí)現(xiàn)每一種可能的網(wǎng)絡(luò)傳輸協(xié)議。網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序負(fù)責(zé)與硬件設(shè)備通訊,每一種可能的硬件設(shè)備都有相應(yīng)的設(shè)備驅(qū)動(dòng)程序。
進(jìn)程間通訊(IPC):支持進(jìn)程間各種通信機(jī)制。處于中心位置的進(jìn)程調(diào)度,所有其它的子系統(tǒng)都依賴它,因?yàn)槊總€(gè)子系統(tǒng)都需要掛起或恢復(fù)進(jìn)程。一般情況下,當(dāng)一個(gè)進(jìn)程等待硬件操作完成時(shí),它被掛起;當(dāng)操作真正完成時(shí),進(jìn)程被恢復(fù)執(zhí)行。例如,當(dāng)一個(gè)進(jìn)程通過(guò)網(wǎng)絡(luò)發(fā)送一條消息時(shí),網(wǎng)絡(luò)接口需要掛起發(fā)送進(jìn)程,直到硬件成功成功地完成消息的發(fā)送,當(dāng)消息被成功的發(fā)送出去以后,網(wǎng)絡(luò)接口給進(jìn)程返回一個(gè)代碼,表示操作的成功或失敗。其他子系統(tǒng)以相似的理由依賴于進(jìn)程調(diào)度。
?架構(gòu)設(shè)計(jì)特點(diǎn)?
Linux采用?單內(nèi)核(Monolithic Kernel)?架構(gòu)設(shè)計(jì),具有以下技術(shù)優(yōu)勢(shì):
所有核心服務(wù)運(yùn)行在內(nèi)核空間,避免頻繁上下文切換帶來(lái)的性能損耗。
通過(guò)模塊化設(shè)計(jì)實(shí)現(xiàn)動(dòng)態(tài)加載驅(qū)動(dòng)和功能擴(kuò)展,平衡性能與靈活性。??
支持從嵌入式設(shè)備到超級(jí)計(jì)算機(jī)的跨平臺(tái)運(yùn)行,涵蓋ARM、x86等多種指令集架構(gòu)。??