linux源碼樹結構
參考 http://www.360doc.com/content/13/0410/17/7044580_277403053.shtmlphp
目錄 | 描述 |
---|---|
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 | 虛擬化基礎結構 |
獲取源碼包的方式
爲何要活取源碼包?
在筆者到官網下載源碼時,源碼下面有以下說明:html
If you are simply trying to build third-party modules for your kernel, you do not want this package. Install the appropriate linux-headers package instead. 意思是,若是你只是想爲內核編譯第三方的模塊,那麼,你不需下載此源碼包。安裝內核頭文件包或 許會更適合你。
若是你的ubuntu是保持更新的(好比您常常執行sudo apt-get update和dist-upgrade),
那麼您的系統是安裝有內核頭文件包的,不信您到/usr/src目錄下查看,是否是有linux-headers-[版本號]-generic的文件夾呢,呵呵。我如今能夠說,你能夠在此開發你的驅動程序了。linux
可是爲何咱們還要活取源碼呢?
前面已經提到若是你只是想爲內核編譯第三方的模塊,那麼,你不需下載此源碼包。安裝內核頭文件包或許會更適合你。
可是不少時候咱們作嵌入式開發或者驅動開發,一個基本的Linux設備驅動開發環境由宿主機和目標機組成,宿主機就是用來作驅動開發工做的主機,目標機就是用來運行和測試設備驅動的主機,在宿 主機上須要有開發工具(gcc,gdb,make等)和linux源碼(版本要對應目標機上的linux內核),而目標機上只要運行linux便可。因爲 步驟有所不一樣,下面分爲普通Linux設備驅動開發和嵌入式Linux設備驅動開發兩種狀況來說述環境的搭建和驅動程序的編譯:ios
普通Linux設備驅動開發
普通Linux主要是區別于于嵌入式Linux(通常指uClinux),在這種開發中宿主機和目標機能夠是一臺主機,
即在本機上開發編譯而後在本機 上加載運行(Linux設備驅動也能夠直接編譯進內核,但爲了開發工做方便,通常採用動態加載的方式),
固然也能夠是兩臺主機,
若是是兩臺主機的話,要保證宿主機上的linux源碼的版本號與目標機中的linux內核版本一致。
普通Linux設備驅動開發的步驟以下:
①在宿主機上安裝開發工具和下載linux源碼(要求版本號和目標機上的linux內核版本一致)。開發工具主要有gcc、gdb、make等,
②編寫Linux驅動程序
是須要修改內核源代碼的。那麼這就須要咱們在本地主機上安裝一份源碼,在編譯成庫後,在進行驅動開發。
③編寫Makefile文件
④編譯出驅動文件
⑤加載並測試以及卸載:加載使用insmod或modprobe命令來實現,使用rmmod命令卸載驅動模塊sql
嵌入式Linux設備驅動開發
這種開發中通常目標機爲帶有嵌入式處理器的開發板,而宿主機爲PC,開發環境須要在宿主機上搭建,嵌入式Linux設備驅動開發的步驟以下:
①在宿主機上下載嵌入式Linux的源碼,並安裝嵌入式Linux開發工具(針對於不一樣的嵌入式處理器,工具也有所不一樣,如對應於Arm的arm-gcc系列,針對nios2處理器的nios2-cc系列)
②編寫Linux設備驅動驅動程序,將該文件複製到(linux 源碼目錄)/drivers/(目標文件夾)/中
③配置以及修改內核源碼的信息以及makefile文件,在此步配置中能夠選擇將咱們編寫的驅動編譯進內核仍是不選擇編譯,可是不能選擇編譯成模塊
④配置而且編譯內核
⑤將內核燒寫在開發版上進行測試:將生成的zImage文件下載到開發板,開發板上的嵌入式Linux啓動後能夠用insmod或modprobe加載驅動模塊,測試完畢後能夠經過rmmod命令卸載驅動模塊shell
總結
所以在開發驅動的時候若是你只是想爲內核編譯第三方的模塊,那麼,你不需下載此源碼包。安裝內核頭文件包或許會更適合咱們,可是多數狀況下,咱們可能時須要修改內核源代碼信息的,這就須要咱們在宿主機維護一份與目標機上相同的內核信息,不然咱們怎麼保證咱們編寫的驅動能夠在目標機器上運行呢。。。。ubuntu
源碼包活取的方法
linux源碼能夠經過如下幾種途徑得到:
①直接去www.kernel.org下載
https://www.kernel.org/pub/linux/kernel/centos
②經過包管理工具下載源碼,在debian和Ubuntu中能夠經過下面這個命令下載,apt-get install linux-source-(版本號) ,下載後的文件在/usr/src目錄中,解壓到該目錄便可安全
獲取源碼包
注意:
若是您只是爲了簡單的學習下驅動的開發,而不指望深層次的探究Linux內核的機制,那麼您徹底能夠跳過此步驟,單使用頭文件您是徹底能夠進行簡單的第三方驅動開發的。bash
直接從內核官網上下載
使用發行版自帶的源碼包
Ubunto14.04
安裝編譯內核所須要的軟件build-essential、autoconf、automake、cvs、subversion
sudo apt-get install build-essential kernel-package libncurses5-dev
注意:libncurses5這個軟件包在使用menuconfig配置內核的時候會用到。
ls一下/usr/src首先看下咱們的系統中有沒有源碼包,僅僅有內核頭文件包
進入/usr/src ,在這裏構建源碼樹,咱們用下面指令查看可用的源碼包
sudo apt-cache search linux-source
能夠看到獲得以下信息
linux-source - Linux kernel source with Ubuntu patches linux-source-3.13.0 - Linux kernel source for version 3.13.0 with Ubuntu patches
那麼就讓咱們來下載3.13.0版的kernel,經過使用命令下載內核
sudo apt-get install linux-source-3.13.0
下載完成後,會自動的存放在/usr/src下,
在/usr/src/下ls如下
解壓縮源碼包
sudo tar jxvf linux-source-3.13.0.tar.bz2
這樣咱們就已經獲取到了一份完整的源碼包,
CentOS構建源碼樹
獲取內核頭文件
構建的以前,最好先
yum update
把內核升級到最新版本。至於具體安裝哪一份源碼樹,要看你用的哪種內核,用uname -a能夠看到。
先檢查看看有哪些源碼包
yum list | grep kernel
若是用的普通內核,就
yum install kernel-headers kernel-devel
若是用的PAE內核,就
yum install kernel-headers kernel-PAE-devel
若是用的xen內核,就
yum install kernel-headers kernel-xen-devel
centos安裝內核源代碼
可是上面的方式只會爲咱們安裝內核的頭文件目錄以及庫信息,若是咱們指望獲取到源碼須要下面的操做
參照
下面咱們的方式是使用構建本地組內搭建內部yum源的方式安裝linux內核的源碼包
目前咱們實驗室的服務器系統是centos5.11,地址 http://vault.centos.org/5.11/os/SRPMS/kernel-2.6.18-398.el5.src.rpm
不一樣的版本,下載地址更改一下便可
其餘下載地址http://rpm.pbone.net/index.php3
- 1.安裝 rpmbuild
rpmbuild是用來製做rpm包的工具
yum install rpm-build redhat-rpm-config unifdef
- 2.下載源碼包
wget http://vault.centos.org/5.11/os/SRPMS/kernel-2.6.18-398.el5.src.rpm
- 3.安裝內核源碼
rpm -ivh kernel-2.6.18-274.el5.src.rpm
這樣咱們的源碼就已經下載好了,在/usr/src/redhat目錄下有咱們須要的全部東西。
可是到如今咱們只是安裝了環境目錄,以及源碼的壓縮包,可是並無安裝
咱們能夠看到咱們已經有了源碼的壓縮包,可是並無解壓縮,所以咱們下面執行的操做其實就是用工具對其進行解壓縮。
* 4.安裝源碼包
cd /usr/src/redhat/SPECS
rpmbuild -bp --target=`uname -m` kernel.spec 2> prep-err.log | tee prep-out.log
以上步驟完成之後,查看prep-err.log錯誤日誌,
若是沒有錯誤,則成功解出的內核源碼位置在 /usr/src/redhat/BUILD 目錄下
編譯內核
按原來的kernel配置,配置kernel.
sudo make oldconfig
make(至關耗時),開始編譯內核
sudo make
編譯內核鏡像
sudo make bzImage
安裝內核模塊
make modules_install
執行結束以後,會在/lib/modules下生成新的目錄/lib/modules/3.13.0-48-generic/, 下面的build文件就是編譯模塊的要用到的文件。至此內核編譯完成。
卸載無用的內核相關文件
咱們爲不一樣的目標機配置不一樣的內核模塊,這樣一段時間後,咱們的系統中會有多分內核信息,再加上咱們的系統因爲自動升級,系統裏也會安裝了不少內核。這樣始終用不到的舊內核或者無用內核有必要清理一下,以節省啓動時間和硬盤空間。
而後經過查看本機上全部內核的列表來決定哪些須要刪除掉:
運行命令:
dpkg --get-selections|grep linux
例如我本機顯示爲:
注意:
不要刪除當前使用的版本.後面的install表示已安裝,deinstall表示曾經安裝過,如今已被刪除(已不佔空間).
首先可查看當前用的內核是哪一個,可經過命令:uname -a 來得到信息。
其中帶有image的就是內核文件,所以可看出個人機器上共五個內核鏡像版本。可是其實只安裝了2個鏡像,這個卸載的時候咱們就會發現,我當前使用的是3.13.0-49,因此決定將其它沒用的內核刪除。
刪除內核鏡像的命令
刪除的命令爲:sudo apt-get remove linux-image-XXXX
例如我要卸載3.13.0-48的舊內核鏡像,那麼運行命令
sudo apt-get purge linux-image-3.13.0-48-generic
或者
sudo apt-get remove linux-image-3.13.0-48-generic
咱們會發現linux-image-extra-3.13.0-48-generic也會跟着被卸載,
這時候咱們ls /lib/modules/3.13.0-48-generic/會發現,安裝的內核鏡像文件已經沒有了
卸載內核頭文件
sudo apt-get purge linux-headers-3.13.0-48
或者
sudo apt-get remove linux-headers-3.13.0-48
這條命令會自動把linux-headers-3.13.0-48-generic刪除,若是未刪除咱們一樣可使用命令刪除便可。
最後再次運行命令,查看安裝的內核文件,查看是否卸載成功
dpkg --get-selections|grep linux
最後最好刷新一個啓動菜單
sudo update-grub