天天看點

戴文的Linux核心專題:02 源代碼【轉】

在下載下傳并解壓核心源代碼後,使用者可以看到許多檔案夾和檔案。嘗試去找一個特定的檔案或許是一個挑戰。謝天謝地,源代碼以一個特定的方式組織的。這使開發者能夠輕松找到任何檔案或者核心的一部分。

核心源代碼的根目錄下包含了以下檔案夾

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<code>arch</code>

<code>block</code>

<code>crypto</code>

<code>Documentation</code>

<code>drivers</code>

<code>firmware</code>

<code>fs</code>

<code>include</code>

<code>init</code>

<code>ipc</code>

<code>kernel</code>

<code>lib</code>

<code>mm</code>

<code>net</code>

<code>samples</code>

<code>scripts</code>

<code>security</code>

<code>sound</code>

<code>tools</code>

<code>usr</code>

<code>virt</code>

還有一些檔案在源代碼的根目錄下。它們會在下面列出。

COPYING -許可和授權資訊。Linux核心在GPLv2許可證下授權。該許可證授予任何人有權免費去使用、修改、分發和共享源代碼和編譯代碼。然而,沒有人可以出售源代碼。

CREDITS - 貢獻者清單

Kbuild - 這是一個設定一些核心設定的腳本。打個比方,這個腳本設定一個ARCH變量,這是開發者想要生成的核心支援的處理器類型。

Kconfig - 這個腳本會在開發人員配置核心的時候用到,這會在以後的文章中讨論。

MAINTAINERS - 這是一個目前維護者清單,他們的電子郵件位址,首頁,和他們負責開發和維護的核心的特定部分或檔案。當一個開發者在核心中發現一個問題,并希望能夠報告給能夠處理這個問題的維護者時,這是是很有用的。

Makefile - This script is the main file that is used to compile the kernel. This file passes parameters to the compiler as well as the list of files to compile and any other necessary information. 這個腳本是編譯核心的主要檔案。這個檔案将編譯參數和編譯所需的檔案和必要的資訊傳給編譯器。

README - 這個文檔提供給開發者想要知道的如何編譯核心的資訊。

REPORTING-BUGS - 這個文檔提供如何報告問題的資訊。

核心的代碼是以“.c”或“.h”為擴充名的檔案。 “.c”的擴充名表明核心是用衆多的程式設計語言之一的C語言寫的, “h”的檔案是頭檔案,而他們也是用C寫成。頭檔案包含了許多“.c”檔案需要使用的代碼,因為他們可以引入已有的代碼而不是重新編寫代碼,這節省了程式員的時間。否則,一組執行相同的動作的代碼,将存在許多或全部都是“c”檔案。這也會消耗和浪費硬碟空間。(譯注:頭檔案不僅僅可節省重複編碼,而且代碼複用也會降低代碼錯誤的幾率)

所有上面列出的檔案夾中的檔案都組織得很好。檔案夾名稱至少可以幫助開發人員很好地猜測檔案夾中的内容。下面提供了一個目錄樹和描述。

arch - 這個檔案夾包含了一個Kconfig檔案,它用于設定這個目錄裡的源代碼編譯所需的一系列設定。每個支援的處理器架構都在它相應的檔案夾中。如,Alpha處理器的源代碼在alpha檔案夾中。請記住,随着時間的推移,一些新的處理器将被支援,有些會被放棄。對于Linux v3.9.4,arch下有以下檔案夾:

22

23

24

25

26

27

28

29

30

<code>alpha</code>

<code>arc</code>

<code>arm</code>

<code>arm64</code>

<code>avr32</code>

<code>blackfin</code>

<code>c6x</code>

<code>cris</code>

<code>frv</code>

<code>h8300</code>

<code>hexagon</code>

<code>ia64</code>

<code>m32r</code>

<code>m68k</code>

<code>metag</code>

<code>microblaze</code>

<code>mips</code>

<code>mn10300</code>

<code>openrisc</code>

<code>parisc</code>

<code>powerpc</code>

<code>s390</code>

<code>score</code>

<code>sh</code>

<code>sparc</code>

<code>tile</code>

<code>um</code>

<code>unicore32</code>

<code>x86</code>

<code>xtensa</code>

block – 此檔案夾包含塊裝置驅動程式的代碼。塊裝置是以資料塊方式接收和發送的資料的裝置。資料塊都是一塊一塊的資料而不是持續的資料流。

crypto - 這個檔案夾包含許多加密算法的源代碼。例如,“sha1_generic.c”這個檔案包含了SHA1加密算法的代碼。

Documentation - 此檔案夾包含了核心資訊和其他許多檔案資訊的文本文檔。如果開發者需要一些資訊,他們也許能在這裡找到所需要的資訊。

drivers - 該目錄包含了驅動代碼。驅動是一個控制硬體的軟體。例如,要讓計算機知道鍵盤并使其可用,鍵盤驅動是必要的。這個檔案夾中存在許多檔案夾。每個檔案夾都以硬體的種類或者型号命名。例如,'bluetooth'包含了藍牙驅動程式的代碼。還有其他很明顯的驅動像SCSI、USB和火線等。有些驅動程式可能會比較難找到。例如,操縱杆驅動不在'joystick'檔案夾中,它們卻在./drivers/input/joystick。同樣鍵盤和滑鼠驅動也在這個input檔案夾中。 'Macintosh'包含了蘋果的硬體代碼。 'Xen'包含了Xen hypervisor代碼。(hypervisor是一種允許使用者在一台計算機上運作多個作業系統的軟體或硬體。這意味着在Xen允許使用者在一台計算機上同時運作的兩個或兩個以上的Linux系統。使用者還可以運作Windows,Solaris,FreeBSD或其他作業系統在Linux系統上。)driver檔案夾下還有許多其他的檔案夾,但他們在這篇文章中無法一一列舉,他們将在以後的文章中提到。

