[wanglj@localhost testQT]$ make
g++ -o testQT main.o -L/opt/Qt5.1.1/5.1.1/gcc_64/lib -lqt-mt -lXext -lX11 -lm
main.o: In function `main':
/home/wanglj/testQT/main.cpp:6: undefined reference to `QApplication::QApplication(int&, char**, int)'
main.o: In function `QString':
/usr/include/QtCore/qstring.h:413: undefined reference to `QString::fromAscii_helper(char const*, int)'
main.o: In function `main':
/home/wanglj/testQT/main.cpp:7: undefined reference to `QLabel::QLabel(QString const&, QWidget*, QFlags<Qt::WindowType>)'
main.o: In function `~QString':
/usr/include/QtCore/qstring.h:869: undefined reference to `QString::free(QString::Data*)'
/usr/include/QtCore/qstring.h:869: undefined reference to `QString::free(QString::Data*)'
collect2: ld 返回 1
make: *** [testQT] 錯誤 1
但若直接用 qtcreator 打開編譯,則無錯誤
並且find -name libqt-mt* 也找不到其他版本的該文件
用qtcreator編譯好的可執行文件,也找不到連接該lib文件
[wanglj@localhost build-testQT-桌面-Debug]$ ldd testQT
linux-vdso.so.1 => (0x00007fff4ddff000)
libQtGui.so.4 => /usr/lib64/libQtGui.so.4 (0x000000397f000000)
libQtCore.so.4 => /usr/lib64/libQtCore.so.4 (0x000000397ea00000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003978600000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fda6a081000)
libm.so.6 => /lib64/libm.so.6 (0x0000003977a00000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003983a00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003977e00000)
libgthread-2.0.so.0 => /lib64/libgthread-2.0.so.0 (0x000000397a600000)
librt.so.1 => /lib64/librt.so.1 (0x0000003978e00000)
libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x0000003979200000)
libpng12.so.0 => /usr/lib64/libpng12.so.0 (0x000000397be00000)
libz.so.1 => /lib64/libz.so.1 (0x0000003978a00000)
libfreetype.so.6 => /usr/lib64/libfreetype.so.6 (0x000000397ba00000)
libgobject-2.0.so.0 => /lib64/libgobject-2.0.so.0 (0x0000003979e00000)
libSM.so.6 => /usr/lib64/libSM.so.6 (0x0000003985a00000)
libICE.so.6 => /usr/lib64/libICE.so.6 (0x0000003984e00000)
libXi.so.6 => /usr/lib64/libXi.so.6 (0x000000397ce00000)
libXrender.so.1 => /usr/lib64/libXrender.so.1 (0x000000397d600000)
libXrandr.so.2 => /usr/lib64/libXrandr.so.2 (0x000000397de00000)
libXfixes.so.3 => /usr/lib64/libXfixes.so.3 (0x000000397da00000)
libXcursor.so.1 => /usr/lib64/libXcursor.so.1 (0x000000397e200000)
libXinerama.so.1 => /usr/lib64/libXinerama.so.1 (0x000000397e600000)
libfontconfig.so.1 => /usr/lib64/libfontconfig.so.1 (0x000000397d200000)
libXext.so.6 => /usr/lib64/libXext.so.6 (0x000000397c600000)
libX11.so.6 => /usr/lib64/libX11.so.6 (0x000000397b600000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003978200000)
/lib64/ld-linux-x86-64.so.2 (0x0000003977600000)
libuuid.so.1 => /lib64/libuuid.so.1 (0x0000003983600000)
libexpat.so.1 => /lib64/libexpat.so.1 (0x000000397c200000)
libxcb.so.1 => /usr/lib64/libxcb.so.1 (0x000000397ae00000)
libXau.so.6 => /usr/lib64/libXau.so.6 (0x000000397aa00000)
------解決方案--------------------
INCPATH = -I/usr/lib64/qt-3.3/mkspecs/default -I. -I. -I$(QTDIR)/include
這一行看上去你調用的qmake不是5.1.1的。試試指定完整路徑運行qmake
/opt/Qt5.1.1/5.1.1/gcc_64/bin/qmake testQT.pro
② 怎麼查看linux下的模塊,很多命令的介紹
1、lsmod 列加以掛載的內核模塊;
lsmod 是列出目前系統中已載入的模塊的名稱及大小等;另外我們還可以查看 /proc/moles ,我們一樣可以知道系統已經載入的模塊;
代碼:
[root@localhost beinan]# lsmod
2、modinfo 查看模塊信息;
modinfo 可以查看模塊的信息,通過查看模塊信息來判定這個模塊的用途;
代碼:
[root@localhost beinan]# moinfo 模塊名
舉例:
代碼:
[root@localhost beinan]# modinfo ne2k-pcifilename: /lib/moles/2.6.11-1.1369_FC4/kernel/drivers/net/ne2k-pci.koauthor: Donald Becker / Paul Gortmakerdescription: PCI NE2000 clone driverlicense: GPLparmtype: debug:intparmtype: options:array of intparmtype: full_plex:array of intparm: debug:debug level (1-2)parm: options:Bit 5: full plexparm: full_plex:full plex setting(s) (1)vermagic: 2.6.11-1.1369_FC4 686 REGPARM 4KSTACKS gcc-4.0depends: 8390alias: pci:v000010ECd00008029sv*sd*bc*sc*i*alias: pci:v00001050d00000940sv*sd*bc*sc*i*alias: pci:v000011F6d00001401sv*sd*bc*sc*i*alias: pci:v00008E2Ed00003000sv*sd*bc*sc*i*alias: pci:v00004A14d00005000sv*sd*bc*sc*i*alias: pci:v00001106d00000926sv*sd*bc*sc*i*alias: pci:v000010BDd00000E34sv*sd*bc*sc*i*alias: pci:v00001050d00005A5Asv*sd*bc*sc*i*alias: pci:v000012C3d00000058sv*sd*bc*sc*i*alias: pci:v000012C3d00005598sv*sd*bc*sc*i*alias: pci:v00008C4Ad00001980sv*sd*bc*sc*i*srcversion: 6ACE95F441CD26DF9DC31C2
上 面的例子是我們查看 ne2k-pci 這個模塊的信息,通過查看,我們知道ne2k-pci 模塊是8029網卡(PCI NE2000 clone driver)的驅動;模塊是位於 /lib/moles/2.6.11-1.1369_FC4/kernel/drivers/net/ 中ne2k-pci.ko
我們現在常用的網卡也有8139的,8139網卡所用的驅動是 8139too ;查查看?
代碼:
[root@localhost beinan]# modinfo 8139too
我們再查查vfat 和ntfs 的模塊信息;
代碼:
[root@localhost beinan]# modinfo vfat[root@localhost beinan]# modinfo ntfs
自己嘗試一下;
注意: 模塊名是不能帶有後綴的,我們通過modprobe -l 所看到的模塊,都是帶有.ko 或.o後綴;
3、modprobe 掛載新模塊以及新模塊相依賴的模塊
modprobe 我們常用的功能就是掛載模塊,在掛載某個內核模塊的同時,這個模塊所依賴的模塊也被同時掛載;當然modprobe 也有列出內核所有模塊,還有移除模塊的功能;下在我們舉個例子說一說咱們常用的功能和參數;
代碼:
modprobe [-v] [-V] [-C config-file] [-n] [-i] [-q] [-o ] [parameters...]
modprobe -r [-n] [-i] [-v] ...
modprobe -l -t [ -a ...]
上面是modprobe 的用法,具體更為詳細的幫助,我們可以查看 man modprobe ;
代碼:
[root@localhost beinan]# modprobe -c
modprobe -c 可以查看moles 的配置文件,比如模塊的別名是什麼等;
代碼:
[root@localhost beinan]# modprobe -l
modprobe -l 是列出內核中所有的模塊,包括已掛載和未掛載的;通過modprobe -l ,我們能查看到我們所需要的模塊,然後根據我們的需要來掛載;其實modprobe -l 讀取的模塊列表就位於 /lib/moles/'uname -r' 目錄中;其中uname -r 是內核的版本;
代碼:
[root@localhost beinan]# uname -r2.6.11-1.1369_FC4[root@localhost beinan]# ls /lib/moles/2.6.11-1.1369_FC4/
通過上面的命令,自己試試看?
代碼:
[root@localhost beinan]# modprobe 模塊名 註:掛載一個模塊;
舉例:
代碼:
[root@localhost beinan]# modprobe ne2k-pci 註:掛載 ne2k-pci 模塊;[root@localhost beinan]# modprobe vfat 註:掛載vfat 模塊[root@localhost beinan]# modprobe ntfs 註:掛載ntfs 模塊[root@localhost beinan]# lsmod 註:列出已掛載模塊, 我們會看到ne2k-pci ,vfat ,ntfs的模塊 ;
注意: 模塊名是不能帶有後綴的,我們通過modprobe -l 所看到的模塊,都是帶有.ko 或.o後綴;
代碼:
[root@localhost beinan]# modprobe -r 模塊名 註:移除已載入的模塊,和rmmod 功能相同;
注意:模塊名是不能帶有後綴的,我們通過modprobe -l 所看到的模塊,都是帶有.ko 或.o後綴;
代碼:
[root@localhost beinan]# modprobe -r 模塊名
舉例:
代碼:
[root@localhost beinan]# modprobe -r ne2k-pci
就說這么多吧,更為詳細的還是用 man modprobe 來查看和嘗試;
4、rmmod 移除已掛載模塊;
命令格式:
代碼:
rmmod 模塊名
注意: 模塊名是不能帶有後綴的,我們通過modprobe -l 所看到的模塊,都是帶有.ko 或.o後綴;
舉例:
代碼:
[root@localhost beinan]# rmmod vfat 註:移除已掛載的模塊vfat
5、depmod 創建模塊依賴關系的列表
這 個模塊管理工具是創建模塊依賴關系的列表,有幾個參數我們注意一下就行了,目前的的Linux 發行版所用的內核是2.6x版本,是自動解決依賴關系,所以這個命令知道就行了;模塊之前也有依賴關系,比如我們想驅動USB 移動硬碟,目前有兩種驅動,一種是udev ,在內核中有,但目前不太穩定;另一種辦法是用usb-storage驅動,而usb-storage 依賴的模塊是scsi 模塊,所以我們要用usb-storage 的模塊,也得把scsi 編譯安裝;
再 舉個例子:sata的硬碟,在Linux中的設備表示的是/dev/sd* ,比如 /dev/sda,/dev/sdb 等... 系統要驅動 sata硬碟,則需要把sata在內核中選中,或編譯成模塊,或內置於內核之中,在此同時,還需要在內核中選中ide ,scsi 的支持等;
depmod 工具的洋文原意:depmod — program to generate moles.dep and map files.(我譯的:為moles.dep 文件或映射文件創建依賴關系)
代碼:
[root@localhost beinan]# depmod -a 註:為所有列在/etc/modprobe.conf 或/etc/moles.conf 中的所有模塊創建依賴關系,並且寫入到moles.dep文件;[root@localhost beinan]# depmod -e 註:列出已掛載但不可用的模塊;[root@localhost beinan]# depmod -n 註:列出所有模塊的依賴關系,但僅僅是輸出出來 (Write the dependency file on stdout only)
註:moles.dep 位於 /lib/moles/內核版本 目錄
比如 Fedora Core 4.0 中,系統默認的內核:
代碼:
[root@localhost beinan]# ls /lib/moles/2.6.11-1.1369_FC4/moles.dep/lib/moles/2.6.11-1.1369_FC4/moles.dep
6、insmod 掛載模塊;
insmod 這個工具,和modprobe 有點類似,但功能上沒有modprobe 強,modprobe 在掛載模塊是不用指定模塊文件的路徑,也不用帶文件的後綴.o 或.ko ;而insmod 需要的是模塊的所在目錄的絕對路徑,並且一定要帶有模塊文件名後綴的(molefile.o 或molesfile.ko );
對於這個工具,我們只是介紹一下, 並不推薦使用。因為模塊有依賴關系,對於新手來說,可能不知道這個模塊依賴和哪個模塊依賴;
舉例:
代碼:
[root@localhost beinan]# insmod /lib/moles/2.6.11-1.1369_FC4/kernel/drivers/net/tg3.ko
我們要到 /lib/moles/內核版本 uname -r 的命令輸出/kernel/drivers 中找相對應的模塊才行,要有絕對路徑,而且必須要用到文件名的全稱,不能把文件名的後綴省略;
四、與內核模塊載入相關的配置文件;
1、模塊的配置文件 moles.conf 或 modprobe.conf
內 核模塊的開機自動掛載模塊一般是位於一個配置文件,一般的Linux發行版本都有 /etc/moles.conf 或 /etc/modprobe.conf 。比如Fedora Core 4.0 內核模塊開機自動載入文件是 /etc/modprobe.conf ;在這個文件中,一般是寫入模塊的載入命令或模塊的別名的定義等;比如我們在moles.conf 中可能會發行類似的一行 ;
代碼:
alias eth0 8139too
而8029的網卡應該是
代碼:
alias eth0 ne2k-pci
這樣系統啟動的時候,首先會modprobe 8139too ,然後再為8139too 指定別名為 eth0,然後我們在登錄的時候,用 ifconfig 就會查看到網卡的IP 等情況,當然您得為網卡設置IP 才行;
一 般的情況下,modproe.conf 或moles.conf的內容 是我們用相應的硬體配置工具而生成的;如果您的硬體驅動是沒有被內核支持,您自己到硬體的廠商下載而來的驅動。一般的情況下都有安裝和幫助文件。他們的驅 動在配置時,他會寫入硬體的支持到moles.conf 或modprobe.conf 文件中。
再比如我們的音效卡在moles.conf 或modprobe.conf 中也有相應的內容,這是由alsaconf 配置工具生成的,明白了吧;同理網卡在modprobe.conf 或moles.conf中的內容也是由網卡的配置工具而來的。
有些硬體是以內核模塊的方式驅動的,模塊一旦載入上就能用,也沒有什麼配置工具,比如vfat 和ntfs 的支持;如果是硬體驅動不以模塊的方式支持,而是直接編入內核,也不會用在modprobe.conf 或 moles.conf 中加入什麼內容;
如果您有些模塊不能開機載入,您想讓一些模塊加機自動載入,就可以把modprobe 模塊 直接寫入配置文件;
2、內核模塊其它配置文件
內核模塊的其它配置文件還是需要了解的,比如 /lib/moles/內核版本目錄下的幾個文件;了解一下就行;比如:
代碼:
[root@localhost beinan]# uname -r2.6.11-1.1369_FC4[root@localhost beinan]# ls /lib/moles/2.6.11-1.1369_FC4/build misc moles.ccwmap moles.ieee1394map moles.isapnpmap moles.symbols sourcekernel moles.alias moles.dep moles.inputmap moles.pcimap moles.usbmap
五、硬體驅動在系統中的目錄;
硬體驅動在內核中以模塊支持的目錄;
硬 件驅動是必須由內核支持的,無論是我們自己安裝驅動,還是內核自帶的驅動都是如此。硬體驅動如果是以內核模塊支持的,驅動目錄位於: /lib/moles/內核版本/kernel/目錄 或 /lib/moles/內核版本/kernel/drivers 目錄中;
代碼:
[root@localhost beinan]# uname -r2.6.11-1.1369_FC4[root@localhost beinan]# ls /lib/moles/2.6.11-1.1369_FC4/kernelarch crypto drivers fs lib net sound
註:只有驅動在內核中以模塊的方法支持,驅動才位於 /lib/moles/相應的目錄;如果是直接置入內核的,不會出現在/lib/moles驅動相關的目錄;
六、自己編譯驅動的辦法;
通 過源碼編譯驅動一般是./configure ;make;make install ,有時程序不提供./configure ,我們可以make或make install ,或者執行make;make install ;如果不能make install ,則需要我們自己復制.o或者.ko文件到 /lib/moles/內核版本/kernel/目錄 或 /lib/moles/內核版本/kernel/drivers 目錄中相應的驅動目錄;
這個還是自己嘗試吧,說也說不清楚,遇到問題後就知道怎麼弄了;具體的還是驅動的REAME和INSTALL為准;
現在大多驅動都是在編譯安裝時,都自動復制.o或.ko 文件到內核模塊目錄,大多不用我們自己動手復制過去。如果您嘗試編譯安裝音效卡驅動 alsa-drivers 就會明白我所說的意思。
③ linux操作系統中,載入和刪除內核模塊的命令是什麼
modprobe命令x0dx0aLinux命令:modprobe 。x0dx0a功能說明:自動處理可載入模塊。x0dx0a語法:modprobe [-acdlrtvV][--help][模塊文件][符號名稱 = 符號值]。x0dx0a補充說明:modprobe可載入指定的個別模塊,或是載入一組相依的模塊。modprobe會根據depmod所產生的相依關系,決定要載入哪些模塊。若在載入過程中發生錯誤,在modprobe會卸載整組的模塊。x0dx0ax0dx0a內容x0dx0a1、modprobe 命令是根據depmod -a的輸出/lib/moles/version/moles.dep來載入全部的所需要模塊。x0dx0a2、刪除模塊的命令是:modprobe -r filename。x0dx0a3、系統啟動後,正常工作的模塊都在/proc/moles文件中列出。使用lsmod命令也可顯示相同內容。x0dx0a4、在內核中有一個「Automatic kernel mole loading"功能被編譯到了內核中。當用戶嘗試打開某類型的文件時,內核會根據需要嘗試載入相應的模塊。/etc/moles.conf或 /etc/modprobe.conf文件是一個自動處理內核模塊的控制文件。x0dx0amodprobe命令主要用於在Linux 2.6內核中載入和刪除Linux內核模塊。通過此命令用戶可以輕松地載入和刪除Linux內核模塊,同時使用此命令載入Linux內核模塊時,Linux內核會自動解決內核模塊之間的依賴關系,將相互依賴的模塊自動載入,如下所示:x0dx0a1) 載入RAID1陣列級別模塊:x0dx0a[root@rhel5 boot]# modprobe raid1 x0dx0ax0dx0a2) 顯示已載入的RAID1陣列級別模塊:x0dx0a[root@rhel5 boot]# lsmod |grep raid1 raid1 25153 0 x0dx0ax0dx0a3) 刪除RAID1陣列級別模塊:x0dx0a[root@rhel5 boot]# modprobe -r raid1 x0dx0ax0dx0a4) 顯示RAID1陣列級別模塊:x0dx0a[root@rhel5 boot]# lsmod |grep raid1 x0dx0ax0dx0amodprobe命令在載入模塊時會自動解決依賴的模塊。當載入的模塊需依賴另一個模塊時,系統會自動將此模塊載入。而當用戶使用insmod命令載入模塊時,則不會自動解決相對應的依賴模塊。x0dx0amodprobe命令中的"-r"參數表示刪除指定模塊,"-c"參數表示顯示/etc/modprobe.conf配置文件的參數,"-C"參數表示指定內核配置文件,"-f"表示覆蓋,"-l"表示顯示模塊的絕對路徑。x0dx0a[root@rhel5 boot]# modprobe -l|grep raid /lib/moles/2.6.18-8.el5/kernel/drivers/md/raid0.ko /lib/moles/2.6.18-8.el5/kernel/drivers/md/raid456.ko /lib/moles/2.6.18-8.el5/kernel/drivers/md/raid1.ko /lib/moles/2.6.18-8.el5/kernel/drivers/md/raid10.ko /lib/moles/2.6.18-8.el5/kernel/drivers/scsi/megaraid.ko /lib/moles/2.6.18-8.el5/kernel/drivers/scsi/aacraid/aacraid.ko /lib/moles/2.6.18-8.el5/kernel/drivers/scsi/megaraid/megaraid_mbox.ko /lib/moles/2.6.18-8.el5/kernel/drivers/scsi/megaraid/megaraid_mm.ko /lib/moles/2.6.18-8.el5/kernel/drivers/scsi/megaraid/megaraid_sas.ko /lib/moles/2.6.18-8.el5/kernel/drivers/scsi/raid_class.ko x0dx0ax0dx0a以上命令表示顯示系統中所有的編譯模塊,並過濾包含有raid字元串的模塊。
④ linux內核模塊怎麼調用
在編寫linux內核模塊的時候,有時候我們需要調用一隻內核模塊裡面的函數,然而如果是在不同目錄下面編譯生成的內核模塊,此時A模塊去調用B模塊的函數時候會出現函數未定義,無法調用的情況。那麼以前我是在同一個目錄下面,先後寫兩個makefile,然後編譯生成兩個不同的內核模塊,這種方式可以正常實現A模塊調用B模塊裡面的函數,不過非常麻煩。本博文將會針對這種情況提出一種可以同時生成多個內核模塊,不要再次編譯的方面,下面貼出源碼:
內核模塊cal.ko:
#include <linux/mole.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
int add(int a, int b) {
return a+b;
}
int sub(int a, int b) {
return a-b;
}
static int sym_init() {
return 0;
}
static int sym_exit() {
return 0;
}
mole_init(sym_init);
mole_exit(sym_exit);
EXPORT_SYMBOL(add);
EXPORT_SYMBOL(sub);
內核模塊hello.ko
#include <linux/mole.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("David Xie");
MODULE_DESCRIPTION("Hello World Mole");
MODULE_ALIAS("a simplest mole");
static int age = 10;
mole_param(age, int, S_IRUGO);//allow all user to use this param
int add(int a, int b);
int sub(int a, int b);
static int hello_init(void)
{
printk("<0>"" Hello World! age = %d\n", add(10, 20));//調用內核模塊cal.ko裡面的add函數
return 0;
}
static void hello_exit(void)
{
printk("<0>""hello exit %d\n", sub(30,10));//調用內核模塊cal.ko裡面的sub函數
}
mole_init(hello_init);
mole_exit(hello_exit);
可以生成多個內核模塊的makefile
ifneq ($(KERNELRELEASE),)
obj-m := cal.o hello.o
cal-objs := operator.o
hello-objs := main.o
else
KDIR := /lib/moles/2.6.32-21-generic/build
all:
make -C $(KDIR) M=$(PWD) moles
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order
endif
此時在當前目錄執行make就會產生cal.ko和hello.ko兩個內核模塊
⑤ 請問Linux內核編譯為模塊的功能怎樣使用
編譯後的模塊放在/lib/moles/對應的內核版本號/kernel目錄下,要想使用可以insmod moleName
或在/etc/moles.conf或/etc/modprobe.conf文件中添加相應信息
編譯後的模塊在/lib/moles下,不是源代碼的目錄下,樓主是編譯的當前內核,不是編譯的新內核?
⑥ linux安裝內核模塊之後為什麼沒有生成/lib/moles/目錄
我猜你是在ls你當前編譯的源代碼中的lib,而其實make moles_install之後默認是將編譯好的內核模塊到你當前系統根目錄下的lib/moles/$version下,這里的$version代表以你剛編譯的內核模塊版本為名的一個文件夾。
⑦ 如何通過linux源碼樹製作linux kernel headers用於內核模塊開發
先查看自己OS使用的內核版本
shana@shana:~$ uname -r
2.6.22-14-generic
如果安裝系統時,自動安裝了源碼。在 /usr/src 目錄下有對應的使用的版本目錄。例如下(我是自己下的)
shana@shana:/usr/src$ ls
linux-headers-2.6.22-14
linux-headers-2.6.22-14-generic
linux-source-2.6.22
linux-source-2.6.22.tar.bz2
shana@shana:/usr/src$
如果沒有源碼。(一般ubuntu 都沒有吧)
查看一下可一下載的源碼包(切記不要使用超級用戶使用此命令否則……會提示沒有此命令)
shana@shana:/usr/src$ apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
xen-source-2.6.16 - Linux kernel source for version 2.6.17 with Ubuntu patches
linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches
shana@shana:/usr/src$
我選擇了 linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches 這個~
然後 install 之
shana@shana:/usr/src$ sudo apt-get install linux-source-2.6.22
下載完成後,在/usr/src下,文件名為:linux-source-2.6.22.tar.bz2,是一個壓縮包,解壓縮既可以得到整個內核的源代碼:
注意 已經切換到超級用戶模式
root@shana:/usr/src#tar jxvf linux-source-2.6.20.tar.bz2
解壓後生成一個新的目錄/usr/src/linux-source-2.6.22,所有的源代碼都在該目錄下。
進入該目錄
開始配置內核 選擇最快的原版的配置(默認)方式 (我是如此)
root@shana:/usr/src/linux-source-2.6.22# make oldconfig
當然你也可以使用 自己喜歡的配置方式 如 menuconfig , xconfig(必須有GTK環境吧)。反正不用剪裁什麼,所以不管那種方式能配置它就行了。
完成後,開始make 吧 這兒比較久 一般有1一個小時吧。(保證空間足夠 我編譯完成後 使用了1.8G) 我分區時分給/目錄30G的空間,我沒遇到這問題。倒是我朋友遇到了。
shana@shana:/usr/src/linux-source-2.6.22$ make
shana@shana:/usr/src/linux-source-2.6.22$ make bzImage
當然,第一個make也可以不執行,直接make bzImage。執行結束後,可以看到在當前目錄下生成了一個新的文件: vmlinux, 其屬性為-rwxr-xr-x。
然後 :
root@shana:/usr/src/linux-source-2.6.22#make moles
root@shana:/usr/src/linux-source-2.6.22#make moles_install
執行結束之後,會在/lib/moles下生成新的目錄/lib/moles/2.6.22-14-generic/
。 在隨後的編譯模塊文件時,要用到這個路徑下的build目錄。至此,內核編譯完成。可以重啟一下系統。
至此 內核樹就建立啦
⑧ linux 怎樣插入一個驅動模塊
insmod
不過最好是 modprobe 這個命令會檢測模塊之間的功能依賴關系一同載入。不過需要在 /lib/moles 裡面有模塊的信息(這個信息怎麼寫怎麼生成我不清楚)。
⑨ linux所有驅動都可以編譯成模塊嗎
linux下編譯運行驅動
嵌入式linux下設備驅動的運行和linux x86 pc下運行設備驅動是類似的,由於手頭沒有嵌入式linux設備,先在vmware上的linux上學習驅動開發。
按照如下方法就可以成功編譯出hello world模塊驅動。
1、首先確定本機linux版本
怎麼查看Linux的內核kernel版本?
'uname'是Linux/unix系統中用來查看系統信息的命令,適用於所有Linux發行版。配合使用'uname'參數可以查看當前伺服器內核運行的各個狀態。
#uname -a
Linux whh 3.5.0-19-generic #30-Ubuntu SMPTue Nov 13 17:49:53 UTC 2012 i686 i686 i686 GNU/Linux
只列印內核版本,以及主要和次要版本:
#uname -r
3.5.0-19-generic
要列印系統的體系架構類型,即的機器是32位還是64位,使用:
#uname -p
i686
/proc/version 文件也包含系統內核信息:
# cat /proc/version
Linux version 3.5.0-19-generic(buildd@aatxe) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) ) #30-UbuntuSMP Tue Nov 13 17:49:53 UTC 2012
發現自己的機器linux版本是:3.5.0-19-generic
2、下載機器內核對應linux源碼
到下面網站可以下載各個版本linux源碼https://www.kernel.org/
如我的機器3.5.0版本源碼下載地址為:https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.5.tar.bz2
下載完後,找一個路徑解壓,如我解壓到/linux-3.5/
然後很重要的一步是:執行命令uname -r,可以看到Ubuntu的版本信息是3.5.0-19-generic
。進入linux源碼目錄,編輯Makefile,將EXTRAVERSION = 修改為EXTRAVERSION= -19-generic。
這些都是要配置源碼的版本號與系統版本號,如果源碼版本號和系統版本號不一致,在載入模塊的時候會出現如下錯誤:insmod: error inserting 'hello.ko': -1 Invalid mole format。
原因很明確:編譯時用的hello.ko的kenerl 不是我的pc的kenerl版本。
執行命令cp /boot/config-3.5.0-19-generic ./config,覆蓋原有配置文件。
進入linux源碼目錄,執行make menuconfig配置內核,執行make編譯內核。
3、寫一個最簡單的linux驅動代碼hello.c
/*======================================================================
Asimple kernel mole: "hello world"
======================================================================*/
#include <linux/init.h>
#include <linux/mole.h>
MODULE_LICENSE("zeroboundaryBSD/GPL");
static int hello_init(void)
{
printk(KERN_INFO"Hello World enter\n");
return0;
}
static void hello_exit(void)
{
printk(KERN_INFO"Hello World exit\n ");
}
mole_init(hello_init);
mole_exit(hello_exit);
MODULE_AUTHOR("zeroboundary");
MODULE_DESCRIPTION("A simple HelloWorld Mole");
MODULE_ALIAS("a simplestmole");
4、寫一個Makefile對源碼進行編譯
KERN_DIR = /linux-3.5
all:
make-C $(KERN_DIR) M=`pwd` moles
clean:
make-C $(KERN_DIR) M=`pwd` clean
obj-m += hello.o
5、模塊載入卸載測試
insmod hello.ko
rmmod hello.ko
然後dmesg|tail就可以看見結果了
最後,再次編譯驅動程序hello.c得到hello.ko。執行insmod ./hello.ko,即可正確insert模塊。
使用insmod hello.ko 將該Mole加入內核中。在這里需要注意的是要用 su 命令切換到root用戶,否則會顯示如下的錯誤:insmod: error inserting 'hello.ko': -1 Operation not permitted
內核模塊版本信息的命令為modinfo hello.ko
通過lsmod命令可以查看驅動是否成功載入到內核中
通過insmod命令載入剛編譯成功的time.ko模塊後,似乎系統沒有反應,也沒看到列印信息。而事實上,內核模塊的列印信息一般不會列印在終端上。驅動的列印都在內核日誌中,我們可以使用dmesg命令查看內核日誌信息。dmesg|tail
可能還會遇到這種問題insmod: error inserting 'hello.ko': -1 Invalid mole format
用dmesg|tail查看內核日誌詳細錯誤
disagrees about version of symbolmole_layout,詳細看這里。
http://www.ibm.com/developerworks/cn/linux/l-cn-kernelmoles/index.html
在X86上我的辦法是:
make -C/usr/src/linux-headers-3.5.0-19-generic SUBDIRS=$PWD moles
⑩ Linux中怎樣安裝和刪除一個已編譯生成的字元設備驅動模塊文件
比如你生成 XXX.ko
插入這個模塊是 sudo insmod XXX.ko
刪除是 sudo rmmod XXX.ko
同時,可以通過 lsmod 查看系統內核中已有模塊