编写Linux内核模块是不是需要编译自己的内核?

     2023-02-19     119

关键词:

【中文标题】编写Linux内核模块是不是需要编译自己的内核?【英文标题】:Does Writing Linux Kernel Module Require Compiling Own Kernel?编写Linux内核模块是否需要编译自己的内核? 【发布时间】:2021-08-03 09:23:45 【问题描述】:

我在 Ubuntu x86_64 上有一个简单的 hello world 内核模块:

#include <linux/module.h>

static int 
mod_init(void)

  printk(KERN_INFO "RYANhello world\n");
  return 0;


static void 
mod_exit(void)

  printk(KERN_INFO "RYANgoodbye world\n");


MODULE_LICENSE("GPL");

module_init(mod_init);
module_exit(mod_exit);

生成文件:

KERNEL_DIR := /lib/modules/$(shell uname -r)/build
CUR_DIR := $(shell pwd)
obj-m := module.o

default:
    $(MAKE) -C $(KERNEL_DIR) M=$(CUR_DIR) modules

当我sudo insmod module.ko 时,我得到insmod: ERROR: could not insert module module.ko: Invalid parameters。检查dmesg

loading out-of-tree module taints kernel
module verification failed: signature and/or required key missing - tainting kernel

重复insmod 产生module is already loaded 但是/var/log/syslog 没有显示它加载的痕迹(即printk 消息不存在)。另外,运行sudo rmmod module.ko

rmmod: ERROR: ../libkmod/libkmod-module.c:1941 kmod_module_get_holders() could not open '/sys/module/module/holders': No such file or directory
rmmod: ERROR: Module unloading is not supported

这似乎表明它没有加载,即使dmesg 说它是?

解决常见问题;我的主机内核和 gcc 版本与我编译时使用的相同。

因此,这使我认为未签名的模块是问题所在。要禁用此功能,我是否必须使用适当的.config 编译和安装我自己的内核?换句话说,要在具有强制签名的现代 GNU/Linux 操作系统上编写和测试您自己的内核模块,您是否必须编译和安装您自己的内核?

编辑 CONFIG_MODULE_SIG_FORCE 没有在我的/boot/config-5.8.0-53-generic 中设置,所以看起来我应该能够加载我的模块,尽管带有受污染的内核消息。那么,为什么我会收到Invalid parameters?

【问题讨论】:

askubuntu.com/questions/483283/… 有什么帮助吗? @ChristinaJacob CONFIG_MODULE_SIG_FORCE 没有在我的/boot/config-5.8.0-53-generic 中设置,所以看起来我应该能够加载我的模块,尽管带有tainted kernel 消息。那么,为什么我会收到Invalid parameters 检查内核是否支持模块卸载。内核是用这个标志 MODULE_UNLOAD 构建的 @Varun CONFIG_MODULE_UNLOAD 在我的内核中设置。 @RyanMcClue 在执行 rmmod 时打印任何 dmesg。您为 rmmod 提供的打印来自用户空间 【参考方案1】:

首先检查dmesg insmod 它说模块已经加载。由于我以前从未加载过这个,这促使我认为这个名字已经被占用了。 低头,重命名module.c/module.o --&gt; example.c/example.o 解决了这个问题。 invalid parameters 消息让我大吃一惊。

【讨论】:

编写简单的内核模块

...最初学习使用LinuxOS,到学习Linux内核,再到自己编写内核模块,顺利实现模块的装载和卸载,这是一个非常有趣的过程。下面我将内核模块的学习内容和大家分享,将学习Linux内核的快乐简单的传递。    构... 查看详情

已编译模块的数量是不是会影响 RAM 中 Linux 内核的大小?

】已编译模块的数量是不是会影响RAM中Linux内核的大小?【英文标题】:IsnumberofcompiledmodulesaffectingsizeoflinuxkernelinRAM?已编译模块的数量是否会影响RAM中Linux内核的大小?【发布时间】:2013-08-0215:23:23【问题描述】:当我编译Linux内... 查看详情

怎样快速启动linux系统?

...。只需撤消所有不想启动的服务选项。  #2:撤消多余的内核模块  假如你的桌面连接到以太网,就不需要装载无线内核模块。这是较为困难的任务,可能需要重新编译内核,而编译内核不是可以轻松担当的工作。为此,你大... 查看详情

如何编译一个linux下的驱动模块

...构造过程与用户空间的应用程序的构造过程有显著不同;内核是一个大的、独立的程序,对于它的各个部分如何组合在一起有详细的明确的要求。Linux2.6内核的构造过程也与以前版本的内核构造过程不同;新的构造系统用起来更加... 查看详情

为 Linux VM 编写内核模块

