天天看點

建構源碼樹----Linux核心剖析(三) linux源碼樹結構 擷取源碼包的方式 擷取源碼包 編譯核心 解除安裝無用的核心相關檔案

建構源碼樹----Linux核心剖析(三) linux源碼樹結構 擷取源碼包的方式 擷取源碼包 編譯核心 解除安裝無用的核心相關檔案

目錄

描述

arch

目錄包括了所有和體系結構相關的核心代碼。它下面的每一個子目錄都代表一種linux支援的體系結構,例如i386就是intel cpu及與之相相容體系結構的子目錄。pc機一般都基于此目錄。

block

塊裝置i/o層

crypto

加密api

documentation

目錄下是一些文檔,是對每個目錄作用的具體說明。

drivers

目錄中是系統中所有的裝置驅動程式。它又進一步劃分成幾類裝置驅動,每一種有對應的子目錄

firmware

使用某些驅動程式而需要的裝置固件

fs

vfs和各種檔案系統,存放linux支援的檔案系統代碼。不同的檔案系統有不同的子目錄對應,如ext3檔案系統對應的就是ext3子目錄。

include

目錄包括編譯核心所需要的大部分頭檔案,例如與平台無關的頭檔案在include/linux子目錄下。

init

目錄包含核心的初始化代碼(不是系統的引導代碼),有main.c和version.c兩個檔案。這是研究核心如何工作的好起點。

ipc

核心程序間的通信代碼

kernel

核心管理的核心代碼放在這裡。同時與處理器結構相關代碼都放在arch/*/kernel目錄下

lib

通用的核心庫的代碼,不過與處理器結構相關的庫代碼被放在arch/*/lib/目錄下

mm

