構建linux2 6 32核心樹

2021-10-03 11:08:03 字數 2337 閱讀 1521

系統環境

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,...