Linux内核模块编程

news2024/10/7 8:29:54

访问【WRITE-BUG数字空间】_[内附完整源码和文档]

1 总体设计思路
Linux内核是单体式结构,相对于微内核结构而言,其运行效率高,但是系统的可维护性和可扩展性较差。为此,Linux提供了内核模块(module)机制,它不仅可以弥补单体式内核相对于微内核的一些不足,而不影响系统性能。内核模块的全称是动态可加载内核模块(Loadabe Kernel Module,KLM),简称为模块。模块是一个目标文件,能完成某种独立的功能,但其自身不是一个独立的进程,不能单独运行,可以动态载入内核,使其成为内核代码的一部分,与其他内核代码的地位完全相同,当不需要某模块功能时,可以动态卸载。实际上,Linux中大多数设备驱动程序或文件系统都以模块方式实现,因为它们数目繁多,体积庞大,不适合直接编译在内核中,而是通过模块机制,需要时临时加载。使用模块机制的另一个好处是,修改模块代码后只需要重新编译和加载模块,不必重新编译整个内核和引导系统,减少了更新系统功能的复杂度。

一个模块通常有一组函数和数据结构组成,用来实现某种功能,如实现一种文件系统、一个驱动模块或其他内核上层的功能。模块自身不是一个独立的进程,当前集成运行过程中调用到模块代码时,可以认为该段代码就代表当前进程在核心态运行。

模块编程可以使用内核的一些全局变量和函数,内核符号表就是用来存放所有模块都可以访问的符号及相应地址的表,存放在/proc/kallsyms文件中,可以使用“cat /proc/kallsyms”命令查看当前环境下导出的内核符号。

通常情况下,一个模块只需实现自己的功能,而无需导出任何符号;但如果其他模块需要调用这个模块的函数或数据结构时,该模块也可以导出符号。这样,其他模块可以使用由该模块导出的符号,利用现成的代码实现更加复杂的功能,这种技术也被称为模块层叠技术,当前已经使用在很多主流的内核源代码中。

2 主要函数的接口设计
module1:设计一个模块,要求列出系统中所有内核线程的程序名、PID、进程状态、进程优先级、父进程的PID
module2:设计一个带参数的模块,其参数为某个进程的PID号,模块的功能时列出该进程的家族信息,包括父进程、兄弟进程和子进程的程序名、PID号、进程状态
模块中包括两个函数:

定义module_init()函数初始化模块、定义module_exit()函数卸载模块
对于需要传递参数的模块,我们使用module_param()来传递参数
task_struct是Linux内核的一种数据结构,它会被装载到RAM中并且包含着进程的信息。每个进程都把它的信息放在 task_struct 这个数据结构体,task_struct 包含了这些内容:

标示符 : 描述本进程的唯一标识符,用来区别其他进程
状态 :任务状态,退出代码,退出信号等
优先级 :相对于其他进程的优先级
程序计数器:程序中即将被执行的下一条指令的地址
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据:进程执行时处理器的寄存器中的数据
I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等
有关进程信息还有以下三点需要了解:

保存进程信息的数据结构叫做 task_struct,可以在 include/linux/sched.h 中找到它
所有运行在系统中的进程都以 task_struct 链表的形式存在内核中
进程的信息可以通过 /proc 系统文件夹查看。要获取PID为400的进程信息,你需要查看 /proc/400 这个文件夹。大多数进程信息同样可以使用top和ps这些用户级工具来获取在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

腾讯轻量服务器python3.6升级到python3.9.9

由于不了解linux,要配合宝塔的查看文件,这样轻松很多 用得到的2个基本命令: sudo 管理员方式运行(我照着网上方法试几次安装都没成功,就是开头没加这句) pwd 显示当前的目录 第1步 下载新python sudo wget https://ww…

用写代码的方式画图-试下PlantUML吧 | 京东云技术团队

1 序言 所谓一图胜千言,大家平日在工作中编写文档时,往往都需要画各种图来表达中心思想,比如流程图、时序图、UML 图,很多人选择使用 Axure 、PrecessOn、Diagrams(darw.io)、XMind、Visio、yEd、Lucidcha…

2023年企业降低云支出的小方法汇总

据悉,2023年全球云基础设施服务支出全年将增长23%,也就是说云支出会持续增长。所以企业有效降低云支出是刻不容缓的。这里就给大家汇总了一些企业降低云支出的小方法,希望有用。 2023年企业降低云支出的小方法汇总 1、寻找价格折扣 提前计…

计算机图形学 | 实验十一:阴影计算

计算机图形学 | 实验十一:阴影计算 计算机图形学 | 实验十一:阴影计算帧缓冲创建一个帧缓冲纹理附件渲染缓冲对象附件总结 阴影映射算法思想深度贴图渲染阴影抗锯齿 assimp库结果 华中科技大学《计算机图形学》课程 MOOC地址:计算机图形学&a…

分布式ID解决方案(一)数据库号段方式

