day(2,3)-内核模块

news2024/9/22 15:42:12

内核模块上

主要内容

向内核添加新功能

内核模块基础代码讲解

内核模块多源文件编程

内核模块信息宏

一、向内核添加新功能

1.1 静态加载法:

即新功能源码与内核其它代码一起编译进uImage文件内

Kconfig是make menuconfig的界面配置文件

1.2动态加载法:

新功能源码单独作为模块编译

内核模块下

模块传参

模块依赖

模块编程与应用编程的比较

内核接口头文件查询

一、模块传参

module_param(name,type,perm);//将指定的全局变量设置成模块参数

name:全局变量名
type:
    使用符号      实际类型                传参方式
	bool	     bool           insmod xxx.ko  变量名=0 或 1
	invbool      bool           insmod xxx.ko  变量名=0 或 1
	charp        char *         insmod xxx.ko  变量名="字符串内容"
	short        short          insmod xxx.ko  变量名=数值
	int          int            insmod xxx.ko  变量名=数值
	long         long           insmod xxx.ko  变量名=数值
	ushort       unsigned short insmod xxx.ko  变量名=数值
	uint         unsigned int   insmod xxx.ko  变量名=数值
	ulong        unsigned long  insmod xxx.ko  变量名=数值
perm:给对应文件 /sys/module/name/parameters/变量名 指定操作权限(一般为0664)
	#define S_IRWXU 00700
	#define S_IRUSR 00400
	#define S_IWUSR 00200
	#define S_IXUSR 00100
	#define S_IRWXG 00070
	#define S_IRGRP 00040
	#define S_IWGRP 00020
	#define S_IXGRP 00010
	#define S_IRWXO 00007
	#define S_IROTH 00004
	#define S_IWOTH 00002  //不要用 编译出错
	#define S_IXOTH 00001

数组传递

module_param_array(name,type,&num,perm);
/*
name、type、perm同module_param,type指数组中元素的类型
&num:存放数组大小变量的地址,可以填NULL(确保传参个数不越界)
    传参方式 insmod xxx.ko  数组名=元素值0,元素值1,...元素值num-1 
*/ 
#include <linux/module.h>
#include <linux/kernel.h>

int gx = 10;
char *gstr="chris love ljx";
int garr[5]={1,2,3,4,5};

module_param(gx,int,0664);
module_param(gstr,charp,0664);
module_param_array(garr,int,NULL,0664);

int __init testparam_init(void)
{
	int i = 0;
	printk("gx = %d\n",gx);
	printk("gstr = %s\n",gstr);

	for(i = 0;i<5;i++){
		printk("%d",garr[i]);
	}
	printk("\n");
	return 0;
}

void __exit testparam_exit(void)
{
	printk("test1 will exit\n");
}
MODULE_LICENSE("GPL");
module_init(testparam_init);
module_exit(testparam_exit);

传递参数 

 二、模块依赖

modulea.c

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

int ga = 6;
EXPORT_SYMBOL(ga);

int __init modulea_init(void)
{
	printk("ga = %d\n",ga);
	return 0;
}

void __exit modulea_exit(void)
{
	printk("modulea will exit\n");
}
MODULE_LICENSE("GPL");
module_init(modulea_init);
module_exit(modulea_exit);

moduleb.c

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

extern int ga;

int __init moduleb_init(void)
{
	printk("In moduleb_init,ga = %d\n",ga);
	return 0;
}

void __exit moduleb_exit(void)
{
	printk("moduleb will exit\n");
}
MODULE_LICENSE("GPL");
module_init(moduleb_init);
module_exit(moduleb_exit);

Makefile

ifeq ($(KERNELRELEASE),)

ifeq ($(ARCH),arm)
KERNELDIR ?= /home/chris/Linux_4412/kernel/linux-3.14
ROOTFS ?= /opt/4412/rootfs
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
endif
PWD := $(shell pwd)

modules:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules INSTALL_MOD_PATH=$(ROOTFS) modules_install

clean:
	rm -rf  *.o  *.ko  .*.cmd  *.mod.*  modules.order  Module.symvers   .tmp_versions

else
obj-m += modulea.o
obj-m += moduleb.o



endif

两个依赖模块在不同文件夹时,需要将被依赖的模块先编译,将生成的Modele.symvers文件放到依赖模块的同路径,再编译

两个用于导出模块中符号名称的宏:

EXPORT_SYMBOL(函数名或全局变量名)

EXPORT_SYMBOL_GPL(函数名或全局变量名) 需要GPL许可证协议验证

使用导出符号的地方,需要对这些符号进行extern声明后才能使用这些符号

B模块使用了A模块导出的符号,此时称B模块依赖于A模块,则:

  1. 编译次序:先编译模块A,再编译模块B,当两个模块源码在不同目录时,需要:i. 先编译导出符号的模块A ii. 拷贝A模块目录中的Module.symvers到B模块目录 iii. 编译使用符号的模块B。否则编译B模块时有符号未定义错误

  2. 加载次序:先插入A模块,再插入B模块,否则B模块插入失败

  3. 卸载次序:先卸载B模块,在卸载A模块,否则A模块卸载失败三、内核空间和用户空间

