操作系统练习:创建内核模块,并加载和卸载模块

news2024/11/26 10:42:40

说明

本文记录如何创建和编译一个内核模块,以及加载和卸载内核模块。为《操作系统概念(第九版)》第二章,关于“Linux内核模块”的练习题。

创建内核模块

注:我这里是基于阿里云的轻量应用服务器(即当前博客服务器)

  • 首先SSH进入到自己的服务器,然后新建一个“kernel”目录,用于存放模块相关的文件

  • 然后新建一个“example.c”文件,并将下面的代码复制到文件中

vim example.c

example.c的具体内容如下:

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

/* This function is called when the module is loaded. */
int example_init(void)
{
        printk(KERN_INFO "Loading example module\n");

        return 0;
}

/* This function is called when the module is removed. */
void example_exit(void)
{
        printk(KERN_INFO "Removing example module\n");
}

/* Macros for registering module entry and exit points */
module_init(example_init);
module_exit(example_exit);

/* 许可,描述和作者信息 */
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("EXAMPLE MODULE");
MODULE_AUTHOR("GENE");

创建编译文件Makefile

  • 创建一个文件“Mkefile”,然后文件具体内容如下:
KVERS = $(shell uname -r)

# 生成模块名(和上面一步创建的C文件名称对应)
MODULE_NAME := example

# 源文件目录(因为我的Makefile文件与C文件在同目录,所以这里值为空)
SRC_PATH :=

# 作为一个模块进行编译(作为一个模块进行编译时,值为m)
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 SUBDIRS=$(CURDIR) modules
clean:
        make -C /lib/modules/$(KVERS)/build SUBDIRS=$(CURDIR) clean

编译内核模块

  • 执行make命令,然后可以得到一系列编译后的文件,其中“example.ko”即为编译后的内核模块
make

file

加载和卸载内核模块

  • 在加载内核模块之前,可以输入“lsmod”命令查看当前已经加载的内核模块
lsmod
  • 加载内核模块:
insmod example.ko
  • 加载完成之后,可以查看已加载的内核模块,也可以输入“dmesg”命令查看打印到内核日志缓冲区的消息
dmesg
  • 最后,可以卸载内核模块
rmmod example

file

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

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

相关文章

JS混淆原理

JS混淆原理 •eval 加密 通过eval去执行函数通常和webpack打包拼接一起使用• 变量混淆 ​ 变量名混淆&#xff0c;十六进制替换&#xff0c;随机字符串替换• 属性加密 ​ 一套组合算法&#xff0c;将属性加密生成• 控制流平坦化 逻辑处理块统一加上前驱逻辑块&#xff0c…

最近写了一个Python知识分享网,开源了

大家好&#xff0c;我是锋哥&#xff01; 项目简介 肝了一周&#xff0c;Python知识分享网上线发布了。www.python222.com 虽然2很多&#xff0c;但是这个网站一点都不二&#xff0c;网站主要分享一些Python相关的技术知识&#xff0c;技术资源以及后面我的Python相关干货课程…

C# Modbus通信从入门到精通(9)——Modbus RTU(0x0F功能码)

1、0F(0x0F)写单个寄存器输出 使用该功能码能将一个寄存器的值写入到远程地址中。 2、发送报文格式 更详细的格式如下: 从站地址+功能码+线圈起始地址高字节+线圈起始地址低字节++线圈数量高字节+线圈数量低字节+字节计数+输出值最高字节+…+输出值最低字节+CRC,其中CRC是…

Linux学习之数组

数组可以存储同一类型的值&#xff0c;定义数组的常见方式是数组名(变量1 变量2 变量3......变量n)&#xff0c;使用小括号&#xff08;圆括号&#xff0c;()&#xff09;括起来&#xff0c;每个变量之间使用空格隔开。比如IPS数组可以存储多个ip变量&#xff0c;定义为IPS(192…

飞书ChatGPT机器人 – 打造智能问答助手实现无障碍交流

文章目录 前言环境列表1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 前言 在飞书中创建chatGPT机器人并且对话&#xff0c;在下面操作步骤中…

设计模式再探-备忘录模式

目录 一、背景介绍二、思路&方案三、过程1.简介,定义2.类图3.符合面向对象的地方4.按照面向对象还可以优化的地方5.扩展-json转化、序列化 四、总结五、升华 一、背景介绍 最近在做一学期的语文课&#xff0c;每一节课结束的时候&#xff0c;需要将这节课上到哪儿了给记录…

SpringBoot使用JWT进行身份验证

JWT身份验证的流程 用户登录&#xff1a; 用户向服务器提供他们的用户名和密码。 服务器验证&#xff1a;服务器接收到请求&#xff0c;验证用户名和密码。 生成JWT&#xff1a;如果用户名和密码验证通过&#xff0c;服务器将创建一个 JWT。 JWT 包含了一些数据&#xff08;称…

JS混淆原理2023