記憶體管理子系統和vm。與具體硬體體系結構相關的記憶體管理代碼位于arch/*/mm目錄下。

net

目錄裡是核心的網絡部分代碼,其每個子目錄對應于網絡的一個方面。

samples

示例,示範代碼

scripts

配置和編譯核心所用的腳本檔案

security

linux安全子產品

sound

語音子系統

usr

早期的使用者空間代碼,所謂的initramfs

tools

在linux開發中有用的工具

virt

虛拟化基礎結構

在筆者到官網下載下傳源碼時,源碼下面有如下說明:

1

2

如果你的ubuntu是保持更新的(比如您經常執行sudo apt-get update和dist-upgrade),

那麼您的系統是安裝有核心頭檔案包的,不信您到/usr/src目錄下檢視,是不是有linux-headers-[版本号]-generic的檔案夾呢,呵呵。我現在可以說,你可以在此開發你的驅動程式了。

但是為什麼我們還要活取源碼呢?

前面已經提到如果你隻是想為核心編譯第三方的子產品,那麼,你不需下載下傳此源碼包。安裝核心頭檔案包或許會更适合你。

但是很多時候我們做嵌入式開發或者驅動開發,一個基本的linux裝置驅動開發環境由主控端和目标機組成,主控端就是用來做驅動開發工作的主機,目标機就是用來運作和測試裝置驅動的主機,在宿 主機上需要有開發工具(gcc,gdb,make等)和linux源碼(版本要對應目标機上的linux核心),而目标機上隻要運作linux即可。由于 步驟有所不同,下面分為普通linux裝置驅動開發和嵌入式linux裝置驅動開發兩種情況來講述環境的搭建和驅動程式的編譯:

普通linux主要是差別于于嵌入式linux(一般指uclinux),在這種開發中主控端和目标機可以是一台主機,

即在本機上開發編譯然後在本機 上加載運作(linux裝置驅動也可以直接編譯進核心,但為了開發工作友善,一般采用動态加載的方式),

當然也可以是兩台主機,

如果是兩台主機的話,要保證主控端上的linux源碼的版本号與目标機中的linux核心版本一緻。

普通linux裝置驅動開發的步驟如下:

①在主控端上安裝開發工具和下載下傳linux源碼(要求版本号和目标機上的linux核心版本一緻)。開發工具主要有gcc、gdb、make等,

②編寫linux驅動程式

是需要修改核心源代碼的。那麼這就需要我們在本地主機上安裝一份源碼,在編譯成庫後,在進行驅動開發。

③編寫makefile檔案

④編譯出驅動檔案

⑤加載并測試以及解除安裝:加載使用insmod或modprobe指令來實作,使用rmmod指令解除安裝驅動子產品

這種開發中一般目标機為帶有嵌入式處理器的開發闆,而主控端為pc,開發環境需要在主控端上搭建,嵌入式linux裝置驅動開發的步驟如下:

①在主控端上下載下傳嵌入式linux的源碼,并安裝嵌入式linux開發工具(針對于不同的嵌入式處理器,工具也有所不同,如對應于arm的arm-gcc系列,針對nios2處理器的nios2-cc系列)

②編寫linux裝置驅動驅動程式,将該檔案複制到(linux 源碼目錄)/drivers/(目标檔案夾)/中

③配置以及修改核心源碼的資訊以及makefile檔案,在此步配置中可以選擇将我們編寫的驅動編譯進核心還是不選擇編譯,但是不能選擇編譯成子產品

④配置并且編譯核心

⑤将核心燒寫在開發版上進行測試:将生成的zimage檔案下載下傳到開發闆,開發闆上的嵌入式linux啟動後可以用insmod或modprobe加載驅動子產品,測試完畢後可以通過rmmod指令解除安裝驅動子產品

是以在開發驅動的時候如果你隻是想為核心編譯第三方的子產品,那麼,你不需下載下傳此源碼包。安裝核心頭檔案包或許會更适合我們,但是多數情況下,我們可能時需要修改核心源代碼資訊的,這就需要我們在主控端維護一份與目标機上相同的核心資訊,否則我們怎麼保證我們編寫的驅動可以在目标機器上運作呢。。。。

linux源碼可以通過以下幾種途徑獲得:

①直接去www.kernel.org下載下傳

<a href="https://www.kernel.org/pub/linux/kernel/">https://www.kernel.org/pub/linux/kernel/</a>

②通過包管理工具下載下傳源碼,在debian和ubuntu中可以通過下面這個指令下載下傳,apt-get install linux-source-(版本号) ,下載下傳後的檔案在/usr/src目錄中,解壓到該目錄即可

注意: 如果您隻是為了簡單的學習下驅動的開發,而不期望深層次的探究linux核心的機制,那麼您完全可以跳過此步驟,單使用頭檔案您是完全可以進行簡單的第三方驅動開發的。

安裝編譯核心所需要的軟體build-essential、autoconf、automake、cvs、subversion

注意:libncurses5這個軟體包在使用menuconfig配置核心的時候會用到。

ls一下/usr/src首先看下我們的系統中有沒有源碼包,僅僅有核心頭檔案包

建構源碼樹----Linux核心剖析(三) linux源碼樹結構 擷取源碼包的方式 擷取源碼包 編譯核心 解除安裝無用的核心相關檔案

進入/usr/src ,在這裡建構源碼樹,我們用下面指令檢視可用的源碼包

建構源碼樹----Linux核心剖析(三) linux源碼樹結構 擷取源碼包的方式 擷取源碼包 編譯核心 解除安裝無用的核心相關檔案

可以看到得到如下資訊

那麼就讓我們來下載下傳3.13.0版的kernel,通過使用指令下載下傳核心

下載下傳完成後,會自動的存放在/usr/src下,

在/usr/src/下ls以下

建構源碼樹----Linux核心剖析(三) linux源碼樹結構 擷取源碼包的方式 擷取源碼包 編譯核心 解除安裝無用的核心相關檔案

解壓縮源碼包

這樣我們就已經擷取到了一份完整的源碼包,

建構的之前,最好先

把核心更新到最新版本。至于具體安裝哪一份源碼樹,要看你用的哪一種核心,用uname -a可以看到。

先檢檢視看有哪些源碼包

如果用的普通核心,就

如果用的pae核心,就

如果用的xen核心,就

但是上面的方式隻會為我們安裝核心的頭檔案目錄以及庫資訊,如果我們期望擷取到源碼需要下面的操作

下面我們的方式是使用建構本地組内搭建内部yum源的方式安裝linux核心的源碼包

不同的版本,下載下傳位址更改一下即可

1.安裝 rpmbuild

rpmbuild是用來制作rpm包的工具

2.下載下傳源碼包

建構源碼樹----Linux核心剖析(三) linux源碼樹結構 擷取源碼包的方式 擷取源碼包 編譯核心 解除安裝無用的核心相關檔案

3.安裝核心源碼

這樣我們的源碼就已經下載下傳好了,在/usr/src/redhat目錄下有我們需要的所有東西。

但是到現在我們隻是安裝了環境目錄,以及源碼的壓縮包,但是并沒有安裝

建構源碼樹----Linux核心剖析(三) linux源碼樹結構 擷取源碼包的方式 擷取源碼包 編譯核心 解除安裝無用的核心相關檔案

我們可以看到我們已經有了源碼的壓縮包,但是并沒有解壓縮,是以我們下面執行的操作其實就是用工具對其進行解壓縮。

* 4.安裝源碼包

以上步驟完成以後,檢視prep-err.log錯誤日志,

如果沒有錯誤,則成功解出的核心源碼位置在 /usr/src/redhat/build 目錄下

建構源碼樹----Linux核心剖析(三) linux源碼樹結構 擷取源碼包的方式 擷取源碼包 編譯核心 解除安裝無用的核心相關檔案

按原來的kernel配置,配置kernel.

make(相當耗時),開始編譯核心

編譯核心鏡像

安裝核心子產品

執行結束之後,會在/lib/modules下生成新的目錄/lib/modules/3.13.0-48-generic/, 下面的build檔案就是編譯子產品的要用到的檔案。至此核心編譯完成。

建構源碼樹----Linux核心剖析(三) linux源碼樹結構 擷取源碼包的方式 擷取源碼包 編譯核心 解除安裝無用的核心相關檔案

我們為不同的目标機配置不同的核心子產品,這樣一段時間後,我們的系統中會有多份核心資訊,再加上我們的系統由于自動更新,系統裡也會安裝了很多核心。這樣始終用不到的舊核心或者無用核心有必要清理一下,以節省啟動時間和硬碟空間。

建構源碼樹----Linux核心剖析(三) linux源碼樹結構 擷取源碼包的方式 擷取源碼包 編譯核心 解除安裝無用的核心相關檔案

然後通過檢視本機上所有核心的清單來決定哪些需要删除掉:

運作指令:

例如我本機顯示為:

建構源碼樹----Linux核心剖析(三) linux源碼樹結構 擷取源碼包的方式 擷取源碼包 編譯核心 解除安裝無用的核心相關檔案
不要删除目前使用的版本.後面的install表示已安裝,deinstall表示曾經安裝過,現在已被删除(已不占空間). 首先可檢視目前用的核心是哪個,可通過指令:uname -a 來獲得資訊。

其中帶有image的就是核心檔案,是以可看出我的機器上共五個核心鏡像版本。但是其實隻安裝了2個鏡像,這個解除安裝的時候我們就會發現,我目前使用的是3.13.0-49,是以決定将其它沒用的核心删除。

删除核心鏡像的指令

例如我要解除安裝3.13.0-48的舊核心鏡像,那麼運作指令

或者

建構源碼樹----Linux核心剖析(三) linux源碼樹結構 擷取源碼包的方式 擷取源碼包 編譯核心 解除安裝無用的核心相關檔案

我們會發現linux-image-extra-3.13.0-48-generic也會跟着被解除安裝,

這時候我們ls /lib/modules/3.13.0-48-generic/會發現,安裝的核心鏡像檔案已經沒有了

建構源碼樹----Linux核心剖析(三) linux源碼樹結構 擷取源碼包的方式 擷取源碼包 編譯核心 解除安裝無用的核心相關檔案

解除安裝核心頭檔案

建構源碼樹----Linux核心剖析(三) linux源碼樹結構 擷取源碼包的方式 擷取源碼包 編譯核心 解除安裝無用的核心相關檔案

這條指令會自動把linux-headers-3.13.0-48-generic删除,如果未删除我們同樣可以使用指令删除即可。

最後再次運作指令,檢視安裝的核心檔案,檢視是否解除安裝成功

建構源碼樹----Linux核心剖析(三) linux源碼樹結構 擷取源碼包的方式 擷取源碼包 編譯核心 解除安裝無用的核心相關檔案

最後最好重新整理一個啟動菜單

轉載:http://blog.csdn.net/gatieme/article/details/44961475

繼續閱讀