1. 程式人生 > >Linux 下面編譯核心模組的 方法

Linux 下面編譯核心模組的 方法

(1) 選擇好你的核心版本,核心模組經常是和核心版本緊密相關的,建議儘量選擇高核心的版本,否則有可能會遇到很大的問題。

(2) 下載核心程式碼到/usr/src/kernel/目錄。如果有了,則不用下載。

(3) mkdir -p /lib/modules/3.10.102-1.el6.elrepo.x86_64  #其中3.10.102-1.el6.elrepo.x86_64  是uname -r 的結果。

     ln -s /usr/src/kernels/linux-3.10.102/    /lib/modules/3.10.102-1.el6.elrepo.x86_64/build #原始碼的目錄要和build的核心版本匹配

(4) #cd /usr/src/kernels/linux-3.10.102/

    這一步可能需要進行一些核心引數的配置 

    #make oldconfig

     #make prepare

     #make script ###如果不執行這個會導致下面的錯誤:

  error linux/scripts/recordmcount: No such file or directory

    # make

    #make bzImage (bzimage可以代替zImage)#主要用於編譯核心的檔案。

   #make modules  #將核心選項中的M選項的配置編譯為了*.ko檔案。

  #make modules_install #將生成的*.ko檔案複製到/lib/modules/<核心版本號>/下面,並執行depmod生成modules.dep核心模組的依賴檔案,insmod和modprobe需要這些依賴去自動載入依賴的ko檔案,否則需要手動新增依賴模組後,才能將核心模組inster進核心中去。 或者用modprobe,modprobe會讀取檔案

 /lib/modules/3.10.0-229.el7.x86_64/modules.dep .此檔案檔案 可以由工具depmod 根據當前載入的ko模組生成或者收到編譯。這個檔案主要指明瞭核心版本需要載入哪些核心模組以及核心模組的依賴模組。modules.dep假設ko檔案位於目錄/lib/modules/version/目錄下面。

以行為單位

#modulea.ko 依賴depend1.ko和depned2.ko

MODULEA.ko:  DEPEND1.ko  DEPEND2.ko 

更準確的描述如下:

/lib/modules/2.6.29/kernel/a.ko: /lib/modules/2.6.29/kernel/c.ko /lib/modules/2.6.29/kernel/b.ko
/lib/modules/2.6.29/kernel/b.ko:
/lib/modules/2.6.29/kernel/c.ko: /lib/modules/2.6.29/kernel/b.ko
modproe a.ko的時候,他會按照順序(從右向左)載入b.ko和c.ko.

(5) 開始編譯自己的核心模組

   如果在編譯的時候遇到這個錯誤:    error: inlining failed in call to `kzalloc.clone.0`--param max-inline-insns-single limit reach 建議將kzalloc 改成kmalloc試試 ,我再編譯dpdk的時候遇到這個問題。 附加 centos 編譯核心及核心模組的官方連結: https://wiki.centos.org/HowTos/BuildingKernelModules