JS混淆原理 •eval 加密 通过eval去执行函数通常和webpack打包拼接一起使用• 变量混淆 ​ 变量名混淆&#xff0c;十六进制替换&#xff0c;随机字符串替换• 属性加密 ​ 一套组合算法&#xff0c;将属性加密生成• 控制流平坦化 逻辑处理块统一加上前驱逻辑块&#xff0c…

kubeproxy和service dns整体原理

iptables知识 五条链 iptables是linux内核集成的IP信息过滤规则&#xff0c;负责将发往主机的网络包进行分发&#xff0c;转换等。当客户端请求服务器的某个服务时&#xff0c;请求信息会先通过网卡进入服务器内核&#xff0c;这时iptables会对包进行过滤&#xff0c;决定这些…

Docker安装卸载

说明&#xff1a;在大型的项目开发中&#xff0c;各种开发软件所需的环境各不相同&#xff0c;所需的依赖也时常发生冲突。而Docker将开发软件&#xff0c;和所需的依赖、函数库、配置打包成一个可移植的镜像文件&#xff0c;在Docker的容器中运行&#xff0c;使用沙箱机制&…

线程基础和等待唤醒机制

一、基础 1、进程和线程 进程&#xff1a;进程是用来加载指令、管理内存、管理IO的&#xff0c;操作系统会以进程为单位分配系统资源&#xff08;cpu、内存等资源&#xff09;&#xff0c;进程是资源分配的最小单位线程&#xff1a;线程是操作系统cpu调度的最小单位&#xff…

用Linux模拟实现进度条

1.设置文件&#xff0c;以及创建makefile 2.make 的相关用法 make存在的目的就是为了在文件多的时候&#xff0c;gcc 文件名&#xff0c;你可能要输入很多次&#xff0c;但是make的存在&#xff0c;一句make指令就可以完成了。 process [生成文件] : 与之有关的文件。下一行就…

Sparse Input Novel View Synthesis

文章目录 1.《Vision transformer for nerf-based view synthesis from a single input image》【WACV2023】摘要动机方法实验 2.《SparseFusion: Distilling View-conditioned Diffusion for 3D Reconstruction》【CVPR23】动机Related workApproach总结 3.《NerfDiff: Single…

NetSuite ERP顾问的进阶之路

目录 1.修养篇 1.1“道”是什么&#xff1f;“器”是什么&#xff1f; 1.2 读书这件事儿 1.3 十年计划的力量 1.3.1 一日三省 1.3.2 顾问损益表 1.3.3 阶段课题 2.行为篇 2.1协作 2.2交流 2.3文档管理 2.4时间管理 3.成长篇 3.1概念能力 3.1.1顾问的知识结构 …

TCP缓冲区和4次挥手调优

目录 如何修改TCP缓冲区才能兼顾并发数量与传输速度&#xff1f; 四次挥手性能调优 1,为什么建立连接是三次握手&#xff0c;而关闭连接需要四次挥手呢? 2.四次挥手的流程,注意5个状态 3.主动方优化 4,被动方调优 最后 如何修改TCP缓冲区才能兼顾并发数量与传输速度&…

NUC972开发板学习过程

1、搭建linux环境的过程&#xff0c;设置交叉编译器的环境变量过程中会出现各种问题&#xff1b; 解决方法&#xff1a; 第一步、一定要Ubuntu系统换源&#xff0c;换源后sudo apt-get update&#xff1b; 第二步、sudo apt-get install lib32stdc6 第三步、使用 vim编辑器…

创新指南|连锁经营,先从单店盈利模型做起

随着数字化时代的到来&#xff0c;数据成为了企业创新的重要资源。有价值的数据的涌现和发展为企业提供了前所未有的机会。数据为创新带来新动力&#xff0c;创造了新产品和服务、产生了新的商业模式&#xff0c;并带来了新的创业机会。数据驱动的创新已成为许多企业创新的重要…

4.1.tensorRT基础(1)-概述

目录 前言1. tensorRT基础概述2. tensorRT补充知识2.1 什么是tensorRT&#xff1f;2.2 tensorRT特性2.3 tensorRT工作流程2.4 常见方案2.5 tensorRT库文件 总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#…

springboot+ElasticSearch+Logstash+Kibana实现日志采集ELK

ElasticSearchLogstashKibana日志管理 一、什么是ELK? ELK是Elasticsearch、Logstash、Kibana的简称&#xff0c;这三者是核心套件&#xff0c;但并非全部。一般情况下我们可以把日志保存在日志文件当中&#xff0c;也可以把日志存入数据库当中。但随着业务量的增加&#xf…

2.多线程-初阶(上)

文章目录 1. 认识线程&#xff08;Thread&#xff09;1.1 概念1.2 第一个多线程程序1.3 创建线程1.3.1方法1 继承 Thread 类1.3.2方法2 实现 Runnable 接口 1.4 多线程的优势-增加运行速度1.5 PCB、PID、进程和线程之间的关系 2. Thread(/θred/) 类及常见方法2.1 Thread 的常见…