系統環境
rhel6
核心版本:
注意:下乙個和你當前執行版本一樣的核心,這裡可以看到我當前執行的核心版本是2.6.32-279.el6.x86_64,好,那我就下乙個2.6.32.x的版本(必須有和當前執行的版本有同樣的版本號,否則在載入模組時候insmod: error inserting 『***.o』 :-l invalid module format這樣的錯誤)。
tar -zxvf linux-2.6.32.tar.gz
解壓後生成linux-2.6.32的目錄,進入目錄
配置.config檔案
make oldconfig
中間過程回車採用預設值
編譯核心
make bzimage (此處i要大寫,編譯壓縮形式的核心)
make modules (編譯選擇的模組)
也可直接make
make (2.6核心 make = make bzimage + make modules)
然後將編譯後的模組轉移到系統標準位置,模組在系統中的標準目錄位於/lib/modules/x.y.z,後面的x.y.z是版本號,為安全起見,在執行#make modules-install之前最好對/lib/modules進行備份。模組通常是帶有副檔名.o的檔案,使用命令#lsmod可以對當前核心的模組進行列表。
make modules_install
make install
此時產生了錯誤:error: modinfo: could not find module nf_defrag_ipv6
還有幾個錯是vm開頭的錯誤,
這幾個錯誤不影響使用,vm的錯誤可能影響vmtools的使用。
重啟,開啟時選擇新安裝的核心:linux-2.6.32
;同時編寫makefile,在同一目錄下:
vim makefile
ifneq ($(kernelrelease),)
obj-m := hello.o
else
kdir := /lib/modules/2.6.32/build
all:
make -c $(kdir) m=$(pwd) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
注意:其中kdir指明了引用標頭檔案的位置,應根據具體情況修改該檔案。ifneq是比較兩個引數是否相同。
ifneq ($(kernelrelease),)
第二個引數空就是null
意思是 $(kernelrelease), 的值不是null就可以進行下面的編譯處理
(切記:makefile每個命令的第乙個字元必須是製表符[tab]即kdir,make,rm前不是四個空格空格開頭而是乙個[tab],不要想當然的隨便認為只是個空格。否則會在編譯是報出***missing seperater .stop. 的錯誤 )
在當前路徑執行make
執行後產生hello.ko檔案
載入模組:
insmod hello.ko
最後,使用rmmod hello.ko來解除安裝模組,同樣,使用dmesg可以看到列印出的"goodbye, world"。
rmmod hello.ko
dmesg | tail -2
linux2 6 32核心訊號量的實現
首先看看訊號量的相關資料結構 include linux semaphore.h struct semaphore 訊號量的初始化 include linux semaphore.h define declare mutex name struct semaphore name semaphore ...
linux 2 6 32下sysctl的使用
struct ctl table struct ctl table header register sysctl table struct ctl table table fun 註冊sysctl proc sys 下的操作項 標頭檔案 include void unregister sysctl ...
linux2 6 32中斷處理流程
1 當發生中斷時,pc指標通過異常向量表跳轉到中斷入口函式asm do irq asm do irq是中斷的c語言總入口函式,它在 arch arm kernel irq.c中定義,宣告如下 asmlinkage void exception asm do irq unsigned int irq,...