Linux模块代码、编译、加载、卸载一条龙

news2024/9/28 23:34:27

最近要写一个Linux的内核模块,记录一下内核模块的代码编写、编译、加载和卸载的基本流程,以作备忘,也希望能帮到有需要的同学。

模块代码

//代码来自https://yangkuncn.cn/kernel_INIT_WORK.html
//init_works.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/workqueue.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/delay.h>

struct my_struct_t {
    char* name;
    struct work_struct my_work;
};

static struct my_struct_t my_name;
static struct workqueue_struct* my_wq = NULL;
static int count;

void my_func(struct work_struct *work)
{
    struct my_struct_t* my_name = container_of(work, struct my_struct_t, my_work);
    printk(KERN_INFO "Hello kernel, my name is %s", my_name->name);
    for (count = 1; count < 20; count ++)
    {
        printk(KERN_INFO"count = %d\n", count);
        usleep_range(1000000, 1000000);
    }
}

static int __init example_init(void)
{
    int ret;
    printk(KERN_INFO"init kernel module\n");
    my_wq = create_workqueue("my wq");
    if (!my_wq)
    {
        printk(KERN_ERR "no memory for workqueue.\n");
        return 1;
    }
    printk(KERN_INFO "create workqueue succussfully.\n");
    my_name.name = "tom";

    INIT_WORK(&(my_name.my_work), my_func);
    ret = queue_work(my_wq, &(my_name.my_work));
    printk(KERN_INFO"queue work ret = :%d", ret);
    return 0;
}

static void __exit example_exit(void)
{
    printk(KERN_INFO "Begin exiting work now...\n");
    flush_workqueue(my_wq);
    if (my_wq)
    {
        destroy_workqueue(my_wq);
    }
    printk(KERN_INFO "Exit work ok.\n");
}

