linux内核基本知识一

1.ioremap映射访问和使用in/out直接访问的区别与联系

linux中使用ioremap映射访问和使用in/out直接访问的区别与联系???
在Linux内核中,ioremap()函数用于将物理地址映射到虚拟地址空间,以便在内核中访问设备寄存器或
其他I/O地址空间。而in/out指令则是直接访问I/O端口的指令。

区别:

  1. ioremap()用于将物理地址映射到虚拟地址空间,而in/out指令是直接对I/O端口进行读写操作。
  2. ioremap()返回的是虚拟地址,可以通过指针访问设备寄存器,
    而in/out指令是直接对I/O端口进行读写操作,不需要进行地址映射。

联系:

  1. ioremap()和in/out都用于访问设备的I/O地址空间,只是方式不同。
  2. 在驱动程序中,可以使用ioremap()将设备的物理地址映射到虚拟地址空间,
    然后通过指针对设备寄存器进行读写操作。
  3. 在某些情况下,可能需要使用in/out指令直接对I/O端口进行读写操作,
    例如在一些特殊的设备上,或者在一些嵌入式系统中。

总的来说,ioremap()和in/out都是用于访问设备的I/O地址空间,但方式和应用场景略有不同。
ioremap()适用于将物理地址映射到虚拟地址空间,然后通过指针访问设备寄存器;
而in/out指令适用于直接对I/O端口进行读写操作。

2.strrchr()函数

在Linux中,strrchr()函数是一个字符串处理函数,用于在一个字符串中查找最后一个出现的指定字符
函数原型:

char *strrchr(const  char *s, int c);	//s:搜索的字符串	c:查找的字符
return  指向最后一个匹配字符的指针,若未找到,则返回NULL

3.sysfs_create_file()函数

sysfs_create_file()函数是Linux内核中的一个函数,用于在sysfs文件系统中为指定的内核对象创建一个文件
函数原型:

int sysfs_create_file(struct  kobject  *kobj,  const struct attribute *attr);
kobj:一个指向struct attribute的指针,表示创建文件的属性
struct kobject和struct attribute是Linux内核中用于管理sysfs文件系统的数据结构。
struct attribute结构体包含了文件的属性信息,例如文件名、读写权限等。

4.C语言标准库提供的一组宏

//C语言标准库中的一个头文件,提供了一组宏和类型,用于处理可变参数函数。
//这些宏和类型的目的是允许函数接受可变数量的参数。

#include <stdarg.h>		void my_function(int count, ...)
{va_list args;va_start(args, count);// 使用 va_arg 获取可变参数列表中的参数值va_end(args);
}va_list steps;
va_start(steps, step_count);
va_arg(steps, int);

这两句代码是用于处理可变参数的宏和函数,用于获取可变参数列表的首地址。

  1. va_list steps;
    va_list 是C语言提供的一种数据类型,用于存储可变参数列表。
    valist 类型的 steps 的变量,为可变参数列表分配内存空间。

  2. va_start(steps, step_count);
    va_start是一个宏,用于初始化 va_list 类型的变量,以便访问可变参数列表。
    argv[0]是一个 va_list 类型的变量,argv[1] 是可变参数列表中的最后一个已知的固定参数。
    va_start 宏将可变参数列表的起始地址存储在 steps 变量中,以便后续访问可变参数。

  3. va_arg(steps, int);
    va_arg是一个宏,用于从可变参数列表中获取下一个参数的值
    arg[0]是一个 va_list 类型的变量, argv[1] 是要获取的参数的类型
    如:va_arg(steps, int); //表示从steps可变参数列表中获取下一个参数,并将其作为int类型返回
    备注:一般会有多个va_arg操作

  4. va_end(steps);
    va_end用于结束可变参数列表的处理,作用是清理和释放与可变参数列表相关的资源。

e.g.
#define STEP(type, addr, value)		(type),(addr),(value)
#define STEP_OVER			(OP_TYPE_NONE),0,0
#define STEP_CNT(n)		(n)
调用:i2c_select_steps_init(&(bd->i2c_select_table[I2C_DEV_FAN + 0]),    		\STEP_CNT(2), 					\STEP(OP_TYPE_WR_CPLD, bd->cpldaddr_main_i2c_sel, 0x10),	\STEP_OVER);
函数:int i2c_select_steps_init(i2c_select_operation_steps *i2c_steps, int step_count, ...)

5.#define __stringify(x) #x

__stringify(x)函数是一个预处理宏,用于将参数转换为字符串常量
在__stringify(x)宏的定义中,第二个#符号是用于字符串化操作的
在C预处理器中,#符号是一种字符串化操作符,用于将宏参数转换为字符串常量
这个宏在编写宏定义时非常有用,特别是当你需要将参数转换为字符串以进行日志记录或错误消息时!!!

6.出参与入参

