内核模块时指的是在操作系统内核中动态加载的一段代码,它可以扩展和增强操作系统的功能。内核模块通常用于为操作系统添加新的设备驱动程序、文件系统、网络协议栈等功能。

内核模块是以二进制形式存在的(*.ko),它们被编译为对象文件,并在运行时被加载到操作系统内核中。内核模块与操作系统内核紧密耦合,可以访问内核的数据结构、函数和服务,并与操作系统的其他部分进行交互。

如何开发一个可在运行时动态加载的内核模块?下面是一个 hello world.ko 的完整实例。

1 程序实例

#include <linux/module.h>

static int hello_init(void) {
printk(KERN_INFO "Hello, World!\n");
return 0;
} static void hello_exit(void) {
printk(KERN_INFO "Goodbye, World!\n");
} module_init(hello_init);
module_exit(hello_exit); // 内核模块信息。以下为可选内容,不止这些,仅供参考
MODULE_AUTHOR("Hong");
MODULE_DESCRIPTION("A simple hello world module");
MODULE_VERSION("0.1");
MODULE_LICENSE("GPL");

解释:

1)必须包含的头文件:linux/module.h

2)规定初始化函数 module_init() 和退出函数 module_exit()

2 内核模块编译

使用 make 进行编译,需要提前编写好 Makefile,指定编译为一个可加载的内核模块:

# hello_kernle.ko Makefile
obj-m := hello_kernel.o

编译指令为:

make -C /usr/src/kernels/4.19.91-26.6.19.kos5.x86_64/ M=/root/makefile_test/ko_module/ modules

通常直接将编译指令编写到 Makefile 中,重写 Makefile

obj-m := hello_kernel.o

all:
make -C /usr/src/kernels/$(shell uname -r)/ M=$(shell pwd) modules clean:
rm -f *.o *.ko *.mod* *.order *.symvers

执行 make,将触发 make -C /usr/src/kernels/$(shell uname -r)/ M=$(shell pwd) modules

执行 make clean,将触发 rm -f *.o *.ko *.mod* *.order *.symvers

3 加载验证内核模块

使用以下指令,操作内核模块:

# 加载内核模块
insmod hello_kernel.ko # 列出并检索内核模块
lsmod | grep hello_kernel # 查看内核模块信息
modinfo hello_kernel.ko # 移除内核模块
rmmod hello_kernel

验证输出:

tail -f /var/log/message

4 常见问题

签名校验失败
[51418.816072] hello_kernel: loading out-of-tree module taints kernel.
[51418.816100] hello_kernel: module verification failed: signature and/or required key missing - tainting kernel

此问题的成因是,选择编译的内核配置项开启了内核模块签名校验功能。

解决方案:

a)手动给编写的内核模块签名(本文不采用);

b)直接关掉内核模块签名校验的配置项。

进入编译内核源码根目录下,进入配置菜单:

注意本示例的内核版本为 4.19

cd /usr/src/kernels/$(uname -r)/
make menuconfig

进入 Enable loadable module support, 关闭 Module signature verification 选项,右下角保存退出。

view .config 查看配置是否生效。

重新编译内核模块,问题解决。

内核模块(.ko) 开发入门的更多相关文章

  1. openresty 前端开发入门五之Mysql篇

    openresty 前端开发入门五之Mysql篇 这章主要演示怎么通过lua连接mysql,并根据用户输入的name从mysql获取数据,并返回给用户 操作mysql主要用到了lua-resty-my ...

  2. java WEB开发入门

    WEB开发入门 1 进入web JAVASE:标准- standard   JAVA桌面程序 GUI    SOCKET JAVAEE:企业-浏览器控制  web 2 软件结构 C/S :client ...

  3. [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解

    原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...

  4. [译]:Xamarin.Android开发入门——Hello,Android深入理解

    返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...

  5. [译]:Xamarin.Android开发入门——Hello,Android快速上手

    返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...

  6. VR原理讲解及开发入门

    本文是作者obuil根据多年心得专门为想要入门的VR开发者所写,由52VR网站提供支持.   1. VR沉浸感和交互作用产生的原理:   在之前,我们观看一个虚拟的创造内容是通过平面显示器的,52VR ...

  7. Eclipse_luna_J2EE_For_JS+tomcat8.0环境搭建、配置、开发入门

    一.所有需要的软件.插件等下载地址 J2SE的官方下载路径:http://www.oracle.com/technetwork/java/javase/downloads/index.html Ecl ...

  8. OWIN的理解和实践(三) –Middleware开发入门

    上篇我们谈了Host和Server的建立,但Host和Server无法产出任何有实际意义的内容,真正的内容来自于加载于Server的Middleware,本篇我们就着重介绍下Middleware的开发 ...

  9. [Cordova] Plugin开发入门

    [Cordova] Plugin开发入门 Overview Cordova的设计概念,是在APP上透过Web控件来呈现Web页面,让Web开发人员可以操作熟悉的语言.工具来开发APP.使用Web页面来 ...

  10. 报表引擎API开发入门— EJB程序数据源

    我们前面讲了几个数据源,今天我们来讲一下EJB数据源,这篇讲完我们数据源这部分就讲完了.数据连接不需要直接访问数据库,而是使用EJB做为数据源.FR通过定义程序数据集使用EJB的相关类获取到EJB数据 ...

随机推荐

  1. 2022最新 Navicat Premium 16中文软件激活安装永久使用正版(支持MAC+win)

    Navicat Premium 16中文正版永久使用,下载地址: 关注我的wx公众号"奋斗在IT"回复1015获取下载地址

  2. [htmlayout] csss! 改变值/文本

    <input type="text" value="123" /> <div class="test">内容内容&l ...

  3. java中有哪些并发的List?只知道一种的就太逊了

    java中有很多list,但是原生支持并发的并不多,我们在多线程的环境中如果想同时操作同一个list的时候,就涉及到了一个并发的过程,这时候我们就需要选择自带有并发属性的list,那么java中的并发 ...

  4. Go语言常用标准库——context

    文章目录 为什么需要Context 基本示例 全局变量方式 通道方式 官方版的方案 Context初识 Context接口 Background()和TODO() With系列函数 WithCance ...

  5. 素数是个什么东西 prime number

    /**  * *********************************************************************  * 只有1和它本身两个正因数的自然数,叫质数 ...

  6. Android应用中对于微信分享的实例及问题

    源码地址 如何分享 分享无相应 分享结果如何接收响应 微信 分享回调 (提示几点关键问题:   debug_key 一定要获得对应的签名码 然后和weixin官网的appid对应     ) 几点注意 ...

  7. Pricing

    Skip to main content Site Navigation Research Product Developers Safety Company Search   Pricing Sim ...

  8. macbook-键盘连击问题002

    https://support.apple.com/zh-cn/HT205662 如何清洁 MacBook 或 MacBook Pro 的键盘 如果您的 MacBook(2015 年及更新机型)或 M ...

  9. 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(9) -- 实现系统动态菜单的配置和权限分配

    在WPF应用端开发,它的界面类似于Winform端,因此我们也需要对系统的菜单进行动态配置,这样才能把系统的功能弹性发挥到极致,通过动态菜单的配置方式,我们可以很容易的为系统新增所需的功能,通过权限分 ...

  10. Maximum Diameter 题解

    Maximum Diameter 题目大意 定义长度为 \(n\) 的序列 \(a\) 的权值为: 所有的 \(n\) 个点的第 \(i\) 个点的度数为 \(a_i\) 的树的直径最大值,如果不存在 ...