2021-05-12 14:32:11
Linux 編譯系統的簡單介紹與核心編譯安裝
這裡不只是講怎樣編譯、安裝Linux核心的,更主要的是介紹核心的編譯系統和各個重要的檔案。最後還利用學到的編譯、安裝Linux核心去修改Linux的01排程變成隨機排程。如果你只是需要編譯、安裝核心的幾條指令,那麼翻到文章中後部分吧。如果有哪裡寫錯或者寫得不太清楚的請指正。謝謝你的閱讀!
核心嘛,就是Linux的核心,如果你用Linux只是為了聽聽歌,看看電影,上上網,那麼我想Linux是不太適合你的。但能開啟這篇文章,那麼你應該就是對Linux有興趣了。這裡我們一起編譯下這個世界上IT裡最完美的藝術品!----Linux核心
編譯前先來看看Linux核心的原始碼目錄結構。有助於認識Linux核心,熟悉了她,就不會再有恐懼與無助的感覺。
核心原始碼錄目結構:
1) Documentation 這裡沒有程式碼,有的只是一些各種各樣文件,但可以給我們足夠多的幫助。
2) arch 所有與體系結構有關的原始碼都在這裡,還有在include/asm-*/目錄裡。所支援的體系結構都在arch目錄下有對應的子目錄,而且最少都包含3個子目錄。
kernel:支援體系結構特有的如信號處理、SMP等的實現。
lib:體系結構特有的對strlen、memcpy之類的通用函數的實現。
mm:很明顯啦,這個是體系結構相關的記憶體管理的實現。
大多數的子目錄都包含boot這個子目錄,在硬體平台上啟動核心的所使用的部分或全部程式碼。
3) drivers 這裡有顯示卡、scsi介面卡pic匯流排、usb匯流排和其他的linux支援的外圍裝置和匯流排的驅動程式。是核心中最大的一個目錄。
4) fs 檔案系統。這裡有VFS、各個不同檔案系統的程式碼都在這裡。
5) include 包含了核心中大部分的標頭檔案。
6) ipc 進程間通訊,包含了號誌、共用記憶體和其他形式的ipc的程式碼。
7) kernel 包括了進程的排程、建立、復原和平台相關的的另一部分的核心程式碼。是核心最核心的部分。
8) init 核心初始化部分的程式碼。包括main.c及建立早期使用者空間的程式碼等。
9) lib 庫程式碼
10) mm 與體系結構無關的記憶體管理部分的程式碼。
11) net 網路部分的實現程式碼,常見的協定如TCP/IP、IPX。
12) scripts 這裡沒有程式碼,只有一些用來設定核心的指令碼檔案。當我們編譯核心的時候,執行make menuconfig 之類的命令時我們就是與這個目錄下的指令碼在互動。
13) block block層的實現。
14) security linux安全模型的程式碼。
15) crypto。 核心本身的加密API,實現了常用的加密演算法和雜湊演算法,和一些壓縮、CRC校驗演算法。
16) sound 音效卡驅動及其他聲音相關的程式碼。
17) usr 用於打包的與壓縮的cpio等。
各個檔案如圖:
到這裡,當你開啟linux原始碼時就不會再覺得那麼無助了。下面我們繼續。
下面介紹幾個重要檔案。
1) vmlinuz 核心引導檔案
vmlinuz是可引導的壓縮核心,“vm”代表“Virtual Memory”。Linux能夠使用硬碟空間作為虛擬記憶體,因此得名“vm”。vmlinuz不是可執行 的Linux核心(網上說是可以執行的核心,可能有誤。因為是壓縮的,要執行必須解壓。望大神指教!),因此在啟動階段首要的工作就是自解壓核心映像,它位於/boot/vmlinuz,它一般是一個軟連結。zImage(vmlinuz,小核心小於512kb)和bzImage(vmlinuz,大核心大於512kb)都是用gzip壓縮的。它們不僅是一個壓縮檔案,而且在這兩個檔案的開頭部分內嵌有gzip解壓縮程式碼。所以你不能用gunzip 或 gzip –dc解包vmlinuz。核心檔案中包含一個微型的gzip用於解壓縮核心並引導它。兩者的不同之處在於,老的zImage解壓縮核心到低端記憶體(第一個640K),bzImage解壓縮核心到高階記憶體(1M以上)。如果核心比較小,那麼可以採用zImage或bzImage之一,兩種方式引導的系統執行時是相同的。大的核心採用bzImage,不能採用zImage。
2) vmlinux
vmlinuz 是vmlinux的壓縮版。
vmlinuz結構如圖:
3) initrd.img
initrd.img,即"initrd RAM disk",是一個小的映象,包含一個最小的linux系統。通常的步驟是先啟動核心,對vmlinuz核心檔案解壓後但在真正根檔案系統啟動前,initrd.img檔案會被載入到記憶體中。核心掛載initrd.img,並執行裡面的指令碼來進一步掛載各種各樣的模組,然後發現真正的root分割區,掛載並執行/sbin/init。如果沒有initrd.img,那麼核心就試圖直接掛載root分割區。
linux的根檔案系統可以儲存在很多的媒介上,如SCSI、IDE、USB等,如果將這些驅動都編譯進了核心,那麼核心將會變得非常臃腫、龐大啊!所以linux的kernel只保留了最基本的啟動程式碼,而把各種的硬體裝置的支援以模組的形式放在了initrd.img中。這樣的好處是在啟動的過程中可以從initrd所掛載的根檔案系統中裝載所需要的模組,從而可以在kernnel不變的情況下,修改initrd的內容達到靈活地支援不同的硬體。在啟動完成的最後階段,根檔案系統重新掛載到其他裝置上去。
舉個例子,你的硬碟是SCSI介面但你的核心又不支援這種介面,你的核心就沒有辦法存取硬碟,也就沒法載入硬碟上的檔案系統,這個怎麼辦呢?? initrd.img是個ram disk的映像檔案。ram disk是佔用一部分的記憶體模擬成磁碟,讓我們的作業系統存取。ram disk是標準核心檔案認識的裝置(/dev/ram0)檔案系統也是標準核心認識的檔案系統。核心載入這個ram disk作為根檔案系統並開始執行其中的某個檔案--init(2.6以上的核心是 init檔案,位於/sbin/)來載入各種模組,服務等。經過一些設定和執行後,就可以去物理磁碟載入真正的root分割區了,然後又是一些設定等,最後啟動成功。
所以initrd.img的作用就是將一些驅動程式和命令工具打包到img裡從而簡化核心,這完全符合linux的設計思想和linux的哲學思想啊!
4) system.map,核心符號表,位於/boot/System.map 。當你編譯一個新的核心的時候,核心的各個符號的地址就會變化,舊的核心符號表的資訊對於新的核心來說是錯誤的,如果還用舊的核心符號表就會出錯,所以會產生一個新的核心符號表即system.map
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-06/118513p2.htm
相關文章