func(OUT u8* value, IN u16 offset); //OUT:表示出参 IN:表示入参
这种参数修饰符并不是C语言的标准特性,而是一种约定或命名规则,
用于提供更多的信息给开发者,以便更好地理解函数参数的用途和特性。
在实际代码中,OUT和IN通常是作为注释或文档的一部分使用,以帮助
开发者理解函数的使用方式。

7.底层I/O端口的读写、内存映射相关函数

在Linux系统中,用于访问I/O端口的函数通常定义在asm/io.h头文件中。
该头文件包含了一系列宏和函数,用于进行I/O端口的读写操作。

asm/io.h头文件是Linux内核提供的头文件之一,用于底层硬件访问和驱动程序开发。
它定义了一些宏和函数,用于进行底层I/O端口的读写、内存映射等操作。

以下是一些常用的I/O端口访问函数和宏定义:
inb(port):从指定的I/O端口读取一个字节的数据。
inw(port):从指定的I/O端口读取一个字(两个字节)的数据。
inl(port):从指定的I/O端口读取一个双字(四个字节)的数据。
outb(value, port):向指定的I/O端口写入一个字节的数据。
outw(value, port):向指定的I/O端口写入一个字(两个字节)的数据。
outl(value, port):向指定的I/O端口写入一个双字(四个字节)的数据。
这些函数和宏定义在asm/io.h头文件中,可以通过包含该头文件来使用它们。
在Linux内核开发或底层编程中,使用这些函数和宏可以方便地进行I/O端口的读写操作。

需要注意的是,asm/io.h头文件通常是Linux内核的一部分,因此在用户空间的应用程序中可能无法直接包含该头文件。
如果你想在用户空间的应用程序中进行I/O端口的访问,通常需要使用特定的库或驱动程序接口。

8.驱动编写步骤

前言:
sysfs是一种基于RAM的文件系统,它与Kobject结合使用,能够
将Kernel的数据结构以及属性导出到用户空间,以文件目录结构
的形式提供对这些数据结构的访问支持。

1)module_param(参数, 类型, 权限); //传递权限
2)module_param_named(insmod对应的参数变量名,程序中定义的变量名,类型,权限);
3)MODULE_PARM_DESC(参数,描述…)//对模块的参数进行描述
4)EXPORT_SYMBOL(文件或目录或函数或锁)
EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代
码就可以在您的内核模块中直接调用;
将一个函数以符号的方式导出给其他模块使用;

简单驱动步骤:
1)文件引入(共有文件、私有文件)
2)SYSFS_RW_ATTR_DEF(参数, 函数1,函数2); //SYSFS函数族
3)指针数组参数
e.g. static struct attritube *参数名A[] = {参数。。。};
4)释放参数
5)初始化入口函数(可能拥有多个初始化函数)
6)出口函数
7)EXPORT_SYMBOL(本文件中使用的变量)
(备注:向上与内核打交道,向下与硬件打交道)

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

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

相关文章

25期代码随想录算法训练营第十四天 | 二叉树 | 层序遍历(10道题)、226.翻转二叉树 、101.对称二叉树 2

目录 层序遍历 10226.翻转二叉树101.对称二叉树 2 层序遍历 10 链接 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right clas…

C/C++数字判断 2021年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C数字判断 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C数字判断 2021年9月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 输入一个字符&#xff0c;如何输入的字符是数字&#x…

Spark的转换算子和操作算子

1 Transformation转换算子 1.1 Value类型 1&#xff09;创建包名&#xff1a;com.shangjack.value 1.1.1 map()映射 参数f是一个函数可以写作匿名子类&#xff0c;它可以接收一个参数。当某个RDD执行map方法时&#xff0c;会遍历该RDD中的每一个数据项&#xff0c;并依次应用f函…

Mac下eclipse配置JDK

一、配置JDK&#xff0c;需要电脑下载Java并且配置环境 Mac环境配置&#xff08;Java&#xff09;----使用bash_profile进行配置&#xff08;附下载地址&#xff09; (1)、左上角找到“Eclipse”-->“Preferences...” (2)、找到“Java”-->“Installde JREs”-->界…

S7-1200PLC和SMART PLC开放式以太网通信(UDP双向通信)

S7-1200PLC的以太网通信UDP通信相关介绍还可以参考下面文章链接: 博途PLC开放式以太网通信TRCV_C指令应用编程(运动传感器UDP通信)-CSDN博客文章浏览阅读2.8k次。博途PLC开放式以太网通信TSENG_C指令应用,请参看下面的文章链接:博途PLC 1200/1500PLC开放式以太网通信TSEND_…

AI:73-结合语法知识的神经机器翻译研究

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

AM@多元函数极值存在定理@条件极值

文章目录 abstract多元函数极值存在定理极值求解求解步骤驻点部分偏导不存在的点 例多元函数最值例 条件极值条件极值转为无条件极值极值必要条件拉格朗日乘数法推广例 abstract 多元函数极值和最值多元函数极值存在定理条件极值 多元函数极值存在定理 本定理给出极值存在充…

HTTPS的工作流程

