Linux内核开发-编写一个内核模块

2024-06-23 22:04

本文主要是介绍Linux内核开发-编写一个内核模块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

0.前言

上一章(点击返回上一章)已经完成了将ubuntu原始内核替换成了自己编好的内核。本章开始编写一个内核模块。

1.内核模块

1.1 什么是内核模块

Linux内核模块可独立于内核之外进行编译,可以在内核运行时动态加载、卸载。内核模块以.ko为后缀。

1.2 操作内核模块常用的指令

# 查看当前正在运行的模块
lsmod#插入一个模块
insmod module_name# 卸载一个模块
rmmod module_name

2. 编写一个内核模块

2.1 编写代码

开始编写一个keinel module(命名为km),第一个文件是km_main.c,内容如下:

#include <linux/kernel.h>
#include <linux/module.h>                    /* 内核模块必需的头文件 */MODULE_LICENSE("GPL");                       /* 声明这是GNU General Public License的任意版本 */
MODULE_AUTHOR("Myself");                     /* 模块开发者,一般写开发者邮箱 */
MODULE_DESCRIPTION("Linux kernel module");   /* 模块功能简单描述 */static int __init km_init(void)              /* 模块初始化 */
{int ret = 0;printk("My kernel module init success!\n");return ret;
}static void __exit km_exit(void)             /* 模块退出 */
{printk("My kernel module exit success!\n");
}module_init(km_init); /* 模块初始化函数声明:装载模块时从此函数开始运行 */
module_exit(km_exit); /* 模块退出函数声明:模块卸载时调用此函数 */

编写Makefile:

obj-m := km_main.o# 获取当前使用的内核版本
KERNEL_PATH := $(shell uname -r)# 当前内核目录
KDIR := /lib/modules/$(KERNEL_PATH)/buildall:make -C $(KDIR) M=$(PWD) modules
clean:rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.mod *.order

2.2 编译

直接在代码目录进行编译:

make

可以看到生成如下产物:
在这里插入图片描述

2.3 运行

2.3.1加载模块

insmod km_main.ko

注:如果不是在root下开发,需要加上sudo

查看是否加载成功:

lsmod

可以看到已经成功加载上了:
在这里插入图片描述

2.3.2卸载模块

rmmod km_main

lsmod即可看到模块已经卸载了
查看内核打印:

dmesg

可以看到代码中加的打印如下:
在这里插入图片描述

后续会逐步完善此内核模块,附上github地址可以看git log,看看整体的迭代记录(国内可能不能稳定,需要自己改DNS或科学上网)
github地址:github kernel_module
https://github.com/yicong-123/kernel_module

下一章:为内核模块写一个proc文件用于debug

这篇关于Linux内核开发-编写一个内核模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1088402

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_