在筆者到官網下載源碼時,源碼下面有以下說明:
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. 意思是,如果你只是想為內核編譯第3方的模塊,那末,你不需下載此源碼包。安裝內核頭文件包或
許會更合適你。
如果你的ubuntu是保持更新的(比如您常常履行sudo apt-get update和dist-upgrade),
那末您的系統是安裝有內核頭文件包的,不信您到/usr/src目錄下查看,是否是有linux-headers-[版本號]-generic的文件夾呢,呵呵。我現在可以說,你可以在此開發你的驅動程序了。
但是為何我們還要活取源碼呢?
前面已提到如果你只是想為內核編譯第3方的模塊,那末,你不需下載此源碼包。安裝內核頭文件包也許會更合適你。
但是很多時候我們做嵌入式開發或驅動開發,1個基本的Linux裝備驅動開發環境由宿主機和目標機組成,宿主機就是用來做驅動開發工作的主機,目標機就是用來運行和測試裝備驅動的主機,在宿 主機上需要有開發工具(gcc,gdb,make等)和linux源碼(版本要對應目標機上的linux內核),而目標機上只要運行linux便可。由于 步驟有所不同,下面分為普通Linux裝備驅動開發和嵌入式Linux裝備驅動開發兩種情況來說述環境的搭建和驅動程序的編譯:
普通Linux主要是區分于于嵌入式Linux(1般指uClinux),在這類開發中宿主機和目標機可以是1臺主機,
即在本機上開發編譯然后在本機 上加載運行(Linux裝備驅動也能夠直接編譯進內核,但為了開發工作方便,1般采取動態加載的方式),
固然也能夠是兩臺主機,
如果是兩臺主機的話,要保證宿主機上的linux源碼的版本號與目標機中的linux內核版本1致。
普通Linux裝備驅動開發的步驟以下:
①在宿主機上安裝開發工具和下載linux源碼(要求版本號和目標機上的linux內核版本1致)。開發工具主要有gcc、gdb、make等,
②編寫Linux驅動程序
是需要修改內核源代碼的。那末這就需要我們在本地主機上安裝1份源碼,在編譯成庫后,在進行驅動開發。
③編寫Makefile文件
④編譯出驅動文件
⑤加載并測試和卸載:加載使用insmod或modprobe命令來實現,使用rmmod命令卸載驅動模塊
這類開發中1般目標機為帶有嵌入式處理器的開發板,而宿主機為PC,開發環境需要在宿主機上搭建,嵌入式Linux裝備驅動開發的步驟以下:
①在宿主機上下載嵌入式Linux的源碼,并安裝嵌入式Linux開發工具(針對不同的嵌入式處理器,工具也有所不同,如對應于Arm的arm-gcc系列,針對nios2處理器的nios2-cc系列)
②編寫Linux裝備驅動驅動程序,將該文件復制到(linux 源碼目錄)/drivers/(目標文件夾)/中
③配置和修改內核源碼的信息和makefile文件,在此步配置中可以選擇將我們編寫的驅動編譯進內核還是不選擇編譯,但是不能選擇編譯成模塊
④配置并且編譯內核
⑤將內核燒寫在開發版上進行測試:將生成的zImage文件下載到開發板,開發板上的嵌入式Linux啟動后可以用insmod或modprobe加載驅動模塊,測試終了后可以通過rmmod命令卸載驅動模塊
因此在開發驅動的時候如果你只是想為內核編譯第3方的模塊,那末,你不需下載此源碼包。安裝內核頭文件包也許會更合適我們,但是多數情況下,我們可能時需要修改內核源代碼信息的,這就需要我們在宿主機保護1份與目標機上相同的內核信息,否則我們怎樣保證我們編寫的驅動可以在目標機器上運行呢。。。。
linux源碼可以通過以下幾種途徑取得:
①直接去www.kernel.org下載
②通過包管理工具下載源碼,在debian和Ubuntu中可以通過下面這個命令下載,apt-get install linux-source-(版本號) ,下載后的文件在/usr/src目錄中,解壓到該目錄便可
注意:
如果您只是為了簡單的學習下驅動的開發,而不期望深層次的探究Linux內核的機制,那末您完全可以跳過此步驟,單使用頭文件您是完全可以進行簡單的第3方驅動開發的。
安裝編譯內核所需要的軟件build-essential、autoconf、automake、cvs、subversion
sudo apt-get install build-essential kernel-package libncurses5-dev
注意:libncurses5這個軟件包在使用menuconfig配置內核的時候會用到。
ls1下/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
這樣我們就已獲得到了1份完全的源碼包,
構建的之前,最好先
yum update
把內核升級到最新版本。至于具體安裝哪1份源碼樹,要看你用的哪種內核,用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
按原來的kernel配置,配置kernel.
sudo make oldconfig
make(相當耗時),開始編譯內核
sudo make
編譯內核鏡像
sudo make bzImage
安裝內核模塊
make modules_install
履行結束以后,會在/lib/modules下生成新的目錄/lib/modules/3.13.0⑷8-generic/, 下面的build文件就是編譯模塊的要用到的文件。至此內核編譯完成。
我們為不同的目標機配置不同的內核模塊,這樣1段時間后,我們的系統中會有多分內核信息,再加上我們的系統由于自動升級,系統里也會安裝了很多內核。這樣始終用不到的舊內核或無用內核有必要清算1下,以節省啟動時間和硬盤空間。
然后通過查看本機上所有內核的列表來決定哪些需要刪除掉:
運行命令:
dpkg --get-selections|grep linux
例如我本機顯示為:
注意:
不要刪除當前使用的版本.后面的install表示已安裝,deinstall表示曾安裝過,現在已被刪除(已不占空間).
首先可查看當前用的內核是哪一個,可通過命令:uname -a 來取得信息。
其中帶有image的就是內核文件,因此可看出我的機器上共5個內核鏡像版本。但是其實只安裝了2個鏡像,這個卸載的時候我們就會發現,我當前使用的是3.13.0⑷9,所以決定將其它沒用的內核刪除。
刪除內核鏡像的命令
刪除的命令為:sudo apt-get remove linux-image-XXXX
例如我要卸載3.13.0⑷8的舊內核鏡像,那末運行命令
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⑶.13.0⑷8-generic也會隨著被卸載,
這時候候我們ls /lib/modules/3.13.0⑷8-generic/會發現,安裝的內核鏡像文件已沒有了
卸載內核頭文件
sudo apt-get purge linux-headers-3.13.0-48
或
sudo apt-get remove linux-headers-3.13.0-48
這條命令會自動把linux-headers⑶.13.0⑷8-generic刪除,如果未刪除我們一樣可使用命令刪除便可。
最后再次運行命令,查看安裝的內核文件,查看是不是卸載成功
dpkg --get-selections|grep linux
最后最好刷新1個啟動菜單
sudo update-grub