三、内核空间和用户空间

为了彻底解决一个应用程序出错不影响系统和其它app的运行,操作系统给每个app一个独立的假想的地址空间,这个假想的地址空间被称为虚拟地址空间(也叫逻辑地址),操作系统也占用其中固定的一部分,32位Linux的虚拟地址空间大小为4G,并将其划分两部分:

  1. 0~3G 用户空间 :每个应用程序只能使用自己的这份虚拟地址空间

  2. 3G~4G 内核空间:内核使用的虚拟地址空间,应用程序不能直接使用这份地址空间,但可以 通过一些系统调用函数与其中的某些空间进行数据通信

实际内存操作时,需要将虚拟地址映射到实际内存的物理地址,然后才进行实际的内存读写

四、执行流

执行流:有开始有结束总体顺序执行的一段独立代码,又被称为代码上下文

计算机系统中的执行流的分类:

执行流:

  1. 任务流--任务上下文(都参与CPU时间片轮转,都有任务五状态:就绪态 运行态 睡眠态 僵死态 暂停态)

    1. 进程

    2. 线程

      1. 内核线程:内核创建的线程

      2. 应用线程:应用进程创建的线程

  2. 异常流--异常上下文

    1. 中断

    2. 其它异常

应用编程可能涉及到的执行流:

  1. 进程

  2. 线程

内核编程可能涉及到的执行流:

  1. 应用程序自身代码运行在用户空间,处于用户态 ----------------- 用户态app

  2. 应用程序正在调用系统调用函数,运行在内核空间,处于内核态,即代码是内核代码但处于应用执行流(即属于一个应用进程或应用线程) ---- 内核态app

  3. 一直运行于内核空间,处于内核态,属于内核内的任务上下文 --------- 内核线程

  4. 一直运行于内核空间,处于内核态,专门用来处理各种异常 --------- 异常上下文

五、模块编程与应用编程的比较

六、内核接口头文件查询

大部分API函数包含的头文件在include/linux目录下,因此:

  1. 首先在include/linux 查询指定函数:grep 名称 ./ -r -n

  2. 找不到则更大范围的include目录下查询,命令同上

    例:

grep MODULE_AUTHOR ./ -r -n

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

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

相关文章

Yolov8改进---注意力机制:DoubleAttention、SKAttention,SENet进阶版本

目录 🏆🏆🏆🏆🏆🏆Yolov8魔术师🏆🏆🏆🏆🏆🏆 1. DoubleAttention 2. SKAttention 3.总结

2022-4-4基于单片机的MQ2烟雾传感器报警系统设计

基于单片机的MQ2烟雾传感器报警系统设计 源代码和仿真图及MQ2相关资料可在文末的链接中下载 该系统实现的功能&#xff1a;检测空气中的烟雾浓度并实现超阈值报警 该系统组成由&#xff1a; 单片机最小系统、ADC0832、MQ2烟雾传感器、LCD1602液晶模块、声光报警模块、按键模…

研究人员发现微软Azure API管理服务存在3个漏洞

微软Azure API管理服务中披露了三个新的安全漏洞&#xff0c;恶意行为者可能会滥用这些漏洞来访问敏感信息或后端服务。 据以色列云安全公司Ermetic称&#xff0c;这包括两个服务器端请求伪造(SSRF)漏洞和API管理开发人员门户中的一个不受限制的文件上传功能实例。 安全研究员…

【腾讯云 Finops Crane 集训营】Crane应用实战

文章目录 前言一、Crane是什么&#xff1f;二、Crane的特点三、Crane使用1、环境准备2、安装Crane3、访问dashboard4、页面展示5、功能应用 四、Crane的优势总结 前言 FinOps&#xff08;Financial Operations&#xff09;是一种管理云计算成本的方法&#xff0c;它强调将云计…

使用PyTorch构建神经网络,并使用thop计算参数和FLOPs

文章目录 使用PyTorch构建神经网络&#xff0c;并使用thop计算参数和FLOPsFLOPs和FLOPS区别使用PyTorch搭建神经网络整体代码1. 导入必要的库2. 定义神经网络模型3. 打印网络结构4. 计算网络FLOPs和参数数量5. 结果如下手动计算params手动计算FLOPs注意 使用PyTorch构建神经网络…

车联网强势发展下,有什么隐患?

通过新一代信息通信技术&#xff0c;车联网实现了汽车与云平台&#xff0c;车辆和汽车&#xff0c;道路&#xff0c;汽车和人以及内部的全方位网络链接。车联网使用传感器技术感知车辆的状态信息&#xff0c;并利用无线通信网络和现代智能信息处理技术的帮助实现交通智能化管理…

FPGA入门系列10--按键消抖

文章简介 本系列文章主要针对FPGA初学者编写&#xff0c;包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解&#xff0c;旨在更快速的提升初学者在FPGA开发方面的能力&#xff0c;每一个章节中都有针对性的代码…

Redis高可用系列——Set类型底层详解

