㈠ OpenWrt教程-如何在OpenWrt系統中添加一個linux內核模塊
linux內核支持動態載入模塊,內核模塊以.ko為後綴,在Linux系統中,內核模塊放在/lib/molex/x.x.x目錄中,其中x.x.x為linux版本號
載入模塊
insmod xxx.ko
如果帶參數 insmod xxx.ko a=1
卸載模塊
rmmod xxx.ko
支持的數據類型
bool :布爾類型
invbool:顛倒了值的bool類型;
charp :字元指針類型,內存為用戶提供的字元串分配;
int :整型
long :長整型
short :短整型
uint :無符號整型
ulong :無符號長整型
ushort :無符號短整型
內核模塊源碼Makefile編寫格式和linux源碼的格式一樣
在OpenWrt系統中,內核模塊編譯和應用層的package編譯類似
make package/模塊名/compile V=s
比如:
make package/hello_kernel/compile V=s
編譯完成後會生成.ko文件,目錄文件在build_dir中,但和應用層的build目錄有點區別,內核模塊的package放在linux目錄,如(X86平台):
build_dir/target-x86_64_musl/linux-x86_64/
將編譯完成的ko文件傳輸到OpenWrt系統中,注意編譯平台和開發板平台的系統架構要一致。
㈡ linux內核模塊如何開始和結束
GRLB 載入了內核之後,內核首先會再進行二次系統的自檢,而不一定使用 BIOS 檢測的硬體信息。這時內核終於開始替代 BIOS 接管Linux的啟動過程了。
內核完成再次系統自檢之後,開始採用動態的方式載入每個硬體的模塊,這個動態模塊大家可以想像成硬體的驅動(默認 Linux 硬體的驅動是不需要手工安裝的,如果是重要的功能,則會直接編譯到內核當中;如果是非重要的功能,比如硬體驅動會編譯為模塊,則在需要時由內核調用。不過,如果沒有被內核硬體,要想驅動,就需要手工安裝個硬體的硬塊了。具體的安裝方法會在後續章節中介紹)。
那麼,Linux 的內核到底放在了哪裡呢?當然是 /boot 的啟動目錄中了,我們來看看這個目錄下的內容吧。
[root@localhost ~]#ls /boot/
config-2.6.32-279.el6.i686
#內核的配置文件,內核編譯時選擇的功能與模塊
efi
#可擴展固件介面,為英特爾為全新PC固件的體系結構、介面和服務提出的建議標准
grub
#啟動引導程GTUB的數據目錄
initramfe-2.6.32-279.el6.i686.img
#虛擬文件系統(CentOS 6.x 中用initramfs替代了initrd,但功能是一樣的)
lost+found
故boot分區的備份目錄
symvers-2_6.32-279.el6.i686.gz
#模塊符號信息
System.map-2.6.32-279.el6.i686
#內核功能和內存地址的對應列表
vmlinuz-2.6.32-279.el6.i686
#用於啟動的Linux內核。這個文件是一個壓縮的內核鏡像
我們已經知道,Linux 會把不重要的功能編譯成內核模塊,在需要時再調用,從而保證了內核不會過大。在多數 Linux 中,都會把硬體的驅動程序編譯為模塊, 這些模塊保存在 /lib/moles/ 目錄中。常見的 USB、SATA 和 SCSI 等硬碟設備的驅動,還有一些特殊的文件系統(如 LVM、RAID 等)的驅動,都是以模塊的方式來保存的。
如果 Linux 安裝在 IDE 硬碟之上,並且採用的是默認的 ext3/4 文件系統,那麼內核啟動後載入根分區和模塊的載入都沒有什麼問題,系統會順利啟動。但是如果 Linux 安裝在 SCSI 硬碟之上,或者採用的是 LVM 文件系統,那麼內核(內核載入入內存是啟動引導程序 GRUB 調用的,並不存在硬碟驅動不識別的問題)在載入根目錄之前是需要載入 SCSI 硬碟或 LVM 文件系統的驅動的。
SCSI 硬碟和 LVM 文件系統的驅動都放在硬碟的 /lib/moles/ 目錄中,既然內核沒有辦法識別 SCSI 硬碟或 LVM 文件系統,那怎麼可能讀取 /lib/moles/ 目錄中的驅動呢?Linux 給出的解決辦法是使用 initramfs 這個虛擬文件系統來處理這個問題。
initramfe虛擬文件系統
CentOS 6.x 中使用 initramfs 虛擬文件系統取代了 CentOS 5.x 中的 initrd RAM Disk。它們的作用類似,可以通過啟動引導程序載入到內存中,然後會解壓縮並在內存中模擬成一個根目錄,並且這個模擬的文件系統能夠提供一個可執行程序,通過該程序來載入啟動過程中所需的內核模塊,比如 USB、SATA. SCSI 硬碟的驅動和 LVM、RAID 文件系統的驅動。
也就是說,通過 initramfs 虛擬文件系統在內存中模擬出一個根目錄,然後在這個模擬根目錄中載入 SCSI 等硬體的驅動,就可以載入真正的根目錄了,之後才能調用 Linux 的第一個進程 /sbin/init。
Initramfs 虛擬文件系統主要有以下優點:
initramfs 隨著其中數據的増減自動増減容量。
在 initramfs 和頁面緩存之間沒有重復數據。
initramfs 重復利用了 Linux caching 的代碼,因此幾乎沒有増加內核尺寸,而 caching 的代碼已經經過良好測試,所以 initramfs 的代碼質量也有保證。
不需要額外的文件系統驅動。
其實大家只需要知道 initramfs 是為了在內核中建立一個模擬根目錄,這個模擬根目錄是為了可以調用 USB、SATA、SCSI、LVM、RAID 等硬碟介面或文件系統的驅動模塊,載入了驅動模塊後才可以載入真正的系統根目錄。我們可以通過示意圖 1 來表示這個過程。
[root@localhost~]#mkdir/tmp/initramfs
#建立測試目錄
[root@localhost~]#cp/boot/
initramfs-2.6.32-279.el6.i686.img/tmp/initramfs/
#復制initramfs文件
[root@localhost~]#cd/tmp/initramfs/
[root@localhostinitramfs]#file
initramfs-2.6.32-279.el6.i686.img
initramfe-2.6.32-279.el6.i686.img:gzipcompressed
data,fromUnix,lastmodified:
WedApr1021:49:342013,maxcompression
#查看文件類型,發現這個文件是一個使用gzip命令打包的壓縮包
[root@localhostinitramfs]#mvinitramfs-2.6.32-279.el6.i686.imginitramfs-2.6.32-279.el6.i686.img.gz
#修改文件的擴展名為.gz
[root@localhostinitramfs]#gunzip
initramfs-2.6.32-279.el6.i686.img.gz
#解壓縮
[root@localhostinitramfs]#ls
initramfs-2.6.32-279.el6.i686.img
[root@localhostinitramfs]#file
initramfs-2.6.32-279.el6.i686.img
initramfe-2.6.32-279.el6.i686.img:ASCIIcpioarchive(SVR4withnoCRC)
#查看文件類型,使用cpio命令的壓縮文件
[root@localhostinitramfs]#cpio-ivc<initramfs-2.6.32-279.el6.i686.img
#解壓縮
[root@localhostinitramfs]#ll
總用量34512
drwxr-xr-x.2rootroot40964月2412:10bin
drwxr-xr-x.2rootroot40964月2412:10cmdline
drwxr-xr-x.3rootroot40964月2412:10dev
-rw-r--r--.1rootroot194月2412:10dracut-004-283.el6
drwxr-xr-x.2rootroot40964月2412:10emergency
drwxr-xr-x.7rootroot40964月2412:10etc
-rwxr-xr-x.1rootroot89624月2412:10init
drwxr-xr-x.2rootroot40964月2412:10initqueue
drwxr-xr-x.2rootroot40964月2412:10initqueue-finished
drwxr-xr-x.2rootroot40964月2412:10initqueue-settled
drwxr-xr-x.2rootroot40964月2412:10
initqueue-timeout
-rw-r--r--.1rootroot352353284月2412:09initramfs-2.6.32-279.el6.i686.img
drwxr-xr-x.9rootroot40964月2412:10lib
…省略部分輸出…
#這就是initramfs虛擬文件系統中的內容,和根目錄是不是很像
關機或者某些進程停止,對應的內核模塊就會結束。更多知識請網路《Linux就該這么學》
㈢ linux包含哪些模塊
一、進程調度模塊
Linux以進程作為系統資源分配的基本單位,並採用動態優先順序的進程高級演算法,保證各個進程使用處理機的合理性。進程調度模塊主要是對進程使用的處理機進行管理和控制。
二、進程間通信模塊
進程間通信主要用於控制不同進程之間在用戶空間的同步、數據共享和交換。由於不同的用戶進程擁有不同的進程空間,因此進程間的通信要藉助於內核的中轉來實現。一般情況下,當一個進程等待硬體操作完成時,會被掛起。當硬體操作完成,進程被恢復執行,而協調這個過程的就是進程間的通信機制。
進程間通信模塊保證了Linux支持多種進程間通信機制,包括管道、命名管道、消息隊列、信號量和共享內存等。
三、內存管理模塊
Linux的內存管理模塊採用先進的虛擬存儲機制,實現對多進程的存儲管理。它提供了十分可靠的存儲保護措施,對進程賦予不同的許可權,用戶不能直接訪問系統的程序和數據,保證了系統的安全性。同時,為每個用戶進程分配一個相互獨立的虛擬地址空間。
四、文件系統模塊
Linux的文件系統模塊採用先進的虛擬文件系統技術,屏蔽了各種文件系統的差別,為處理各種不同的文件系統提供了統一的介面,支持多種不同的物理文件系統達90多種。同時,Linux把各種硬體設備看作一種特殊的文件來處理,用管理文件的方法管理設備,非常方便、有效。
五、網路介面模塊
Linux具有最強大的網路功能。網路介面模塊通過套接字機制實現計算機之間的網路通信,並採用網路層次模型提供對多種網路協議和網路硬體設備的支持。
網路介面提供了對各種網路標準的實現和各種網路硬體的支持。網路介面一般分為網路協議和網路驅動程序。網路協議部分負責實現每一種可能的網路傳輸協議。網路設備驅動程序則主要負責與硬體設備進行通信,每一種可能的網路硬體設備都有相應的設備驅動程序。
㈣ Linux動態模塊怎樣編譯
編譯模塊的make file 必須是Makefile,不能是makefile. //why?
ifneq ($(KERNELRELEASE),)
obj-m := your.o
mytest-objs := file1.o file2.o file3.o
else
KDIR := /lib/moles/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) moles
endif
把your換成你的source name ,然後保存為Mafefile ,make 一次就可以了。