内核模块是一个运行时可加载的目标文件,它被加载到操作系统内核中以向正在运行的内核添加功能。示例包括设备驱动程序和其他内核项。
我试图直接从内核模块写入它创建的进程,而不需要副本。请注意,我不能像您那样简单地在内核模式下分配内存并将其映射到用户态
我在内核源代码树之外进行编码。有两个模块,第一个 printt 有一个函数 printtty() 用于将字符串打印到当前 tty,第二个模块 hello 调用 prin...
Ubuntu 上的 Linux 内核驱动程序构建错误“没有规则来创建目标 arch/x86/entry/syscalls/syscall_32.tbl”
未构建简单的 Linux 内核驱动程序 环境: 操作系统:Ubuntu 24LTS Linux 内核:6.8.0-47-generic C++17 GCC 编译器 ldd.cpp #包括 #包括
我想构建一个没有内核源代码树的内核模块。 为此,我仅指定了内核头目录。 这个参考链接告诉我它应该是可行的: 构建内核模块...
是否有一组最小的文件可以从 Linux 内核编译中保留,以便稍后根据需要编译内核模块?
编译Linux内核后,我需要将巨大的源目录保留在磁盘中,以供进一步的外部模块编译。 我不能简单地运行 make clean,因为当我编译时这会让我失败......
我需要在 x86 架构上的内核空间中通过名称自动识别故障模块。挑战是我只有一个与失败的 m 相关的随机内存地址...
如何更新从 gki 内核的供应商和其他区域的公共区域导出的符号列表?
我正在内核的公共区域中开发一个模块,但是从供应商区域(模块)我需要访问公共区域中的一些注册函数。我看到公共区域的功能...
我对此进行了一些网络搜索,但只能找到有关获取与设备节点关联的内核模块的结果。无论如何我可以获得当前系统的主要和次要编号...
我正在尝试构建一些添加到 Ubuntu 源代码中的内核模块。经过多次编译尝试失败后,我发现相同的错误不断发生在不同的地方。编译器是...
我是Linux内核的初学者。现在我正在尝试自己编写一个模块来设置页表。 我的电脑是x86,内核版本是5.4.0。 首先我使用内核参数memmap来保留...
我正在编写一个内核模块,用于检查时间是否在两个指定的小时之间,如果是,则禁用输入。这与我想确保早点睡觉有关。 (我知道我可以...
我偶然发现了这个关于 Linux 下 USB 视频采集器的网站,我正在尝试编译此处找到的代码。我读过有关 makefile 的内容,但这个让我困惑,因为它太短了: usbtv-y := usbt...
‘proc_fops’有一个不完整的类型‘struct proc_ops’
我正在尝试构建一个Linux内核模块,特别是我有这些文件,都在同一个文件夹中: 系统调用.h/.c 用户.h/.c 过程.h/.c 模块.h/.c 我想将配置文件处理成...
Linux 内核中的 dump_stack() 不打印函数的地址
我有一个测试 Linux 内核模块,可以打印 dump_stack()。但它打印的跟踪不完整,因为它没有打印函数地址。我使用 Ubuntu 16.04.7 LTS 和 4.15.0-142-gen...
错误:目标文件“./scripts/target.json”不存在
我正在编译 Linux 内核模块,但出现以下错误 错误:目标文件“./scripts/target.json”不存在 make[3]: *** [scripts/Makefile.build:292: /home/guilherme/reposit...
我是 Linux 内核模块编程的新手,许多关于该主题的入门指南都很少包含有关如何构建将在许多版本和 CPU 平台上运行的内核模块的信息...
我正在尝试编写内核模块,用于在给定地址设置硬件断点并在读/写访问时触发回调,寄存器看起来还不错,但访问时不会触发回调...
如何让 CLion 识别 linux/init.h 和其他 linux 内核头文件?
我正在尝试使用 CLion 进行一些 Linux 内核编程。我观察到一些标题,如 和 被正确识别,但其他一些标题,如 我正在尝试使用 CLion 进行一些 Linux 内核编程。我观察到一些标题,如 <linux/kernel.h> 和 <linux/module.h> 被正确识别,但其他一些标题,如 <linux/init.h> 则未被正确识别。 为了更清楚,这里有一个示例程序: 1 #include <linux/init.h> 2 #include <linux/kernel.h> 3 4 int init_module(void) { 5 printk("initializing"); 6 return 0; 7 } 这里,我的第 1 行和第 5 行以红色突出显示,并带有典型的“未找到文件”/“调用未声明的函数”错误,但第 2 行正确地未突出显示,并且如果我尝试编写链接到该库的内容完全没有问题。 我尝试为我的内核安装最新的标头,即sudo apt install linux-headers-$(uname -r),但它似乎不起作用。我能做什么? 编辑: 输出locate init.h | grep linux/init.h (some thimeshift things...) /usr/src/linux-headers-5.4.0-187/include/linux/init.h /usr/src/linux-headers-5.4.0-189/include/linux/init.h /usr/src/linux-headers-5.4.0-74/include/linux/init.h ...这很好奇,因为我的内核版本是5.4.0-190,并且sudo apt-get install linux-headers-$(uname -r)的输出如下(手动翻译成英文): ... linux-headers-5.4.0-190-generic is already at the most recent version (5.4.0-190.210). ... 编辑: 添加 CMake 文件有点有效 include_directories(/usr/src/linux-headers-5.4.0-187/include/),但这只是一个“补丁”,而不是解决方案,所以我将问题悬而未决,希望得到一些更“明确”的答案 事情没那么简单,有两个主要原因: CLion 想要使用 CMake,因此您必须编写一个自定义 CMakeLists.txt 来查找内核标头并调用 make 来调用内核 Makefile 并使用自定义命令构建模块。这并不容易,因为内核 Makefile 相当复杂,需要正确定义许多变量。 正如您似乎已经发现的那样,通常当前内核的内核头位于 /usr/src/linux-headers-$(uname -r)/。但是,.h C 头文件位于不同的目录中。在 headers 目录中,我知道至少有 4 个不同的包含目录:include、include/generated、arch/XXX/include 和 arch/XXX/include/generated。这些都需要包括在内。 使用 CLion 构建内核模块的 CMakeLists.txt 鉴于上述情况,构建内核模块的 CMakeLists.txt 应该执行以下操作: 查找当前的内核版本(使用 uname -r 命令)。 在 /usr/src/linux-headers-$(uname -r) 找到内核头文件。我们将此路径保存在 KDIR 变量中。 指定要构建的架构。我们将为此设置一个 ARCH 变量。没有简单的方法可以自动执行此操作,因为像 uname -m 这样的命令行工具会输出错误的名称(例如 x86_64 而不是 x86)。 使用 include_directories() 包含适当的目录。 生成 Kbuild(或 Makefile)文件来构建模块。 使用 make 运行自定义 custom_command() 命令来构建模块。 最后,声明一个 dummy_target 目标用于依赖性检查。 最终结果如下: cmake_minimum_required(VERSION 3.28) project(mymod C) set(CMAKE_C_STANDARD 99) add_definitions(-D__KERNEL__ -DMODULE) # Find running kernel release execute_process( COMMAND uname -r OUTPUT_VARIABLE KERNEL_RELEASE OUTPUT_STRIP_TRAILING_WHITESPACE ) set(KDIR "/usr/src/linux-headers-${KERNEL_RELEASE}") set(ARCH "x86") # Check that the headers are installed if (NOT EXISTS "${KDIR}/include/linux/module.h") message(FATAL_ERROR "Kernel headers dir not found: ${KDIR}") endif() # Check that the headers are for the specified arch if (NOT EXISTS "${KDIR}/arch/${ARCH}/include") message(FATAL_ERROR "Arch-specific include dir not found: ${KDIR}/arch/${ARCH}/include") endif() message(NOTICE "Building for arch: ${ARCH}") message(NOTICE "Kernel release: ${KERNEL_RELEASE}") message(NOTICE "Kernel headers: ${KDIR}") # Include generic kernel headers include_directories("${KDIR}/include") include_directories("${KDIR}/include/generated") # Include arch-specific kernel headers include_directories("${KDIR}/arch/${ARCH}/include") include_directories("${KDIR}/arch/${ARCH}/include/generated") # Set some useful variables set(MODULE_NAME mymod) set(SRC_FILE "${MODULE_NAME}.c") set(OBJ_FILE "${MODULE_NAME}.o") set(KO_FILE "${MODULE_NAME}.ko") # Generate Kbuild file in the source directory FILE(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/Kbuild "obj-m := ${OBJ_FILE}") # Custom `make` command used to build the module add_custom_command( OUTPUT ${KO_FILE} COMMAND $(MAKE) -C ${KDIR} modules ARCH=${ARCH} M=${CMAKE_CURRENT_BINARY_DIR} src=${CMAKE_CURRENT_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} DEPENDS ${SRC_FILE} VERBATIM ) add_custom_target(mymod ALL DEPENDS ${KO_FILE}) add_library(dummy_target "${SRC_FILE}") 上面的CMakeLists.txt可以很好地构建以下mymod.c内核模块: #include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h> int __init myinit(void) { pr_info("Hello World!\n"); return 0; } void __exit myexit(void) { pr_info("Goodbye World!\n"); } module_init(myinit); module_exit(myexit); MODULE_VERSION("0.1"); MODULE_AUTHOR("Marco Bonelli"); MODULE_DESCRIPTION("Test module"); MODULE_LICENSE("GPL 2.0"); 注意,MODULE_LICENSE()是强制性的,如果没有指定许可证,内核Makefile将拒绝构建模块! 最终项目在 CLion 中应如下所示: 注意:Kbuild文件是由CMakeLists.txt自动生成的。您需要写入的唯一两个文件是 CMakeLists.txt 和 mymod.c。 唯一的问题(我不确定如何解决)是,正如您从上面的屏幕截图中看到的那样,CLion 似乎认为它还应该考虑用户空间包含诸如 /usr/include、/usr/x86_64-linux-gnu/include 等目录。这些绝对应该不被考虑用于内核模块,但我不确定如何使用CMakeLists.txt禁用/删除它们。
我通过内核模块实现了一个功能,并通过分发 *.ko 文件将其部署在多台机器上。希望收到*.ko文件的用户无法获取诸如
我正在尝试编写一个简单的Linux内核模块,以从运行RaspberryPi OS 64位的RaspberryPi 4B的Thermal_zone0读取温度。我总是可以做 cat /sys/class/Thermal/Thermal_z...