firmware - fireware中包含了讓計算機讀取和了解從裝置發來的信号的代碼。舉例來說,一個攝像頭管理它自己的硬體,但計算機必須了解攝像頭給計算機發送的信号。Linux系統會使用vicam固件(firmware)來了解攝像頭的通訊。否則,沒有了固件,Linux系統将不知道如何處理攝像頭發來的資訊。另外,固件同樣有助于将Linux系統發送消息給該裝置。這樣Linux系統可以告訴攝像頭重新調整或關閉攝像頭。

fs - 這是檔案系統的檔案夾。了解和使用的檔案系統所需要的所有的代碼就在這裡。在這個檔案夾裡,每種檔案系統都有自己的檔案夾。例如,ext4檔案系統的代碼在ext4檔案夾内。 在fs檔案夾内,開發者會看到一些不在檔案夾中的檔案。這些檔案用來控制整個檔案系統。例如,mount.h中會包含挂載檔案系統的代碼。檔案系統是以結構化的方式來存儲和管理的儲存設備上的檔案和目錄。每個檔案系統都有自己的優點和缺點。這是由檔案系統的設計決定的。舉例來說,NTFS檔案系統支援的透明壓縮(當啟用時,會在使用者不知道的情況下自動壓縮存儲檔案)。大多數檔案系統缺乏此功能,但如果在fs檔案夾裡編入相應的檔案,它們也有這種能力。

include - include包含了核心所需的各種頭檔案.這個名字來自于C語言用"include"來在編譯時導入頭檔案。

init - init檔案夾包含了核心啟動的處理代碼(INITiation)。main.c是核心的核心檔案,這是用來銜接所有的其他檔案的源代碼主檔案。

ipc - IPC代表程序間通訊。此檔案夾中的代碼是作為核心與程序之間的通信層。核心控制着硬體,是以程式隻能請求核心來執行任務。假設使用者有一個打開DVD托盤的程式。程式不直接打開托盤,相反,該程式通知核心托盤應該被打開。然後,核心給硬體發送一個信号去打開托盤。這些代碼同樣管理kill信号。舉例來說,當系統管理者打開程序管理器去關閉一個已經鎖死的程式,這個關閉程式的信号被稱為kill信号。核心接收到信号,然後核心會要求程式停止或直接把程序從記憶體和CPU中移除(取決于kill的類型)。指令行中的管道同樣用于程序間通信。管道會告訴核心在某個記憶體頁上寫入輸出資料。程式或者指令得到的資料是來自記憶體頁上的某個給定的指針。

kernel - 這個檔案夾中的代碼控制核心本身。例如,如果一個調試器需要跟蹤問題,核心将使用這個檔案夾中代碼來将核心指令通知調試器跟蹤核心進行的所有動作。這裡也有跟蹤時間的代碼。在核心檔案夾下有個"power"檔案夾,這裡的代碼可以使計算機重新啟動、關機和挂起。

lib - 這個檔案夾包含了核心需要引用的一系列核心庫檔案代碼。

mm - mm檔案夾中包含了記憶體管理代碼。記憶體并不是任意存儲在RAM晶片上的。相反,核心小心地将資料放在RAM晶片上。核心不會覆寫任何正在使用或儲存重要資料的記憶體區域。

net - net檔案夾中包含了網絡協定代碼。這包括IPv6、AppleTalk、以太網、WiFi、藍牙等的代碼,此外處理網橋和DNS解析的代碼也在net目錄。

samples - 此檔案夾包含了程式示例和正在編寫中的子產品代碼。假設一個新的子產品引入了一個想要的有用功能,但沒有程式員說它已經可以正常運作在核心上。那麼,這些子產品就會移到這裡。這給了新核心程式員一個機會通過這個檔案夾來獲得幫助,或者選擇一個他們想要協助開發的子產品。

scripts - 這個檔案夾有核心編譯所需的腳本。最好不要改變這個檔案夾内的任何東西。否則,您可能無法配置或編譯核心。

security - 這個檔案夾是有關核心安全的代碼。它對計算機免于受到病毒和黑客的侵害很重要。否則,Linux系統可能會遭到損壞。關于核心的安全性,将在以後的文章中讨論。

sound - 這個檔案夾中包含了聲霸卡驅動。

tools - 這個檔案夾中包含了和核心互動的工具。

usr - 還記得在以前的文章中提到vmlinuz和其他類似的檔案麼?這個檔案夾中的代碼在核心編譯完成後建立這些檔案。

virt - 此檔案夾包含了虛拟化代碼,它允許使用者一次運作多個作業系統。這與先前提到的Xen是不同的。通過虛拟化,客戶機作業系統就像任何其他運作在Linux主機的應用程式一樣運作。通過Xen這樣的hypervisor(注:虛拟機管理程式),兩個作業系統可以同時管理硬體。在虛拟化中,在客戶機作業系統上運作在Linux核心上,而在hypervisor中,它沒有客戶系統并且所有的系統不互相依賴。

提示: 絕不在核心源代碼内移動檔案,除非你知道你在做什麼。否則,編譯會由于缺失檔案失敗。

Linux核心的檔案夾結構保持相對穩定。核心開發者會做一些修改,但總體來說,這些設定對整個核心版本都是一樣。驅動程式檔案夾的布局也基本保持一樣。

本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/sky-heaven/p/6972663.html,如需轉載請自行聯系原作者

繼續閱讀