module_init(example_init);
module_exit(example_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("DEBUG");

代码大体功能就是创建一个工作队列,在这个队列上每隔1秒打印一次count数字。

编译

Makefile 此处仅是单源文件的Makefile
多源文件Makefile编写

KVERS = $(shell uname -r)

# 要生成的模块名,这里会生成init_works.ko
MODULE_NAME := init_works

# 源文件目录
SRC_PATH := init_works/

# 作为一个ko模块进行编译
CONFIG_RUNYEE_CAMVIB=m

# Kernel modules
obj-$(CONFIG_RUNYEE_CAMVIB) := $(SRC_PATH)$(MODULE_NAME).o

# 指定模块的一些编译选项
EXTRA_CFLAGS=-g -O0

build: kernel_modules
kernel_modules:
	make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules

clean:
	make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean

Makefile和源代码相对路径
代码目录
执行make命令
编译输出

编译产物
执行完make之后,得到一堆东西,其中init_works.ko就是我们需要的内核模块文件。

加载模块

执行命令insmod

insmod init_works/init_works.ko

然后在终端再执行

dmesg --follow 

可以在终端看到一下输出
加载ko模块的输出
再用lsmod命令查看系统已经加载的模块
在这里插入图片描述
可以看到我们的模块已经成功加载到系统上了。

卸载

模块不需要的时候,我们可以卸载它
使用命令

rmmod init_works

卸载输出
从终端的输出可以看到,模块已经被卸载了。
再执行lsmod命令就会发现init_works模块没了,卸载成功!!!

参考

https://yangkuncn.cn/kernel_INIT_WORK.html
https://www.cnblogs.com/mrlayfolk/p/16119159.html
https://www.cnblogs.com/jjzd/p/6438641.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/129107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker-compose快速部署PostgreSQL

Docker-compose快速部署PostgreSQL&#xff1a; 利用docker-compose编排工具部署&#xff1a; docker-compose.yml 文件 version: "3.1" services:postgresql:image: postgres:12-alpinecontainer_name: postgresqlenvironment:POSTGRES_DB: postgresPOSTGRES_USE…

Python--数据容器总结

一、数据容器的分类 数据容器可以从一下视角进行简单的分类&#xff1a; 是否支持下标索引 支持&#xff1a;列表、元组、字符串 --序列类型不支持&#xff1a;集合、字典 --非序列类型是否支持重复元素 支持&#xff1a;列表、元组、字符串 --序列类型不支持&#xff1a;集…

自动生成单测代码插件Squaretest

今天来介绍一款工具Squaretest&#xff0c;它是一款自动生成单元测试的插件&#xff0c;会用到它也是因为最近公司上了代码质量管控的指标&#xff0c;会考评各个项目的单元测试覆盖率&#xff0c;以及sonar扫描出来的各种问题。 很多老项目老代码&#xff0c;或者着急交付的项…

第十八讲:神州三层交换机DHCP中继服务的配置

当DHCP客户机和DHCP服务器不在同一个网段时&#xff0c;由DHCP中继传递DHCP报文。增加DHCP中继功能的好处是不必为每个网段都设置DHCP服务器&#xff0c;同一个DHCP服务器可以为很多个子网的客户机提供网络配置参数&#xff0c;即节约了成本又方便了管理。这就是DHCP中继的功能…

vue经历从2.0到3.0更新

​编辑vue专栏收录该内容 9 篇文章2 订阅 订阅专栏 vue经历从2.0到3.0更新之后&#xff0c;简⽽⾔之就是变得更轻&#xff0c;更快&#xff0c;使⽤起来更加⽅便&#xff0c;每⼀次的版本迭代都是对上⼀个版本的升级优化&#xff0c;不管 是对于我们开发者还是对于⽤户体验都…

铁威马NAS教程之使用CloudSync应用轻松同步备份网盘数据

铁威马在TOS 5系统中&#xff0c;将各种云盘的同步集合到了一个应用——CloudSync&#xff0c;更方便用户使用。只需要下载安装CloudSync&#xff0c;就可以在TNAS和各种云盘之间&#xff0c;实现快速安全的数据同步、分享文件。 1.TOS应用中心下载CloudSync应用&#xff1b; …

中国霍尔效应电流传感器市场规模达到了192.71百万美元?

霍尔效应&#xff0c;是指有小电流通过的一个半导体薄片置于磁场中&#xff0c;受到磁场作用影响电流发生偏转&#xff0c;在控制电流的垂直方向上的半导体两侧形成了电压差&#xff0c;该电势差就是霍尔电压。霍尔电压的大小&#xff0c;与磁场强度和半导体内通过的控制电流成…

JSP ssh 在线英语学习平台myeclipse开发oracle数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh在线英语学习平台是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S 模式开发。开发环境为TOMCAT7.0…

【MySQL从入门到精通】【高级篇】(三十)记一次mysql5.7的新特性derived_merge的坑

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

深度学习 Day23——利用RNN实现天气预测

深度学习 Day23——利用RNN实现天气预测 文章目录深度学习 Day23——利用RNN实现天气预测一、前言二、我的环境三、前期工作1、导入依赖项2、导入数据3、查看数据基本信息4、查看各列数据的数据类型5、转换数据集中有关时间数据转换为时间格式6、删除Date标签列7、查看所有列的…

多版本并发控制(MVCC)

MVCC机制概述 MVCC&#xff08;Multi-Version Concurrency Control&#xff09;&#xff0c;中文是多版本并发控制&#xff0c;是指在使用READ COMMITTED、REPEATABLE READ这两种隔离级别的事务在执行SELECT操作时访问记录的版本链的过程&#xff0c;从而在不加锁的前提下使不…

基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种

基于LSTM三分类的文本情感分析&#xff0c;采用LSTM模型&#xff0c;训练一个能够识别文本postive, neutral, negative三种 &#xff0c;含数据集可直接运行 完整代码下载地址&#xff1a;基于LSTM三分类的文本情感分析 基于LSTM三分类的文本情感分析 背景介绍 文本情感分析…

Comic Life - 超棒的漫画制作工具,拥有多种动画模版,创作属于自己的漫画

Comic Life - 超棒的漫画制作工具&#xff0c;拥有多种动画模版&#xff0c;创作属于自己的漫画 Comic Life是一个照片编辑器&#xff0c;能够添加各种效果&#xff0c;并基于它们创建漫画。该工具包包括各种各样的模板&#xff0c;可以很容易地将照片放置在工作表上&#xff0…

CKEditor 为你的Flask项目添加一个富文本编辑器

人家高高在上的CKEditor是有个官网的&#xff01;&#xff01; WYSIWYG HTML Editor with Collaborative Rich Text EditingRock-solid, Free WYSIWYG Editor with Collaborative Editing, 200 features, Full Documentation and Support. Trusted by 20k companies.https://c…

SBM模型分析全流程

数据包络分析DEA时&#xff0c;其研究投入产出效率情况&#xff0c;并且其假定投入和产出之间存在单调线性关系&#xff0c;其为一种线性规划技术来确定DMU相对效率的方法。但有时候会多出下‘非期望产出’&#xff0c;就是不希望有它产出&#xff0c;比如资金投入、教育投入换…

【Unity3D日常开发】Unity3D拓展开发:UI界面控制,UI界面的显示和隐藏实现

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群&#xff1a;1040082875 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中&#xff0c;可能遇到管理…

2022最后一天盘点

今天是今年最后的一天工作日&#xff0c;对于我来说就是今年的最后一天&#xff0c;因为放假了我就不需要思考了&#xff08;当然公司后端程序员要保持24小时oncall&#xff09; 1 阳完之后 还是有些 咳嗽&#xff0c;公司此起彼伏的咳嗽声&#xff0c;不知道什么时候所有人都…

21.合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[…

【日常系列】LeetCode《23·回溯2》

数据规模->时间复杂度 <10^4 &#x1f62e;(n^2) <10^7:o(nlogn) <10^8:o(n) 10^8<:o(logn),o(1) 内容 lc 401 &#xff1a;二进制手表 https://leetcode.cn/problems/binary-watch/ 提示&#xff1a; 0 < turnedOn < 10 class Solution:def readBinary…

java jvm详解

java 系列文章之JVM 文章目录java 系列文章之JVM一、JVM1.基本概念2.运行过程二、线程三、JVM 内存区域1. 程序计数器(线程私有)2. 虚拟机栈(线程私有)3. 本地方法区(线程私有)4. 堆&#xff08;Heap-线程共享&#xff09;-运行时数据区5. 方法区/永久代&#xff08;线程共享&a…