一、前言 在一些简单系统中,我们可以直接使用数据库ID自增方式来标识和保存数据,但是随着系统的逐渐复杂,数据量的日益增多,我们可能需要对数据表、数据库实现分库分表。单纯的使用数据库的ID自增无法满足业务场景了,所…

Seata 的可观测实践

作者:察溯 Seata 简介 Seata 的前身是阿里巴巴集团内大规模使用保证分布式事务一致性的中间件,Seata 是其开源产品,由社区维护。在介绍 Seata 前,先与大家讨论下我们业务发展过程中经常遇到的一些问题场景。 业务场景 我们业务…

数据规模缩小 200 倍!指令微调高效指导大模型学习

夕小瑶科技说 原创 作者 | 智商掉了一地、Python 最近大型语言模型(LLMs)的指令微调备受研究人员的关注,因为它可以开发 LLM 遵循指令的潜力,使其更加符合特定的任务需求。虽然指令微调(Instruction Tuning&#xff…

JavaEE-HTTPS的加密流程

目录 对称加密非对称加密证书的引入 对称加密 对称加密就是用同一个密钥把明文进行加密变成密文,也能把密文解密为明文. 理想状态下: 引入对称加密之后, 即使数据被截获, 由于黑客不知道密钥是啥, 因此就无法进行解密, 也就不知道请求的真实内容是啥了. 但同一时刻服务器服务…

数据库规范与SQL调优

数据库设计规范章节,依旧以《阿里巴巴Java开发手册》为原型进行修正和完善。 MySQL规约 (一) 建表规约 (二) 索引规约 (三) SQL规约 (四) ORM规约 (一) 建表规约 1. 【强制】 表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是…

Windows修改为Mac的字体方法

一: 首先下载字体文件和修改器 Mac字体修改 https://www.aliyundrive.com/s/KKvcRNYkP5p 提取码: 6d3p 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。 二: 设置并修改字体 1:…

服务(第二十八篇)rsync

配置rsync源服务器: #建立/etc/rsyncd.conf 配置文件 vim /etc/rsyncd.conf #添加以下配置项 uid root gid root use chroot yes #禁锢在源目录 address 192.168.80.10 …

浅谈管网抢维修效率对产销差率的影响

1 背景 多年来,漏损治理工作一直围绕检漏、分区计量或压力管理等相关话题,却忽视了抢维修速度与质量对漏损治理成效的影响。实际上,不管是DMA分区计量,还是检漏,最终还是要通过抢维修来修复漏点达到控制漏损的目的。尽…

Vue 3中利用UseStorage轻松实现本地存储功能,释放数据持久化的力量

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 一、介绍1.1 什么是本地存储1.2 Vue 3中的UseStorage插件简介 二、…

第18章_MySQL8其它新特性

第18章_MySQL8其它新特性 1. MySQL8新特性概述 MySQL从5.7版本直接跳跃发布了8.0版本,可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上做了显著的改进与增强,开发者对MySQL的源代码进行了重构,最突出的一点是多MySQL Optimizer优化器…

MySQL-1-SQL语句的分类、MySQL命令、SQL查询语句

一、SQL语句的分类(任何一条sql语句以分号结尾;SQL语句不区分大小写) DQL(数据查询语言):查询语句,凡是select都是DQL。 DML(数据操作语言):insert、delete、…

Midjourney 介绍-AI绘画工具

《Midjourney》是一款2022年3月面世的AI绘画工具,创始人是David Holz。 它一款基于浏览器的在线应用程序,因此你无需安装任何软件,只需在浏览器中访问MidJourney的官方网站即可开始使用。 只要输入想到的文字,就能通过人工智能产出…

一文带你了解MySQL之基于成本的优化

前言 本文章收录在MySQL性能优化原理实战专栏,点击此处查看更多优质内容。 目录 一、什么是成本二、单表查询的成本2.1 准备数据2.2 基于成本的优化步骤2.3 基于索引统计数据的成本计算 三、连接查询的成本2.1 准备数据2.2 Condition filtering介绍2.3 多表连接的成…

『MySQL 实战 45 讲』16 - “order by” 是怎么工作的

“order by” 是怎么工作的 首先创建一个表 CREATE TABLE t ( id int(11) NOT NULL, city varchar(16) NOT NULL, name varchar(16) NOT NULL, age int(11) NOT NULL, addr varchar(128) DEFAULT NULL, PRIMARY KEY (id), KEY city (city) ) ENGINEInnoDB;全字段排序 在 cit…

正确甄别API、REST API、RESTful API和Web Service之间的异同

看到API你会想起什么?是接口、第三方调用、还是API文档?初看你可能会觉得这太熟悉了,这不是系统开发日常系列吗?但你仔细想一想,你会发现API的概念在你脑海里是如此的模糊。如何你通过搜索引擎检索API,你会…

目标检测数据预处理——部件截图,按一定比例进行外扩

本片是截图的篇的升级版本,简单版本的截图请参考根据目标框外扩一定比例进行截图(连带标签)。 对目标框(类别名称)进行分类,将同一类的目标框进行截图并分类保存在不同的文件夹中。 在本篇当中,…