内核模块的各种概念及示例

基本概念

(1)模块本身不被编译入内核映像,从而控制了内核镜像的大小。模块一旦insmod,它就和内核中的其他部分完全一样

(2)内核中已加载模块的信息也存在于/sys/module目录下;内核中将包含/sys/module/test_mod目录

(3)modprobe在加载某模块时,会同时加载该模块所依赖的其他模块。使用modprobe命令加载的模块若以“modprobe -r filename”的方式卸载,将同时卸载其依赖的模块

加载函数

(1)Linux内核模块加载函数一般以__init标识声明,它返回整型值;若初始化成功,应返回0。而在初始化失败时,应该返回错误编码

(2)在Linux中,所有标识为__init的函数如果直接编译进入内核,成为内核镜像的一部分,在连接的时候都会放在.init.text这个区段内--#define _ _init _ _attribute_ _ ((_ _section_ _ (".init.text")))

(3)所有的__init函数在区段.initcall.init中还保存了一份函数指针,在初始化时内核会通过这些函数指针调用这些__init函数,并在初始化完成后,释放init区段(包括.init.text、.initcall.init等)的内存

(4)数据也可以被定义为__initdata,对于只是初始化阶段需要的数据,内核在初始化完后,也可以释放它们占用的内存

(5)在Linux内核中,可以使用request_module(const char*fmt,…)函数加载内核模块

static int hello_data __initdata = 1;
static int __init hello_init(void)
{
    printk(KERN_INFO "Hello, world %d\n", hello_data);
    return 0;
}
module_init(hello_init);

卸载函数

Linux内核模块加载函数一般以__exit标识声明,在模块卸载的时候执行,而不返回任何值;只是退出阶段采用的数据也可以用__exitdata来形容

static void _ _exit hello_exit(void)
{
 /* 释放代码 */
}
module_exit(hello_exit);

模块参数

(1)可以用“module_param(参数名,参数类型,参数读/写权限)”为模块定义一个参数,参数类型可以是byte、short、ushort、int、uint、long、ulong、charp(字符指针)