. HTTPS是什么&#xff1f; https是应用层中的一个协议&#xff0c;是在http协议的基础上引入的一个加密层。 为什么需要HTTPS 由于http协议内容都是按照文本的方式明文传输的&#xff0c;这就导致传输过程中会出现一些被篡改的情况。运营商劫持事件最开始百度&#xff0c;…

云栖大会丨桑文锋:打造云原生数字化客户经营引擎

近日&#xff0c;2023 云栖大会在杭州举办。今年云栖大会回归了 2015 的主题&#xff1a;「计算&#xff0c;为了无法计算的价值」。神策数据创始人 & CEO 桑文锋受邀出席「生态产品与伙伴赋能」技术主题&#xff0c;并以「打造云原生数字化客户经营引擎」为主题进行演讲。…

CSS特效006:绘制不断跳动的心形

css实战中&#xff0c;怎么绘制不断跳动的心形呢&#xff1f; 绘图的时候主要用到了transform: rotate(-45deg); transform-origin: 0 100%; transform: rotate(45deg); transform-origin: 100% 100%; 动画使用keyframes 时间上为infinite。 效果图 源代码 /* * Author: 大剑…

迅为龙芯3A5000主板,支持PCIE 3.0、USB 3.0和 SATA 3.0显示接口2 路、HDMI 和1路 VGA,可直连显示器

性能强 采用全国产龙芯3A5000处理器&#xff0c;基于龙芯自主指令系统 (LoongArch)的LA464微结构&#xff0c;并进一步提升频率&#xff0c;降低功耗&#xff0c;优化性能。 桥片 桥片采用龙芯 7A2000&#xff0c;支持PCIE 3.0、USB 3.0和 SATA 3.0显示接口2 路、HDMI 和1路 …

web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中

好 上文web3通过antd 在React dapp中构建订单组件基本结构我们算是把一个基本的订单组件展示做出来了 然后 我们继续 起一下环境先 ganache 终端运行 ganache -dMetaMask 登录一下 然后 打开项目 发布一下合约 truffle migrate --reset然后 运行一下 测试脚本 转入交易所 E…

excel中超级表和普通表的相互转换

1、普通表转换为超级表 选中表内任一单元格&#xff0c;然后按CtrlT&#xff0c;确认即可。 2、超级表转换为普通表 选中超级表内任一单元格&#xff0c;右键&#xff0c;表格&#xff0c;转换为区域&#xff0c;确定即可。 这时虽然已经变成了普通表&#xff0c;但样式没有…

CSS知识点梳理(一)

CSS 是层叠样式表&#xff08;Cascading Style Sheets&#xff09;的缩写&#xff0c;它是一种用于描述 HTML 或 XML&#xff08;包括如 SVG、MathML 等派生语言&#xff09;文档呈现的语言。CSS 可以用来控制文档的布局、颜色、字体等外观属性。 CSS 的主要特点包括&#xff…

JVM关键指标监控(调优)

JVM 99%情况下不需要调优 使用性能更好的垃圾回收器 核心指标 针对单台服务器而言&#xff1a; jvm.gc.time: 每分钟GC耗时在1s以内 500ms以内最佳 jvm.gc.meantime: 每次YGC耗时在100ms以内&#xff0c;50ms以内最佳 jvm.fullgc.count: FGC(老生代垃圾回收)最多几小时1次&…

11.9 知识总结(三板斧、全局配置文件、静态文件的配置、request对象等)

一、 三板斧的使用 三个方法&#xff1a; HttpResponse render redirect def index(request): print(request) # return HttpResponse("request") # 它返回的是字符串 # return render(request, index.html) # 加载HTML页面的 # return redirect(ht…

数据库 关系数据理论

问题 数据冗余更新异常插入异常删除异常 一个好的模式应当不会发生插入异常、删除异常和更新异常&#xff0c;数据冗余应尽可能少 数据依赖 定义&#xff1a;一个关系内部属性与属性之间的一种约束关系&#xff08;该约束关系是通过属性间值的相等与否体现出来数据间相关联…

iOS 17.2更新:15Pro支持拍摄空间视频!

苹果又为开发者预览版用户推送了iOS 17.2 Beta2测试版的更新&#xff0c;已经注册Apple Beta版软件计划的用户只需打开设置--通用--软件更新即可在线OTA升级至最新的iOS 17.2测试版。 本次更新包大小为750M左右&#xff0c;内部版本号为&#xff08;21C5040g&#xff09;&#…

设计模式--Command模式

命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将一个请求封装为一个对象&#xff0c;从而使你可以用不同的请求对客户进行参数化&#xff0c;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 命令模式主要包含以下几个角色&…

『 MySQL数据库 』数据库基础之表的基本操作

文章目录 创建表&#x1f5e1;查看表&#x1f5e1;✒ 查看表内所有信息(描述\表结构等)✒ 根据条件查看表内数据✒ 查看表的具体详细信息: 修改表&#x1f5e1;✒ 修改表名:✒ 修改表的存储引擎、编码集(字符集和校验集):✒ 表内插入数据:insert into✒ 在表中新添一个字段(列)…