初衷:由於ubuntu1604安裝版本沒有 igmp snooping的模組,所以研究了一下此功能。
進入需要編譯的目錄,我的目錄是 ./net/bridge,
檢視makefile,找到需要編譯的檔案,並確認編譯的config引數,如下:sean@sean:/media/sean/b55f4db0-2560-4807-b8bf-b29a66db54e1/home/sean/work/tmp/kernel/linux-4.8/net/bridge$ ls
br.c br_fdb.o bridge.mod.c br_if.o br_ioctl.o br_multicast.o br_netfilter_ipv6.o br_netfilter.o br_nf_core.o br_stp_bpdu.c br_stp_if.o br_sysfs_br.c br_vlan.c makefile
br_device.c br_forward.c bridge.mod.o br_input.c br_mdb.c br_netfilter_hooks.c br_netfilter.ko br_netlink.c br.o br_stp_bpdu.o br_stp.o br_sysfs_br.o br_vlan.o modules.order
br_device.o br_forward.o bridge.o br_input.o br_mdb.o br_netfilter_hooks.o br_netfilter.mod.c br_netlink.o br_private.h br_stp.c br_stp_timer.c br_sysfs_if.c built-in.o module.symvers
br_fdb.c bridge.ko br_if.c br_ioctl.c br_multicast.c br_netfilter_ipv6.c br_netfilter.mod.o br_nf_core.c br_private_stp.h br_stp_if.c br_stp_timer.o br_sysfs_if.o kconfig netfilter
sean@sean:/media/sean/b55f4db0-2560-4807-b8bf-b29a66db54e1/home/sean/work/tmp/kernel/linux-4.8/net/bridge$
命令如下:
然後手動將生成的*.ko拷貝到/lib/modules/2.6.19/kernel/對應的目錄即可。(由於我需要的檔案只能編譯為.o,所以不需要拷貝)make config_bridge_igmp_snooping=m -c /home/sean/kernel/linux-4.8 m=/home/sean/kernel/linux-4.8/net/bridge modules
或者cd /home/sean/kernel/linux-4.8/net/bridge
make config_bridge_igmp_snooping=m -c /home/sean/kernel/linux-4.8 m=`pwd` modules
執行depmod -a重新配置依賴關係,以後就可以通過modprobe fuse來載入fuse模組了。
$(make) -c $(kdir) m=$(pwd) modules
-c:後面的引數為linux核心的頂層目錄
m:後面的引數為需要編譯檔案的目錄
kernelrelease 是在核心原始碼的頂層makefile中定義的乙個變數,在第一次讀取執行此makefile時,kernelrelease沒有被定義,所以make將讀取執行else之後的內容。如果make的目標是clean,直接執行clean操作,然後結束。ifneq ($(kernelrelease),)
obj-m := mytest.o
mytest-objs := file1.o file2.o file3.o
else
kdir := /lib/modules/$(shell uname -r)/build
pwd := $(shell pwd)
default:
$(make) -c $(kdir) m=$(pwd) modules
endif
當make的目標為modules或modules_install時,-c (ke
rnel
dir)
指明跳轉
到核心源
碼目錄下
讀取那裡
的mak
efil
e;m=
(kerneldir)指明跳轉到核心原始碼目錄下讀取那裡的makefile;m=
(kerne
ldir
)指明跳
轉到核心
原始碼目錄
下讀取那
裡的ma
kefi
le;m
=(pwd) 表明然後返回到當前目錄繼續讀入、執行當前的makefile。
當從核心原始碼目錄返回時,kernelrelease已被被定義,kbuild也被啟動去解析kbuild語法的語句,make將繼續讀取else之前的內容。else之前的內容為kbuild語法的語句, 指明模組原始碼中各檔案的依賴關係,以及要生成的目標模組名。
如要在/driver/char中增加乙個配置選項config_fishing_pole選項;
在driver/char/kconfig檔案中增加對該選項的說明:
在driver/char/makefile中增加:config fishing_pole
tristate 「簡單說明」 //tristate代表有三種方式,如為bool代表不能變為模組
default n //預設是否選擇
help
**** //一些幫助資訊
obj-$(config_fishing_pole) += fishing.o
如果有多個原始檔:
obj-$(config_fishing_pole) += fishing.o
fishing-objs := fishing-main.o fishing-line.o
Linux下使用核心原始碼單獨編譯某一模組
使用linux在於折騰。生命不息,折騰不止。在vmware中安裝了linuxmint 18,自帶核心是4.4,於是自己手動將核心版本公升級到了4.8,但是安裝新的核心後,發現vmware螢幕無法自動適應客戶機,於是 lspci knn檢視了下顯示模組,發現vga沒有可用的模組。於是對比了正常的虛擬機...
關於Linux核心原始碼使用
很多人對linux這乙個開放核心原始碼的os不會陌生,因此開源相關話題在此不再贅述。問題是,拿到了linux kernel source以後 不知道在 麼,那就看下http www.kernel.org 吧 應該如何正確的進行配置,編譯,安裝 公升級工作。事先宣告,安裝 公升級核心的操作被執行以前,...
linux核心原始碼
1.機器當前使用的核心版本 apuser jianzhangubtnb uname a linux jianzhangubtnb 3.2.0 23 generic 36 ubuntu smp tue apr 10 20 39 51 utc 2012 x86 64 x86 64 x86 64 gnu ...