Linux 使用C语言来加载和卸载内核模块

文章目录

  • 一、insmod/rmmod
    • 1.1 insmod
    • 1.2 rmmod
  • 二、C语言示例
    • 2.1 syscall
    • 2.2 dmeo

一、insmod/rmmod

1.1 insmod

Linux 使用insmod来加载内核模块:

NAMEinsmod - Simple program to insert a module into the Linux Kernel

使用strace来追踪其过程:

[root@localhost helloworld]# strace insmod helloworld.ko
execve("/usr/sbin/insmod", ["insmod", "helloworld.ko"], 0x7fffff3cc6e8 /* 27 vars */) = 0
......
open("/root/module/helloworld/helloworld.ko", O_RDONLY|O_CLOEXEC) = 3
.....
finit_module(3, "", 0)                  = 0
......
close(3)                                = 0
[root@localhost helloworld]#

可以看到使用finit_module系统调用来加载内核模块:

// linux-5.15/kernel/module.cSYSCALL_DEFINE3(finit_module, int, fd, const char __user *, uargs, int, flags)
{......return load_module(&info, uargs, flags);
}

1.2 rmmod

Linux 使用shell命令rmmod来卸载内核模块:

NAMErmmod - Simple program to remove a module from the Linux Kernel

使用strace来追踪其过程:

[root@localhost helloworld]# strace rmmod helloworld
execve("/usr/sbin/rmmod", ["rmmod", "helloworld"], 0x7ffdc01ddef8 /* 27 vars */) = 0
......
delete_module("helloworld", O_NONBLOCK) = 0
// linux-5.15/kernel/module.cSYSCALL_DEFINE2(delete_module, const char __user *, name_user,unsigned int, flags)
{......
}

二、C语言示例

2.1 syscall

NAMEsyscall - indirect system callSYNOPSIS#define _GNU_SOURCE         /* See feature_test_macros(7) */#include <unistd.h>#include <sys/syscall.h>   /* For SYS_xxx definitions */int syscall(int number, ...);DESCRIPTIONsyscall()  is a small library function that invokes the system call whose assembly language interface has the specified number with the specified arguments.  Employ‐ing syscall() is useful, for example, when invoking a system call that has no wrapper function in the C library.syscall() saves CPU registers before making the system call, restores the registers upon return from the system call, and stores any error code returned by the  sys‐tem call in errno(3) if an error occurs.Symbolic constants for system call numbers can be found in the header file <sys/syscall.h>.

syscall()是一个小型的库函数,用于调用具有指定编号和指定参数的汇编语言接口的系统调用。使用syscall()函数非常有用,特别是在调用在C库中没有封装函数的系统调用时。

2.2 dmeo

(1)C语言示例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <fcntl.h>int load_module(const char *modulePath) {int fd = open(modulePath, O_RDONLY);if (fd < 0) {perror("Failed to open module");return 1;}int result = syscall(__NR_finit_module, fd, "", 0);if (result < 0) {perror("Failed to load module");close(fd);return 1;}printf("Module loaded successfully\n");close(fd);return 0;
}int unload_module(const char *moduleName) {int result = syscall(__NR_delete_module, moduleName, O_NONBLOCK);if (result < 0) {perror("Failed to unload module");return 1;}printf("Module unloaded successfully\n");return 0;
}int main() {const char *modulePath = "./helloworld.ko";const char *moduleName = "helloworld";int loadResult = load_module(modulePath);if (loadResult != 0) {printf("Failed to load module\n");return 1;}int unloadResult = unload_module(moduleName);if (unloadResult != 0) {printf("Failed to unload module\n");return 1;}return 0;
}

(2)内核模块示例:

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>//内核模块初始化函数
static int __init lkm_init(void)
{printk("Hello World\n");return 0;
}//内核模块退出函数
static void __exit lkm_exit(void)
{printk("Goodbye\n");
}module_init(lkm_init);
module_exit(lkm_exit);MODULE_LICENSE("GPL");

