首页 > 解决方案 > 使用 CMake 文件在 Centos 7 上构建内核模块

问题描述

对不起,长度。我试图包含尽可能多的信息。

我随机使用的设备无法在启动时启动 - 这是该设备的一个众所周知的问题,并且网络上有很多帖子,除了重启之外没有已知的解决方案。

所以任务是在 dmesg 中查找某个字符串,如果存在则意味着设备无法启动并且系统需要重新启动。通过引导对 system() 的简单调用似乎可以完成这项工作。

证明这一点的单元测试会很好。这个想法是在 dmesg 日志中寻找一个不存在的 uuid 以证明它找不到一个,然后将不同的 uuid 写入日志,然后搜索它。证明它在这两种情况下都有效。

首先是打谷歌:发现你可以写入内核日志,# echo '<4>Foo: Message' | sudo tee /dev/kmsg它可以从终端工作,但sudo可能会导致单元测试出现问题。

我接下来看到的是通过代码访问它。单元测试是用 C++ 编写的,库是 googletest。

大多数帖子都谈论编写 aMakefilekbuild. 我在一个构建系统中工作,我们cmake从一个 shell 脚本调用。

经过几个小时的搜索和尝试,我决定在这里问。

我已经安装

kernel.x86_64                                                      3.10.0-1062.el7                                                @anaconda
kernel.x86_64                                                      3.10.0-1160.21.1.el7                                           @updates 
kernel-devel.x86_64                                                3.10.0-1160.21.1.el7                                           @updates 
kernel-devel.x86_64                                                3.10.0-1160.24.1.el7                                           @updates 
kernel-headers.x86_64                                              3.10.0-1160.21.1.el7                                           @updates 
kernel-tools.x86_64                                                3.10.0-1160.21.1.el7                                           @updates 
kernel-tools-libs.x86_64                                           3.10.0-1160.21.1.el7    

uname -r给出了3.10.0-1160.21.1.el7.x86_64这似乎表明我安装了内核头文件和开发文件。

做一个find /. -name module.h列表:

...
/usr/src/kernels/3.10.0-1160.24.1.el7.x86_64/arch/x86/include/asm/module.h
/usr/src/kernels/3.10.0-1160.24.1.el7.x86_64/include/asm-generic/module.h
/usr/src/kernels/3.10.0-1160.24.1.el7.x86_64/include/linux/module.h
/usr/src/kernels/3.10.0-1160.24.1.el7.x86_64/include/trace/events/module.h
/usr/src/kernels/3.10.0-1160.24.1.el7.x86_64/include/uapi/linux/module.h
/usr/src/kernels/3.10.0-1160.21.1.el7.x86_64/arch/x86/include/asm/module.h
/usr/src/kernels/3.10.0-1160.21.1.el7.x86_64/include/asm-generic/module.h
/usr/src/kernels/3.10.0-1160.21.1.el7.x86_64/include/linux/module.h
/usr/src/kernels/3.10.0-1160.21.1.el7.x86_64/include/trace/events/module.h
/usr/src/kernels/3.10.0-1160.21.1.el7.x86_64/include/uapi/linux/module.h
...

也许我正在尝试在/3.10.0-1160.24.1.el7.x86_64/我应该链接到3.10.0-1160.21.1.el7.x86_64/. sudo yum list | grep linux-d通过返回列出已安装的 yum 软件包

libselinux-devel.x86_64                    2.5-15.el7             @base         
libhbalinux-devel.i686                     1.0.17-2.el7           base          
libhbalinux-devel.x86_64                   1.0.17-2.el7           base          
libselinux-devel.i686                      2.5-15.el7             base          
syslinux-devel.x86_64                      4.05-15.el7            base          

我的 CMakeFiles.txt 看起来像

project( X_test )

set( TEST_SOURCE
    X_test.cpp
)

execute_process(COMMAND uname -r OUTPUT_VARIABLE uname_r OUTPUT_STRIP_TRAILING_WHITESPACE)

include_directories(/usr/src/kernels/${uname_r}/include)
link_directories(/lib/modules/${uname_r}/build)

add_library(source-lib STATIC source.c)

那里的任何其他内容都已被注释掉以防止混淆。

没有线条include_directories,否则link_directories我会收到错误

 #include <linux/module.h>

有了这些行,我得到了错误:

In file included from /usr/src/kernels/3.10.0-1160.21.1.el7.x86_64/include/linux/kernel.h:6:0,
                 from /usr/src/kernels/3.10.0-1160.21.1.el7.x86_64/include/linux/cache.h:4,
                 from /usr/src/kernels/3.10.0-1160.21.1.el7.x86_64/include/linux/time.h:4,
                 from /usr/src/kernels/3.10.0-1160.21.1.el7.x86_64/include/linux/stat.h:18,
                 from /usr/src/kernels/3.10.0-1160.21.1.el7.x86_64/include/linux/module.h:10,
                 from /home/user/git/asdo/Services/DCO-3303/test/source.c:1:
/usr/src/kernels/3.10.0-1160.21.1.el7.x86_64/include/linux/linkage.h:7:25: fatal error: asm/linkage.h: No such file or directory
 #include <asm/linkage.h>

我正在编译的代码是printk(KERN_INFO "Hello world\n");您可以在此处看到的标准。

如何通过 CMake 编译使用内核调用的代码?

标签: cmakelinux-kernelcentos7

解决方案


推荐阅读