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源碼
B. linux insmod內核模塊載入
內核模塊版本不匹配
可以試試強行載入,不一定用的了
沒多大副作用,就是模塊能用、不能用、勉強用但會崩潰的結果
對系統影響不大
之所以是模塊,是有這個用意在裡面的
C. 求詳細的linux內核啟動順序,和各個模塊的載入順序,優先順序等。
1. 載入 BIOS 的硬體信息不迚行自我測試,開依據謳定取得第一個可開機的裝置;
2. 讀取開執行第一個開機裝置內 MBR 的 boot Loader (亦即是 grub, spfdisk 等程序);
3. 依據 boot loader 的謳定載入 Kernel ,Kernel 會開始偵測硬體不載入驅勱程序;
4. 在硬體驅勱成功後,Kernel 會主勱呼叨 init 程序,而 init 會取得 run-level 信息;
5. init 執行 /etc/rc.d/rc.sysinit 檔案來准備軟體執行的作業環境 (如網路、時區等);
6. init 執行 run-level 的各個朋務乊吪勱 (script 方弅);
7. init 執行 /etc/rc.d/rc.local 檔案;
8. init 執行終端機仺真程序 mingetty 來吪勱 login 程序,最後就等待用戶登入啦;
D. linux怎麼添加自己的內核模塊
不同發行版和不同版本的Linux略有不同,以CentOS7為例,需要在/etc/sysconfig/moles/目錄中增加一個腳本,在此腳本中載入所需的模塊。注意該腳本文件的許可權為755。
以uinput模塊為例,腳本如下:
#!/bin/sh
if [ ! -c /dev/input/uinput ] ; then
exec /sbin/modprobe uinput >/dev/null 2>&1
fi
E. Linux怎麼在系統啟動時自動載入內核模塊
寫入/etc/rc.local
F. linux debian 關於模塊載入問題:
debian系統,編譯新的內核模塊的時候,內核裝上headers就行了,不必裝完整源碼。
如果你的內核使用的是 linux-image-amd64,只需要裝上 linux-headers-amd64 這個包。
在不同系統或者不同內核版本編譯出來的模塊不能通用的。
G. linux 怎麼查看內核里載入的模塊
一、找出內置模塊列表
要得到內置模塊列表,運行下面的命令。
$ cat /lib/moles/$(uname -r)/moles.builtin
你也可以用下面的命令來查看有哪些內置模塊:
H. Linux 添加 net 模塊
Linux 添加 net 模塊的方法是:
1、創建c文件和makefile文件:在任意位置創建一個文件夾(我創建的名稱為/drive)mkdir drive後,輸入cd drive進入文件夾。輸入vim hello.c新建hello.c文件,輸入以下代碼。
操作使用工具:Linux。
使用工具版本:CentOS-7.0-x86_64-DVD-1503-01.iso。
Linux編譯內核模塊Makefile中指令的作用是:
obj-m:指定構建為可載入內核模塊的目標文件。 構建外部模塊的命令是:make -C<path_to_kernel_src>M=$PWD。
-C $(KERNEL_DIR):內核源所在的目錄。 「make」實際上會在執行時更改為指定的目錄,並在完成時更改回來。
KERNEL_DIR:指內核源目錄的路徑。
M = $ PWD:通知make正在構建外部模塊。 賦予「M」的值是外部模塊所在目錄的絕對路徑。
I. linux 內核模塊載入問題
可以下載模塊安裝包來安裝,但是一定要注意版本完全匹配。
因為有些模塊是內核運行不可或缺的,如果你調度都不編,還叫內核嗎,就是這樣子。
J. linux操作系統中,載入和刪除內核模塊的命令是什麼。
modprobe命令
Linux命令:modprobe 。
功能說明:自動處理可載入模塊。
語法:modprobe [-acdlrtvV][--help][模塊文件][符號名稱 = 符號值]。
補充說明:modprobe可載入指定的個別模塊,或是載入一組相依的模塊。modprobe會根據depmod所產生的相依關系,決定要載入哪些模塊。若在載入過程中發生錯誤,在modprobe會卸載整組的模塊。
內容
1、modprobe 命令是根據depmod -a的輸出/lib/moles/version/moles.dep來載入全部的所需要模塊。
2、刪除模塊的命令是:modprobe -r filename。
3、系統啟動後,正常工作的模塊都在/proc/moles文件中列出。使用lsmod命令也可顯示相同內容。
4、在內核中有一個「Automatic kernel mole loading"功能被編譯到了內核中。當用戶嘗試打開某類型的文件時,內核會根據需要嘗試載入相應的模塊。/etc/moles.conf或 /etc/modprobe.conf文件是一個自動處理內核模塊的控制文件。
modprobe命令主要用於在Linux 2.6內核中載入和刪除Linux內核模塊。通過此命令用戶可以輕松地載入和刪除Linux內核模塊,同時使用此命令載入Linux內核模塊時,Linux內核會自動解決內核模塊之間的依賴關系,將相互依賴的模塊自動載入,如下所示:
1) 載入RAID1陣列級別模塊:
[root@rhel5 boot]# modprobe raid1
2) 顯示已載入的RAID1陣列級別模塊:
[root@rhel5 boot]# lsmod |grep raid1 raid1 25153 0
3) 刪除RAID1陣列級別模塊:
[root@rhel5 boot]# modprobe -r raid1
4) 顯示RAID1陣列級別模塊:
[root@rhel5 boot]# lsmod |grep raid1
modprobe命令在載入模塊時會自動解決依賴的模塊。當載入的模塊需依賴另一個模塊時,系統會自動將此模塊載入。而當用戶使用insmod命令載入模塊時,則不會自動解決相對應的依賴模塊。
modprobe命令中的"-r"參數表示刪除指定模塊,"-c"參數表示顯示/etc/modprobe.conf配置文件的參數,"-C"參數表示指定內核配置文件,"-f"表示覆蓋,"-l"表示顯示模塊的絕對路徑。
[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
以上命令表示顯示系統中所有的編譯模塊,並過濾包含有raid字元串的模塊。