】为LinuxVM编写内核模块【英文标题】:WriteaKernel-ModulforLinuxVM【发布时间】:2022-01-0605:48:50【问题描述】:这是我第一次在这里写问题,所以如果信息丢失或我写错了格式,我提前道歉。我目前正在参加一个系统课程,我们正在... 查看详情

linux为啥要编译内核

...下是几个问题。1:平时在linux下c编程,也没有用到编译内核什么的,经常看到“内核源码树”这个词汇,就不懂的。难道我正在使用的这个linux系统不是编译出来的一个系统吗?为什么还要再编译一次?2:下载源码后编译出来... 查看详情

如何编译linux版本

参考技术A编译安装内核下载并解压内核解压内核:tarxflinux-2.6.XX.tar.xz定制内核:makemenuconfig参见makefilemenuconfig过程讲解编译内核和模块:make生成内核模块和vmlinuz,initrd.img,Symtem.map文件安装内核和模块:sudomakemodules_installinstall... 查看详情

linux内核模块开发怎么进行单元测试

...是要和你当前运行的kernel版本相匹配的。参考技术A如何编写Linux设备驱动程序回想学习Linux操作系统已经有近一年的时间了,前前后后,零零碎碎的一路学习过来,也该试着写的东西了。也算是给自己能留下一点记忆和回忆吧!... 查看详情

linux内核编译

内核中的功能除了核心功能之外,在编译时,大多功能都有三种选择:1、不使用此功能;2、编译成内核模块;3、编译进内核;如何手动编译内核:makegconfig:Gnome桌面环境使用,需要安装图形开发库组:GNOMESoftwareDevelopmentmakekconfi... 查看详情

linux下网络配置问题

...,windows那边有驱动不代表linux这边有驱动,自己重新编译内核模块,把你网卡芯片对应的驱动模块选上,重新编译模块,然后找到编译好的.so文件cp到/lib/modules/对应内核版本文件夹下,再去modules.conf里添加一个alias。参考技术A应... 查看详情

开启驱动开发之路

...必须搭建一个nfs服务器。二、驱动开发的步骤(1)驱动源码编写、Makefile编写、编译(2)insmod装载模块、测试、rmmod卸载模块三、实践(1) 查看详情

如何为不同的 linux 内核编译一个 linux 内核模块

】如何为不同的linux内核编译一个linux内核模块【英文标题】:Howtocompilealinuxkernelmodulefordifferentlinuxkernel【发布时间】:2021-08-1622:25:24【问题描述】:我对内核编程有点陌生,但几天来我一直在为这个问题苦苦挣扎。我有一台带有... 查看详情

Linux内核模块编译

】Linux内核模块编译【英文标题】:Linuxkernelmodulecompiling【发布时间】:2011-05-0302:15:31【问题描述】:我尝试编译简单的linux内核模块:#include<linux/module.h>#include<linux/kernel.h>intinit_module(void)printk("Helloworld1.\\n");return0;voidclean... 查看详情

linux内核编译linux内核⑦(安装内核模块|安装内核|重启系统|查看当前内核版本)(代码片段)

文章目录一、安装内核模块二、安装内核三、重启系统四、查看当前内核版本一、安装内核模块确保Linux内核编译完成,没有任何报错之后;参考【Linux内核】编译Linux内核⑥(安装OpenSSL|安装其它依赖库|内核编译完成)博客;进入Linux... 查看详情

linux内核配置编译以及模块开发(代码片段)

文章目录Linux内核简介Linux体系结构Linux内核架构虚拟文件系统内核源码结构Linux内核配置与编译为什么要配置内核?内核配置方法编译内核过程Linux内核模块开发什么是内核模块内核模块设计安装与卸载模块可选信息模块申明... 查看详情

linux内核配置编译以及模块开发(代码片段)

文章目录Linux内核简介Linux体系结构Linux内核架构虚拟文件系统内核源码结构Linux内核配置与编译为什么要配置内核?内核配置方法编译内核过程Linux内核模块开发什么是内核模块内核模块设计安装与卸载模块可选信息模块申明... 查看详情

不修改linux内核文件,直接用makefile编译驱动,是否要先把内核编译一遍?

不修改内核文件编译驱动模块:建立一个名字为led的文件夹。把LED驱动源码micro2440_leds.c复制到该目录。在该目录下创建Makefile文件如下:点击(此处)折叠或打开obj-m:=micro2440_leds.oKERNEL_DIR?=/home/samba/linux-2.6.32.2-micro2440all: $(MAKE)-C$(KERN... 查看详情

hello驱动编写-最简单的驱动程序(代码片段)

在前面学习了树莓派字符设备驱动代码编写和编译,但一直不是特别明白,现在学习100ask_imx6ull_mini的驱动框架时更加清楚了一些,所以重新记录下来。整个编写和编译流程与树莓派区别不大,思路相同。内核模块... 查看详情