Ubuntu下的Linux内核的编译及安装
推薦群:C/C++大學技術協會:145655849
Linux中的模塊(Modules)
Linux的module其實可以看作是內核的插件。
在Linux系統中,可以通過文件
cat /proc/modules
xxxxxxxxxx1 1cat /proc/modules
查看相關的驅動模塊。
也可以通過命令
lsmod
xxxxxxxxxx1 1lsmod
查看,lsmod只是將/proc/modules中的內容做了格式化排版。
設備驅動是模塊的一種,它用于為系統上層提供針對硬件的操作。除硬件設備的驅動外,內核模塊也是內核擴展功能的一種方式,即有些模塊并沒有對應的硬件,而是純軟件的運行在0環的代碼,如內核級的防火墻(網絡模塊)。
使用命令
insmod
xxxxxxxxxx1 1insmod
或者
modprobe
xxxxxxxxxx1 1modprobe
可以在內核中插入模塊。兩者的區別在于,modprobe的功能更強,并且會自動解決依賴問題。
編譯及啟用Linux內核
隨系統發行的Linux內核的頭文件(在/usr/src下),不一定與當前系統的內核二進制文件一致,甚至有可能不全。
所以在做內核開發前,最好些自己重編譯、安裝一份內核。
參考 https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel
獲取源碼
通過以下命令下載源碼
apt-get source linux-image-(uname?r)xxxxxxxxxx11apt?getsourcelinux?image?(uname -r) xxxxxxxxxx1 1apt-get source linux-image-(uname?r)xxxxxxxxxx11apt?getsourcelinux?image?(uname -r)
設置編譯依賴
通過以下命令,將build的依賴環境,配置(下載)為與將要編譯的內核一致:
sudo apt-get build-dep linux-image-(uname?r)xxxxxxxxxx11sudoapt?getbuild?deplinux?image?(uname -r) xxxxxxxxxx1 1sudo apt-get build-dep linux-image-(uname?r)xxxxxxxxxx11sudoapt?getbuild?deplinux?image?(uname -r)
編譯內核
進入源碼根目錄下,執行
fakeroot debian/rules clean
quicker build:
fakeroot debian/rules binary-headers binary-generic binary-perarch
if you need linux-tools or lowlatency kernel, run instead:
fakeroot debian/rules binary
xxxxxxxxxx5 1fakeroot debian/rules clean2# quicker build:3fakeroot debian/rules binary-headers binary-generic binary-perarch4# if you need linux-tools or lowlatency kernel, run instead:5fakeroot debian/rules binary
將在上層目錄下,得到幾個deb文件:
cd …
ls *.deb
linux-headers-4.8.0-17_4.8.0-17.19_all.deb
linux-headers-4.8.0-17-generic_4.8.0-17.19_amd64.deb
linux-image-4.8.0-17-generic_4.8.0-17.19_amd64.deb
xxxxxxxxxx5 1cd …2ls *.deb3 linux-headers-4.8.0-17_4.8.0-17.19_all.deb4 linux-headers-4.8.0-17-generic_4.8.0-17.19_amd64.deb5 linux-image-4.8.0-17-generic_4.8.0-17.19_amd64.deb
安裝測試新內核
sudo dpkg -i linux4.8.0-17.19.deb
sudo reboot
xxxxxxxxxx2 1sudo dpkg -i linux4.8.0-17.19.deb2sudo reboot
設置編譯時產生調試符號信息
sudo apt-get install pkg-config-dbgsym
fakeroot debian/rules clean
fakeroot debian/rules binary-headers binary-generic binary-perarch skipdbg=false
xxxxxxxxxx3 1sudo apt-get install pkg-config-dbgsym2fakeroot debian/rules clean3fakeroot debian/rules binary-headers binary-generic binary-perarch skipdbg=false
使用Make系統手工編譯內核及加入模塊
以上的方法是Ubuntu的apt-get系統提供的,可以方便地獲取源碼、編譯及安裝。
但是對于理解內核編譯過程,自己加入驅動模塊的用處不大。
將自己的驅動模塊加入源碼目錄中
將自己的源碼文件(hello.c)放入到內核源碼的./drivers/char目錄下,我的測試文件的內容為:
/*
- $Id: hello.c,v 1.5 2004/10/26 03:32:21 corbet Exp $
*/
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE(“Dual BSD/GPL”);
static int hello_init(void)
{
printk(KERN_ALERT “Hello, world\n”);
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT “Goodbye, cruel world\n”);
}
module_init(hello_init);
module_exit(hello_exit);
?x 1/* 2 * $Id: hello.c,v 1.5 2004/10/26 03:32:21 corbet Exp $ 3 */ 4#include <linux/init.h>5#include <linux/module.h>6MODULE_LICENSE(“Dual BSD/GPL”);7?8static int hello_init(void)9{10 printk(KERN_ALERT “Hello, world\n”);11 return 0;12}13?14static void hello_exit(void)15{16 printk(KERN_ALERT “Goodbye, cruel world\n”);17}18?19module_init(hello_init);20module_exit(hello_exit);
編輯Kconfig文件以及Makefile文件
因為我們要使用可視化的
make menuconfig
xxxxxxxxxx1 1make menuconfig
工具來定義內核的編譯選項,這需要用到開源的命令行圖行庫libcurses,可以先安裝:
sudo apt-get install libncurses5-dev libncursesw5-dev
xxxxxxxxxx1 1sudo apt-get install libncurses5-dev libncursesw5-dev
接著,通過編輯Kconfig文件,來設置菜單內容(curses通過讀取Kconfig來展示菜單)
打開./driver/char目錄下的Kcofnig文件(Kconfig的語法可以參考內核源碼目錄下的Documentation/kbuild/kconfig-language.txt)。
找到類似以下內容:
config BFIN_OTP
tristate “Blackfin On-Chip OTP Memory Support”
…
help
If you say Y here, you will get support for a character device
…
If unsure, it is safe to say Y.
xxxxxxxxxx7 1config BFIN_OTP2 tristate "Blackfin On-Chip OTP Memory Support"3…4 help5 If you say Y here, you will get support for a character device6 …7 If unsure, it is safe to say Y.
依照它的格式,在其后加入:
config MYMODULE
tristate “A new module just for test!”
default n
help
nothing for usage, left blank
xxxxxxxxxx5 1config MYMODULE2 tristate "A new module just for test!"3 default n4 help5 nothing for usage, left blank
接著,再編輯./driver/char目錄下的Makefile文件,在依照該文件中的其它項,在最后加入內容:
obj-(CONFIGMYMODULE)+=hello.oxxxxxxxxxx11obj?(CONFIG_MYMODULE) += hello.o xxxxxxxxxx1 1obj-(CONFIGM?YMODULE)+=hello.oxxxxxxxxxx11obj?(CONFIG_MYMODULE) += hello.o
其中CONFIG_之后的MYMODULE對應了在Kconfig中的目錄設置,其中的hello.o對應了源碼的文件名(hello.c)。
編譯
此時,回到源碼的根目錄,運行命令
make menuconfig
xxxxxxxxxx1 1make menuconfig
在device drviers -> character drivers下,找到我們新添的MYMODULE項,并通過空格,設置為M狀態,表示以模塊的方式編譯。
在源碼根目錄下運行
make modules
xxxxxxxxxx1 1make modules
若一切順利,在./drivers/char/目錄下,會得到hello.ko,即內核模塊文件。
安裝
使用insmod安裝模塊,使用lsmod查看模塊,使用rmmod刪除模塊,使用dmesg查看內核模塊的輸出信息。
insmod hello.ko
1insmod hello.ko
參考資料,推薦群:C/C++大學技術協會:145655849
The Linux Kernel Module Programming Guide
Linux內核源碼中的:Documentation/kbuild/的幾個txt文檔
總結
以上是生活随笔為你收集整理的Ubuntu下的Linux内核的编译及安装的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html文字转语音代码,【JavaScr
- 下一篇: python中用于标识字符串的定界符_0