linux核心結構

2021-09-30 09:49:19 字數 3887 閱讀 3693

1.程序排程(sched):控制程序對cpu的訪問。當需要選擇下乙個程序執行時,由排程程式選擇最值得執行的程序。可執行程序實際上是僅等待cpu資源的程序,如果某個程序在等待其它資源,則該程序是不可執行程序。linux使用了比較簡單的基於優先順序的程序排程演算法選擇新的程序。

2.記憶體管理(mm)允許多個程序安全的共享主記憶體區域。linux的記憶體管理支援虛擬記憶體,即在計算機中執行的程式,其**,資料,堆疊的總量可以超過實際記憶體的大小,作業系統只是把當前使用的程式塊保留在記憶體中,其餘的程式塊則保留在磁碟中。必要時,作業系統負責在磁碟和記憶體間交換程式塊。記憶體管理從邏輯上分為硬體無關部分和硬體有關部分。硬體無關部分提供了程序的對映和邏輯記憶體的對換;硬體相關的部分為記憶體管理硬體提供了虛擬介面。

3.虛擬檔案系統(virtualfilesystem,vfs)隱藏了各種硬體的具體細節,為所有的裝置提供了統一的介面,vfs提供了多達數十種不同的檔案系統。虛擬檔案系統可以分為邏輯檔案系統和裝置驅動程式。邏輯檔案系統指linux所支援的檔案系統,如ext2,fat等,裝置驅動程式指為每一種硬體控制器所編寫的裝置驅動程式模組。

5.程序間通訊(ipc) 支援程序間各種通訊機制。

處於中心位置的程序排程,所有其它的子系統都依賴它,因為每個子系統都需要掛起或恢復程序。一般情況下,當乙個程序等待硬體操作完成時,它被掛起;當操作真正完成時,程序被恢復執行。例如,當乙個程序通過網路傳送一條訊息時,網路介面需要掛起傳送程序,直到硬體成功地完成訊息的傳送,當訊息被成功的傳送出去以後,網路介面給程序返回乙個**,表示操作的成功或失敗。其他子系統以相似的理由依賴於程序排程。

各個子系統之間的依賴關係如下:

程序排程與記憶體管理之間的關係:這兩個子系統互相依賴。在多道程式環境下,程式要執行必須為之建立程序,而建立程序的第一件事情,就是將程式和資料裝入記憶體。

程序間通訊與記憶體管理的關係:程序間通訊子系統要依賴記憶體管理支援共享記憶體通訊機制,這種機制允許兩個程序除了擁有自己的私有空間,還可以訪問共同的記憶體區域。

虛擬檔案系統與網路介面之間的關係:虛擬檔案系統利用網路介面支援網路檔案系統(nfs),也利用記憶體管理支援ramdisk裝置。

記憶體管理與虛擬檔案系統之間的關係:記憶體管理利用虛擬檔案系統支援交換,交換程序(swapd)定期由排程程式排程,這也是記憶體管理依賴於程序排程的唯一原因。當乙個程序訪問的記憶體對映被換出時,記憶體管理向檔案系統發出請求,同時,掛起當前正在執行的程序。

除了這些依賴關係外,核心中的所有子系統還要依賴於一些共同的資源。這些資源包括所有子系統都用到的過程。例如:分配和釋放記憶體空間的過程,列印警告或錯誤資訊的過程,還有系統的除錯例程等等。

系統資料結構

在linux的核心的實現中,有一些資料結構使用頻度較高,他們是:

task_struct.

linux核心利用乙個資料結構(task_struct)代表乙個程序,代表程序的資料結構指標形成了乙個task陣列(linux中,任務和程序是相同的術語),這種指標陣列有時也稱為指標向量。這個陣列的大小由nr_tasks(預設為512),表明linux系統中最多能同時執行的程序數目。當建立新程序的時候,linux為新程序分配乙個task_struct結構,然後將指標儲存在task陣列中。排程程式一直維護著乙個current指標,他指向當前正在執行的程序。

mm_struct

每個程序的虛擬記憶體由乙個mm_struct結構來代表,該結構實際上包含了當前執行映像的有關資訊,並且包含了一組指向vm_area_struct結構的指標,vm_area_struct結構描述了虛擬記憶體的乙個區域。

inode

虛擬檔案系統(vfs)中的檔案、目錄等均由對應的索引節點(inode)代表。每個vfs索引節點中的內容由檔案系統專屬的例程提供。vfs索引節點只存在於核心記憶體中,實際儲存於vfs的索引節點快取記憶體中。如果兩個程序用相同的程序開啟,則可以共享inade的資料結構,這種共享是通過兩個程序中資料塊指向相同的inode完成。

linux的具體結構

所謂具體結構是指系統實現的結構。

linux的具體結構類似於抽象結構,這種對應性是因為抽象結構**於具體結構,我們的劃分沒有嚴格依照源**的目錄結構,且和子系統的分組也不完全匹配,但是,它很接近源**的目錄結構。