文章目录 概述intsetintset 和 hashtable 的转换为什么加入了listpackhashtable 的空间开销高hashtable 的碰撞概率高intset 、listpack和hashtable的转换 概述 在讲解set结构之前&#xff0c;需要先说明一下set结构编码的更替&#xff0c;如下 在Redis7.2之前&#xff0c;se…

Ansys Lumerical | CMOS - 光学仿真方法

通过使用更小的像素尺寸和更大的填充因子&#xff0c;基于CMOS图像传感器像素的数码相机系统的成本正在降低。但是&#xff0c;只有在不牺牲图像质量的情况下&#xff0c;CMOS像素尺寸减小才是可以接受的。随着CMOS像素尺寸的不断减小&#xff0c;图像信噪比降低&#xff0c;相…

《我命由我不由天》蔡志忠——笔记一

目录 简介 经典摘录 三岁决定一生 父母该什么时候放手 确定将来要成为什么 积极主动为目标而努力 叛逆是最伟大的创意 父亲给蔡志忠最大的影响是教会他两件事 价值观缺陷导致的后果 人有三个阶段 简介 作者 蔡志忠&#xff0c;李虹。 蔡志忠&#xff1a;漫画家、哲…

力扣-1769. 移动所有球到每个盒子所需的最小操作数

题目&#xff1a; 有 n 个盒子。给你一个长度为 n 的二进制字符串 boxes &#xff0c;其中 boxes[i] 的值为 ‘0’ 表示第 i 个盒子是 空 的&#xff0c;而 boxes[i] 的值为 ‘1’ 表示盒子里有 一个 小球。 在一步操作中&#xff0c;你可以将 一个 小球从某个盒子移动到一个与…

搜索引擎优化SEO和SEM有什么不一样

SEO&#xff08;搜索引擎优化&#xff09;和SEM&#xff08;搜索引擎营销&#xff09;都是用于提高网站在搜索引擎中的排名和能见度的技术。虽然它们的目标是相同的&#xff0c;但它们的方法和重点略有不同&#xff0c;今天和大家聊聊SEO和SEM有什么不同。 一、SEO SEO是指通…

红帽8配置yum源

使用传输工具 上传文件到/etc/yum.repos.d/ 或 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo 注&#xff1a;不能下载wget直接上传文件 关闭订阅插件提示 [redhatroot ~]$ vi /etc/yum.conf #添加 plugins0 [redhatroot ~]$ …

docker+jenkins自动化部署springboot项目

前置:环境配置 阿里云服务器1核2GBjava 1.8.0._371maven apache-maven3.8.8git 1.8.3.1 docker和jenkins在一台服务器上&#xff0c;环境的配置&#xff0c;对于java和maven可以自己下载对应tar包进行配置&#xff0c;记得配置环境&#xff0c;也可以使用yum进行安装。记得配置…

FS5175AE降压型1-4节锂电池充电芯片

FS5175AE是一款工作于5V到24V的多串锂电池同步开关降压充电管理芯片。内置MOS管集成了低导通阻抗的NMOS&#xff0c;FS5175AE采用1MHz同步开关架构&#xff0c;实现高 效率充电并简化外围器件&#xff0c;降低BOM成本。通过调节检测电阻&#xff0c;可实现**2A充电电流&#xf…

【Java校招面试】基础知识(八)——Linux服务器

目录 前言一、基础概念二、常用命令后记 前言 本篇主要介绍Linux服务器的相关内容。 “基础知识”是本专栏的第一个部分&#xff0c;本篇博文是第八篇博文&#xff0c;如有需要&#xff0c;可&#xff1a; 点击这里&#xff0c;返回本专栏的索引文章点击这里&#xff0c;返回…

仿抖音开发需要注意的问题

一、版权问题 仿抖音开发需要注意版权问题&#xff0c;包括内容的版权和软件的版权。在开发的过程中&#xff0c;不要直接抄袭他人的作品&#xff0c;应该注重保护知识产权。 二、安全性问题 仿抖音开发需要重视应用的安全性问题&#xff0c;避免应用在使用过程中发生安全漏…

OpenCv 图像的算数运算

1. 图像加法 函数 cv.add(img1, img2) 参数中的img1 和 img2 应该是相同的深度和类型&#xff0c; 或者第二个图像可以是像素值 代码示例: >>> x np.uint8([250]) >>> y np.uint8([10])>>> print(cv.add(x,y)) #250 10 260 > 255 [[255]]&g…

Winform控件数据绑定 DataBindings

目录 引言 绑定的方式 双向绑定 验证时更改数据源 立即更改数据源 单向绑定 绑定方法 属性界面选择绑定 通过代码手动绑定 绑定自定义数据类型 引言 DataBindings 的出现显然是为了解决后台数据与前端界面的同步问题&#xff0c;通过绑定控件属性与对象属性&#xff0c;解决…

Spring Cloud整合XXL-Job

目录 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 重点&#xff1a; 第一步&#xff1a; 整合pom文件&#xff0c;在Spring Cloud中添加XXL-Job的依赖 <!-- xxl-job-core --> <dependency><groupId>com.xuxueli<…