文档章节

单独编译某个内核模块

认真即可
 认真即可
发布于 2015/12/31 14:21
字数 572
阅读 669
收藏 3

对开发内核驱动和文件系统的人来说,经常需要编译某个内核模块。 当然从编译角度,有built-in kernel module和external kernel module之分。 怎么编译一个外部内核模块,google一下“hello world kernel module Makefile”吧。 这里我说下编译内核自带模块的坑... 我用的是SUSE Linux

  1. 安装源代码包和开发包

    #zypper in kernel-source kernel-devel

    开发包里面放的是头文件和Makefile文件,用RPM命令来查看下:

    # rpm -qa|grep kernel-devel
    kernel-devel-4.1.27-27.1.noarch
    # rpm -ql kernel-devel-4.1.27-24.1.noarch|more
    /usr/share/doc/packages/kernel-source-4.1.27-24
    /usr/share/doc/packages/kernel-source-4.1.27-24/README.SUSE
    /usr/share/doc/packages/kernel-source-4.1.27-24/config-options.changes.txt
    /usr/src/linux
    /usr/src/linux-4.1.27-24
    /usr/src/linux-4.1.27-24/Documentation
    /usr/src/linux-4.1.27-24/Documentation/DocBook
    /usr/src/linux-4.1.27-24/Documentation/DocBook/Makefile
    ....

     

  2. 重要参考文件

#ls -l /usr/src/linux/README.SUSE
lrwxrwxrwx 1 root root 61 Dec 31 10:41 /usr/src/linux/README.SUSE -> ../../share/doc/packages/kernel-source-3.12.49-11/README.SUSE

这个文档介绍编译内核以及模块所需的软件包,概念,方法和步骤。 基本上也适用于其他Linux发型版。

贴出相关的一段:

The second method involves the following steps:

  (1)  Install the kernel-devel package.

  (2)  Install the kernel-$FLAVOR-devel package. This is necessary for
       symbol version information (CONFIG_MODVERSIONS).

  (3)  Compile the module(s) by changing into the module source directory
       and typing ``make -C /usr/src/linux-obj/$ARCH/$FLAVOR M=$(pwd)''.
       Substitute $ARCH and $FLAVOR with the architecture and flavor
       for which to build the module(s).

       If the installed kernel sources match the running kernel, you
       can build modules for the running kernel by using the path
       /lib/modules/$(uname -r)/build as the -C option in the above
       command. (build is a symlink to /usr/src/linux-obj/$ARCH/$FLAVOR).

  (4)  Install the module(s) with
       ``make -C /usr/src/linux-obj/$ARCH/$FLAVOR M=$(pwd) modules_install''.

   3.坑

但是按照上面的步骤总是编译不出来.ko内核模块, 原因是当前的发行版默认没有打开ocfs2模块编译选项:

eric1211:/usr/src/linux/fs/ocfs2 # make -C /lib/modules/3.12.49-11-default/build M=`pwd` modules
make: Entering directory '/usr/src/linux-3.12.49-11-obj/x86_64/default'
make[1]: Entering directory `/usr/src/linux-3.12.49-11-obj/x86_64/default'
  Building modules, stage 2.
  MODPOST 0 modules
make: Leaving directory '/usr/src/linux-3.12.49-11-obj/x86_64/default'

原因是配置文件默认没有选择OCFS2,所以要手动make menuconfig,把ocfs2选上, 再试就可以了。具体步骤:

  1. cd /usr/src/linux

  2. make menuconfig 选择ocfs2

  3. cd /usr/src/linux/fs/ocfs2

  4. make -C /lib/modules/3.12.49-11-default/build M=`pwd` modules

© 著作权归作者所有

共有 人打赏支持
认真即可
粉丝 5
博文 86
码字总数 46278
作品 0
朝阳
程序员
私信 提问
Linux学习记录--内核|内核模块编译

内核|内核模块编译 (对于内核的知识觉得了解不够,等学习完LFS再来详细整理下这方面的知识) 内核:系统上面的一个文件,这个文件包含了驱动主机各项硬件的检测程序和驱动模块。 计算机真正...

tiankefeng0520
2014/04/09
0
0
字符设备驱动基础篇1——简单的驱动源码分析

以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除。 参考资料:http://www.cnblogs.com/biaohc/p/6575074.html module_test.c代码 snippetid="2488637" snippetfilename="blog201...

oqqHuTu12345678
2017/07/19
0
0
怎么样把内核代码中已有的模块提取出来单独make

RT 比方说,我现在需要把libata/libsas模块的源码从内核中拿出来,然后在编译内核的时候不编译此模块。 并将内核中提取出来的libata/libsas源码单独作为模块手动编译,再加载。 做过很多尝试...

enull
2013/01/04
545
2
浅谈Linux内核动态模块的编译(转)

作者:冯建,华清远见嵌入式学院讲师。 Linux内核给开发者提供了灵活的模块加载方式,开发者可根据需要适当地选择静态或动态的方式将模块加入内核当中。静态加载的时候我们只需将驱动文件添加...

nothingfinal
2012/05/16
0
0
修改内核参数

核心:/boot/vmlinuz-version 内核模块:/lib/modules/version 内核设计:linux为单内核,模块化设计 装在模块命令:insmod 、 modprobe 内核官网:www.kernel.org 用户空间访问、监控内核的...

燃烧的大脑
2016/07/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring源码学习笔记-1-Resource

打算补下基础,学习下Spring源码,参考书籍是《Spring源码深度解析》,使用版本是Spring 3.2.x,本来想试图用脑图记录的,发现代码部分不好贴,还是作罢,这里只大略记录下想法,不写太细了 ...

zypy333
今天
10
0
RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
17
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
11
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部