结果:

[root@localhost helloworld]# ./a.out
Module loaded successfully
Module unloaded successfully[root@localhost helloworld]# dmesg -c
[368000.085692] Hello World
[368000.086536] Goodbye

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

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

相关文章

React中useEffect与useLayoutEffect有什么区别?

React中useEffect与useLayoutEffect有什么区别&#xff1f; 1. useEffect2. useLayoutEffect3. useEffect与useLayoutEffect的区别3.1 何时使用useLayoutEffect&#xff1f; 在React中&#xff0c;useEffect和useLayoutEffect都是用来处理副作用的Hook&#xff0c;例如数据获取…

童话里都是骗人的,靠可视化大屏升职加薪,除非老板脑子秀逗了。

可视化大屏有没有价值&#xff0c;肯定是有的&#xff0c;靠着可视化大屏升职加薪靠谱吗&#xff1f;不靠谱。 童话故事中的情节和元素往往是夸张和不现实的&#xff0c;不能完全应用于现实生活中。在现实世界中&#xff0c;升职加薪通常需要通过实际的工作表现、专业技能的提…

数据库练习(一)

完成以下SQL语句的编写&#xff1a; student表: score 表&#xff1a; 查询student表的所有记录 Select * from student; 查询student表的第2条到4条记录 select * from student LIMIT 1,3; 从student表查询所有学生的学号&#xff08;id&#xff09;、姓名&#xff08;n…

Java虚拟机——内存的分配详解

内存区域划分 对于大多数的程序员来说&#xff0c;Java 内存比较流行的说法便是堆和栈&#xff0c;这其实是非常粗略的一种划分&#xff0c;这种划分的“堆”对应内存模型的 Java 堆&#xff0c;“栈”是指虚拟机栈&#xff0c;然而 Java 内存模型远比这更复杂&#xff0c;想深…

react结合Redux实现全局状态管理

React与Redux结合使用&#xff0c;可以为React应用提供集中式的状态管理和复杂的业务逻辑处理能力。以下是React中使用Redux的基本步骤和关键概念&#xff1a; 安装所需库 确保已经安装了React和ReactDOM。然后安装Redux及其配套库&#xff1a; npm install redux react-redu…

基于云端部署,支持超大规模会议的召开,同时实现就近接入的功能

随着信息技术的飞速发展&#xff0c;云视频产品已成为企业沟通协作的重要工具。中国联通作为通信行业的领军企业&#xff0c;其云视频产品凭借多项技术优势&#xff0c;在市场中脱颖而出&#xff0c;成为众多企业的首选。 中国联通的云视频产品采用了先进的互联网高清技术&…

【计算机毕业设计】游戏售卖网站——后附源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

数据结构和算法(哈希表和图(A*算法精讲))

一 、哈希表 1.1 哈希表原理精讲 哈希表-散列表&#xff0c;它是基于快速存取的角度设计的&#xff0c;也是一种典型的“空间换时间”的做法 键(key)&#xff1a; 组员的编号如&#xff0c;1、5、19。。。 值(value)&#xff1a; 组员的其它信息&#xff08;包含性别、年龄和…

Python-VBA函数之旅-divmod函数

目录 1、divmod函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、相关文章&#xff1a; 个人主页&#xff1a;非风V非雨-CSDN博客 divmod函数在Python中具有广泛的应用场景&#xff0c;特别是在需要同时处理除法的商和余数的情况下。常见的应用场景有&a…

《系统架构设计师教程(第2版)》第9章-软件可靠性基础知识-04-软件可靠性设计

文章目录 1. 容错设计技术1.1 恢复块设计1.2 N版本程序设计1.3 冗余设计 2. 检错技术3. 降低复杂度设计4. 系统配置中的容错技术4.1 双机热备技术4.1.1 双机热备模式4.1.2 双机互备模式4.1.3 双机双工 4.2 服务器集群技术 1. 容错设计技术 1.1 恢复块设计 恢复块设计 选择一组…

