幾個概念:
1. 內核源碼樹:
簡單來說就是Linux內核源代碼,它是編譯驅動的前提;ubuntu系統默認情況下是沒有的;需要自己手動去下載內核源碼樹;
2. 驅動最終以*.ko的形式生成,insmod的本質就是將ko文件與運行的內核進行鏈接的過程。類似於編譯helloworld的鏈接過程。
鏈接必然需要先進行編譯,以便確定所需的外部符號(EXPORT_SYMBOLS)是否存在,因爲有些符號(函數或全局變量)在
內核中。在驅動中如果使用到這些符號,必須預留一個位置,insmod時進一步確定這些符號的具體位置(符號綁定)。
如果內核都沒有編譯過,怎麼知道這些符號有沒有編入內核中;
編譯Linux的步驟:
1:首先要查看自己系統是使用的內核版本
>> uname -r
>> ls
其中linux2.6和linux-source-3.2.0是我自己下載的;
2. 如果沒有源碼,查看一下可以下載的源碼包(不要使用超級用戶使用此命令,他會提示沒有這個命令)
>>apt-cache search linux-source
linux-source-3.2.0 - Linux kernel source for version 3.2.0 with Ubuntu patches
然後下載linux-source-3.2.0
#sudo apt-get install linux-source-3.2.0
下載完成之後,會在/usr/src下,文件名爲linux-source-3.2.0.tar.bz2這個壓縮包,解壓之後就可以得到整個源代碼
# sudo tar jxvf linux-source-3.2.0.tar.bz2
解壓之後會生成一個新的目錄/usr/src/linux-source-3.2.0,現在所有的源代碼都在裏面
3:現在開始配置內核,有三種選擇選擇方式1:make oldconfig 2:make menuconfig 3:make xconfig
我選擇的是最快的配置原版的配置方法
#sudo make oldconfig
(如果配置的過程中出現問題,原因是因爲你沒有下載配置環境的那個依賴的庫文件,可以自己下載)
配置完成之後就要開始對內核進行編譯了
在配置時,會出現因爲配置過程中的CONFIG_RTS5139值爲空而出現編譯錯誤,建議配置爲n:
當然,也可以在.config隱藏文件中修改過來;
4:編譯內核
#sudo make
這個過程很漫長,建議去做做別別的事情吧~;大約需要1個小時;
5. #sudo make bzImage
編譯內核的結果最終出現了幾個錯誤,但最終對那個Hello World 沒有造成影響
執行結束之後,會在當前目錄下面生成一個新的文件:vmlinux
5:然後就是編譯模塊了
#sudo make modules
6:安裝模塊
#sudo make modules_install
執行結束之後,會在/lib/modules下生成一個新的目錄/lib/modules/3.2.0/
在隨後的編譯模塊文件時,需要用到這個路徑下的build目錄。到這一步,內核就編譯完成了