(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


Logo

更多推荐