Maven:<dependencyManagement>:依赖集中管理

dependencyManagement Maven &#xff1c;dependencyManagement&#xff1e;&#xff0c;请介绍一下 在Apache Maven构建工具中&#xff0c;<dependencyManagement> 是一个非常重要的元素&#xff0c;用于在一个项目或一组项目的顶级POM&#xff08;Project Object Model…

TCP/IP协议—TCP

TCP/IP协议—TCP TCP协议TCP通信特点TCP技术概念TCP定时器 TCP头部报文TCP连接三次握手&#xff08;建立连接&#xff09;四次挥手&#xff08;释放连接&#xff09;连接状态 TCP协议 传输控制协议&#xff08;TCP&#xff0c;Transmission Control Protocol&#xff09;是一种…

Springboot集成Ehcache3实现本地缓存

如果只需要在单个应用程序中使用本地缓存&#xff0c;则可以选择Ehcache&#xff1b;它支持内存和磁盘存储&#xff0c;这里不以注解方式演示&#xff0c;通过自己实现缓存管理者灵活控制缓存的读写&#xff1b; 1、引入相关依赖 <!-- ehcache3集成start --><depende…

苹果在中国市场衰退,全球市场跌幅最大,难怪慌忙大降价

日前市调机构IDC公布了今年一季度全球市场的手机品牌排名&#xff0c;数据显示苹果的跌幅最大&#xff0c;说明它不仅在中国市场衰退&#xff0c;在全球市场也出现衰退&#xff0c;如此也就不奇怪苹果史无前例的在3月份对iPhone15降价1500元促销了。 数据显示一季度苹果的出货量…

Java面试题:什么是Jenkins以及它在持续集成中的作用?Jenkins有哪些缺点呢?

Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作。它的主要目标是提供一个开放且易用的软件平台&#xff0c;使软件的持续集成成为可能。 在持续集成中&#xff0c;Jenkins的作用主要体现在以下几个方面&#xff1…

图像处理中的击中击不中变换

击中击不中变换&#xff08;Hit-or-Miss Transform&#xff09;是一种形态学图像处理操作&#xff0c;用于检测图像中符合特定条件的像素。 在击中击不中变换中&#xff0c;需要定义两个模板结构元素&#xff1a;击中模板&#xff08;hit template&#xff09;和击不中模板&am…

阿里云服务器公网带宽按固定和按使用流量怎么选?哪个优惠?

阿里云服务器的公网带宽计费模式分为“按固定带宽”和“按使用流量”&#xff0c;有什么区别&#xff1f;按固定带宽是指直接购买多少M带宽&#xff0c;比如1M、5M、10M、100M等&#xff0c;阿里云直接分配用户所购买的带宽值&#xff0c;根据带宽大小先付费再使用&#xff1b;…

k8s控制器(五)_____DaemonSet

DaemonSet控制器 DaemonSet控制器是Kubernetes中的一种控制器&#xff0c;用于确保集群中的每个节点都运行一个Pod的副本。它通常用于在整个集群中部署一些系统级别的服务&#xff1a; 在每一个node节点运行一个存储服务&#xff0c;例如gluster&#xff0c;ceph。在每一个no…

数据可视化高级技术Echarts(桑基图入门)

目录 一、什么是桑基图 二、基本特征 三、设计注意事项 四、使用Echarts进行初级绘制 1.首先不能忘记五个基本步骤 2.绘制的时需要将图像类型series.type设定为sankey类型。 一、什么是桑基图 桑基图&#xff08;Sankey diagram&#xff09;&#xff0c;即桑基能量分流图&…

2024很漂亮的个人主页HTML源码

源码介绍 很漂亮的个人主页HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 截图效果 源码下载 很漂亮的个人主页HTML源码