(2)也可以拥有参数数组,形式为“module_param_array(数组名,数组类型,数组长,参数读/写权限,使用逗号分隔输入的数组元素;在/sys目录下,也可以看到某模块的参数

(3)在装载内核模块时,用户可以向模块传递参数,形式为“insmode(或modprobe)模块名参数名=参数值”,如果不传递,参数将使用模块内定义的缺省值

(4)如果模块被内置,无法insmod了,bootloader可以通过在bootargs里设置“模块名.参数名=值”的形式给该内置的模块传递参数

static char *pig_name = "Peppa";
module_param(pif_name, charp, S_IRUGO);
static int pig_age = 4000;
module_param(pig_age, int, S_IRUGO);

导出符号

Linux的“/proc/kallsyms”文件对应着内核符号表,它记录了符号以及符号所在的内存地址;经过下面接口导出到/proc/kallsyms的符号就可以被其他模块使用

EXPORT_SYMBOL(sym_name);
EXPORT_SYMBOL_GPL(sym_name);

模块声明

可以用MODULE_AUTHOR、MODULE_DESCRIPTION、MODULE_VERSION、MODULE_DEVICE_TABLE、MODULE_ALIAS分别声明模块的作者、描述、版本、设备表和别名

MODULE_AUTHOR(author);
MODULE_DESCRIPTION(description);
MODULE_VERSION(version_string);
MODULE_DEVICE_TABLE(table_info);
MODULE_ALIAS(alternate_name);

模块示例

示例代码

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

static int __init test_mod_init(void){
    printk("test_mod init!\n");
    return 0;
}

static void __exit test_mod_exit(void){
    printk("test_mod exit\n");
}

module_init(test_mod_init);
module_exit(test_mod_exit);
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("LYT");

示例Makefile

export STAGING_DIR=交叉编译工具绝对路径
CROSS_COMPILE:= 交叉编译工具绝对路径/arm-openwrt-linux-muslgnueabi-
ARCH:= arm
#CC:= $(CROSS_COMPILE)gcc
#LD:= $(CROSS_COMPILE)ld

obj-m:=test_mod.o

KDIR:=内核根目录绝对路径
PWD:=$(shell pwd)

default:
        $(MAKE) -C $(KDIR) M=$(PWD) modules ARCH=$(ARCH)

clean:
        $(MAKE) -C $(KDIR) M=$(PWD) clean
        $(RM) Module.markers modules.order
        $(RM) $(PWD)/src/modules/kmod/client/kmod/Module.markers
        $(RM) $(PWD)/src/modules/kmod/client/kmod/modules.order

打印

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单图创造虚拟世界只需10秒!斯坦福MIT联合发布WonderWorld:高质量交互生成

文章链接&#xff1a;https://arxiv.org/pdf/2406.09394 项目地址: https://WonderWorld-2024.github.io/ 本文介绍了一种新颖的框架—— WonderWorld&#xff0c;它可以进行交互式三维场景外推&#xff0c;使用户能够基于单张输入图像和用户指定的文本探索和塑造虚拟环境。尽…

Vue3插件安装

一、volar插件安装 volar&#xff1a;Vue文件的语法提示和高亮提醒。volar已经更名为Vue - Official&#xff0c;其安装步骤如下。 (1)打开vscode&#xff0c;点击扩展面板&#xff0c;在搜索窗口中输入volar&#xff0c;选择Vue - Official进行安装。 &#xff08;2&#xff0…

ES 8.14 向量搜索优化

参考&#xff1a;https://blog.csdn.net/UbuntuTouch/article/details/139502650 检索器&#xff08;standard、kNN 和 RRF&#xff09; 检索器&#xff08;retrievers&#xff09;是搜索 API 中的一种新抽象概念&#xff0c;用于描述如何检索一组顶级文档。检索器被设计为可以…

安卓系统安装linux搭建随手服务器termux平替软件介绍

引言 旧手机丢可惜&#xff0c;可以用ZeroTermux&#xff08;一款代替termux&#xff09;的超级终端&#xff0c;来模拟Linux&#xff08;甚至你可以模拟Win&#xff0c;只要性能够用&#xff09; ps&#xff1a;此软件只是termux的增强版&#xff0c;相当于增加右边菜单&…

vue2 + Lodop 制作可视化设计页面 实现打印设计功能(一)

前言&#xff1a; 此功能的来源来自于当时需要制作一个便于客户操作的打印设计功能&#xff0c;然后就有了这个项目。这个帖子主要是用于分享与谈论&#xff0c;相互学习。 目标&#xff1a; 能在vue页面中拖拽组件支持批量操作拖动通过拖拽组件列表里的组件到page进行添加实…

物联网技术-第5章-物联网数据处理

目录 1.物联网数据特征 2.物联网数据处理 &#xff08;1&#xff09;数据清洗 &#xff08;2&#xff09;数据存储 &#xff08;3&#xff09;数据融合 &#xff08;4&#xff09;数据挖掘 3.大数据基本概念 4.云计算基本概念 &#xff08;1&#xff09;背景 &#xf…

leetcode 动态规划 (基础版) 下降路径最小和

题目&#xff1a; 题解&#xff1a; 这题和三角型路径和相似&#xff0c;但这题无法在像哪一题一样通过换一个方向逃避下标特判。所以这道题就写一个下标特判的方案。特殊的下标是每一行的第一个元素和最后一个元素&#xff0c;它们由头上的一个元素和左上和右上中的其中一个…

HTML(17)——圆角和盒子阴影

盒子模型——圆角 作用&#xff1a;设置元素的外边框为圆角 属性名&#xff1a;border-radius 属性值&#xff1a;数字px/百分比 也可以每个角设置不同的效果&#xff0c;从左上角顺时针开始赋值&#xff0c;没有取值的角与对角取值相同。 正圆 给正方形盒子设置圆角属性…

极验行为式验证码适配Harmony 鸿蒙SDK下载

现阶段&#xff0c;越来越多的开发者正在积极加入鸿蒙生态系统。随着更多开发者的参与&#xff0c;早在去年9月&#xff0c;极验就成为首批拥有鸿蒙NEXT内测版本和手机系统测试机会的验证码供应商。 为了提高各开发者及企业客户集成鸿蒙版本行为验4.0的效率&#xff0c;方便大家…

土壤墒情监测系统的工作原理

TH-TS600土壤墒情监测系统是一种能够实时、连续监测土壤湿度和水分状况的设备系统。以下是关于土壤墒情监测系统的详细介绍&#xff1a; 土壤墒情监测系统通常由以下几个部分组成&#xff1a;用于实时监测土壤湿度、温度等关键参数。传感器可以根据需要布置在不同的深度和位置…

OceanMind海睿思参与编写的《数据智能白皮书(2024年)》正式发布!

近日&#xff0c;由中国通信标准化协会大数据技术标准推进委员会&#xff08;CCSA TC601&#xff09;牵头和组织&#xff0c;中新赛克海睿思作为TC601-WG16人工智能数据工作组合作伙伴参与编写的《数据智能白皮书&#xff08;2024年&#xff09;》正式发布。 中新赛克的卢云川、…

多波束测线问题

多波束测线问题 问题的背景是海洋测深技术&#xff0c;特别是涉及单波束测深和多波束测深系统。这些系统利用声波传播原理来测量水体深度。 单波束测深系统通过向海底发射声波信号并记录其返回时间来测量水深。该系统的特点是每次只有一个波束打到海底&#xff0c;因此数据分布…

秋招突击——6/17——复习{整理昨天的面试资料}——新作{删除链表倒数第n个节点}

文章目录 引言复习新作删除链表倒数第N个节点题目描述个人实现参考实现 总结 引言 主管面&#xff0c;面的很凄惨&#xff0c;不过无所谓了&#xff0c;我已经尽力了。上午都在整理的面经&#xff0c;没有复习算法&#xff0c;而且这两天要弄一下论文&#xff0c;二十号就要提…

小电流接地系统单向故障仿真分析

基于Matlab/simulink的小电流接地系统单向故障仿真分析&#xff0c;涵盖了中性点不接地系统仿真和中性点经消弧线圈接地系统仿真模型。 在电力系统中&#xff0c;接地方式的选择至关重要。小电流接地系统&#xff0c;也称为非有效接地系统&#xff0c;在发生单相接地故障时&am…

OSPF被动接口配置(华为)

#交换设备 OSPF被动接口配置 一、基本概念 OSPF被动接口&#xff0c;也称为抑制接口&#xff0c;即将路由器某一接口配置为被动接口后&#xff0c;该接口不会再接受和发送OSPF报文 二、使用场景 在路由器与终端相近或者直接相连的一侧配置被动接口 因为OSPF会定期发送报文…

方舟云康亏损收窄:三年近10亿销售成本,平均付费及月活仍大幅承压

《港湾商业观察》施子夫 三度递表后&#xff0c;终于通过聆讯&#xff0c;方舟云康控股有限公司(以下简称&#xff0c;方舟云康)有望近期内挂牌港交所。方舟云康的国内运营主体为广州方舟云康信息科技集团有限公司、广州方舟医药有限公司。 值得关注的是&#xff0c;亏损的难…

每日一题——Python代码实现PAT乙级1082 射击比赛(举一反三+思想解读+逐步优化)四千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码分析 代码步骤 时间复杂度分析 空间复杂度分析 总结 我要更强 时…

Redis精要

一、什么是缓存击穿、缓存穿透、缓存雪崩&#xff1f; 缓存穿透 【针对大量非法访问的请求&#xff0c;缓存中没有&#xff0c;直接访问DB】 缓存穿透指的查询缓存和数据库中都不存在的数据&#xff0c;这样每次请求直接打到数据库&#xff0c;就好像缓存不存在 一样。 对于系…

华测监测预警系统2.2 UserEdit.aspx SQL注入致RCE漏洞复现(CVE-2023-5827)

0x01 产品简介 华测监测预警系统2.2是一套针对地质灾害监测预警的科学、完善平台,实现了地质灾害防治管理的科学化、信息化、标准化和可视化。该系统由上海华测导航技术有限公司开发,主要服务于山体滑坡、地裂缝等地质灾害的自动化预警。 0x02 漏洞概述 华测监测预警系统2…

Linux 之内存管理 -free 和 RSS/RES的意义

一、free -h 计算关系&#xff1a; available free buff/cache total used availbleshared 参数 说明 total 总计物理内存的大小 used 已使用的物理内存的大小 free 可用物理内存有多少 shared 多个进程共享的内存总额 buff/cache 写入和读取 磁盘内存缓冲区的大小 avail…