cmake - 使用 CMake 文件在 Centos 7 上构建内核模块
问题描述
对不起,长度。我试图包含尽可能多的信息。
我随机使用的设备无法在启动时启动 - 这是该设备的一个众所周知的问题,并且网络上有很多帖子,除了重启之外没有已知的解决方案。
所以任务是在 dmesg 中查找某个字符串,如果存在则意味着设备无法启动并且系统需要重新启动。通过引导对 system() 的简单调用似乎可以完成这项工作。
证明这一点的单元测试会很好。这个想法是在 dmesg 日志中寻找一个不存在的 uuid 以证明它找不到一个,然后将不同的 uuid 写入日志,然后搜索它。证明它在这两种情况下都有效。
首先是打谷歌:发现你可以写入内核日志,# echo '<4>Foo: Message' | sudo tee /dev/kmsg
它可以从终端工作,但sudo
可能会导致单元测试出现问题。
我接下来看到的是通过代码访问它。单元测试是用 C++ 编写的,库是 googletest。
大多数帖子都谈论编写 aMakefile
和kbuild
. 我在一个构建系统中工作,我们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 编译使用内核调用的代码?
解决方案
推荐阅读
- regex - 使用正则表达式提取方括号中的字符串
- reactjs - can't type more than one character in input from fields react js
- c# - 在 Azure Function 中使用 xUnit 的 Moq 服务总线
- node.js - 运行 npm-check-updates 时出错
- android - Why is the value for ${applicationName} not supplied after migrating my Flutter app to Android embedding v2?
- c# - Newtonsoft DeserializeObject“真”不区分大小写
- typescript - How to use eslint to forbid the unwanted value appear in code
- java - INGinious: How to use the moss plagiarism checker tool
- python - Creating a Main Menu for connect 4 on python
- javascript - 如何通过另一个数组编号键过滤数组键