儘管前面的討論的抽象結構顯示了各個子系統之間只有很少的依賴關係,但是具體結構的5個子系統之間有高度的依賴關係。我們可以看出,具體結構中的很多依賴關係並沒有在抽象結構**現。

linux核心源**

目前,較新而又穩定的核心版本是2.0.x和2.2.x,因為版本不同稍有差別,因此如果你想讓乙個新的驅動程式既支援2.0.x,又支援2.2.x,就需要根據核心版本進行條件編譯,要作到這一點,就要支援巨集linux_version_code,假如核心的版本用a.b.c來表示,這個巨集的值就是216a+28b+c。要用到指定核心版本的值,我們可以用kernel_version巨集,我們也可以自己去定義它。

對核心的修改用補丁檔案的方式發布的。patch實用程式用來用來對核心原始檔進行一系列的修改。例如:你有2.2.9的源**,但想移到2.2.10。就可以獲得2.2.10的補丁檔案,應用patch來修改2.2.9原始檔。例如:

$ cd /usr/src/linux

$ patch –pl < patch-2.2.10

linux 核心源**的結構

linux核心源**位於/usr/src/linux目錄下。

/include子目錄包含了建立核心**時所需的大部分包含檔案,這個模組利用其他模組重建核心。

/init 子目錄包含了核心的初始化**,這是核心工作的開始的起點。

/arch子目錄包含了所有硬體結構特定的核心**。如:i386,alpha

/drivers子目錄包含了核心中所有的裝置驅動程式,如塊裝置和scsi裝置。

/fs子目錄包含了所有的檔案系統的**。如:ext2,vfat等。

/net子目錄包含了核心的連網**。

/mm子目錄包含了所有記憶體管理**。

/ipc子目錄包含了程序間通訊**。

/kernel子目錄包含了主核心**。

從何處開始閱讀源**?

在internet,有人製作了源**導航器,為閱讀源**提供了良好的條件,站點為lxr.linux.no/source。

下面給出閱讀源**的線索:

系統的啟動和初始化:

在基於intel的系統上,當loadlin.exe或lilo把核心裝入到記憶體並把控制權傳遞給核心時,核心開始啟動。關於這一部分請看,arch/i386/kernel/head.s,head.s進行特定結構的設定,然後跳轉到init/main.c的main()例程。

記憶體管理:

記憶體管理的**主要在/mm,但是特定結構的**在arch/*/mm。缺頁中斷處理的**在/mm/memory.c ,而記憶體對映和頁快取記憶體器的**在/mm/filemap.c 。緩衝器快取記憶體是在/mm/buffer.c 中實現,而交換快取記憶體是在mm/swap_state.c和mm/swapfile.c。

核心:核心中,特定結構的**在arch/*/kernel,排程程式在kernel/sched.c,fork的**在kernel/fork.c,核心例程處理程式在include/linux/interrupt.h,task_struct資料結構在inlucde/linux/sched.h中。

pci:

pci偽驅動程式在drivers/pci/pci.c,其定義在inclulde/linux/pci.h。每一種結構都有一些特定的pci bios**,intel的在arch/alpha/kernel/bios32.c中。

程序間通訊:

所有的systemvipc物件許可權都包含在ipc_perm資料結構中,這可以在include/linux/ipc.h中找到。systemv訊息是在ipc/msg.c中實現。共享記憶體在ipc/shm.c中實現。訊號量在ipc/sem.c中,管道在/ipc/pipe.c中實現。

中斷處理:

核心的中斷處理**幾乎所有的微處理器特有的。中斷處理**在arch/i386/kernel/irq.c中,其定義在include/asm-i386/irq.h中。

Linux核心結構

linux核心主要由五個子系統組成 程序排程,記憶體管理,虛擬檔案系統,網路介面,程序間通訊。1.程序排程 sched 控制程序對cpu的訪問。當需要選擇下乙個程序執行時,由排程程式選擇最值得執行的程序。可執行程序實際上是僅等待cpu資源的程序,如果某個程序在等待其它資源,則該程序是不可執行程序。l...

Linux核心結構

linux核心主要由五個子系統組成 程序排程,記憶體管理,虛擬檔案系統,網路介面,程序間通訊。1.程序排程 sched 控制程序對cpu的訪問。當需要選擇下乙個程序執行時,由排程程式選擇最值得執行的程序。可執行程序實際上是僅等待cpu資源的程序,如果某個程序在等待其它資源,則該程序是不可執行程序。l...

linux核心結構

分別是 程序排程 sched 程序間通訊 ipc 虛擬檔案系統 vfs 記憶體管理 mm 網路通訊 net 程序排程與記憶體管理之間的關係 這兩個子系統互相依賴。在多道程式環境下,必須為程式建立程序,而建立程序的第一件事情就是將程式和資料裝入記憶體。程序間通訊與記憶體管理的關係 程序間通訊子系統要依...