当前位置: 首页 > news >正文

Linux驱动开发(2)进一步理解驱动

一、Linux下应用程序调用驱动程序流程

1、简要流程

  • Linux下进行驱动开发,完全将驱动程序与应用程序隔开,中间通过C标准库函数以及系统调用完成驱动层和应用层的数据交换。
  • 驱动加载成功以后会在“/dev”目录下生成一个相应的文件,应用程序通过对“/dev/xxx” (xxx 是具体的驱动文件名字) 的文件进行相应的操作即可实现对硬件的操作。
  • 用户空间不能直接对内核进行操作,因此必须使用一个叫做 “系统调用”的方法 来实现从用户空间“陷入” 到内核空间,这样才能实现对底层驱动的操作。
  • 每一个系统调用,在驱动中都有与之对应的一个驱动函数,在 Linux 内核文件 include/linux/fs.h 中有个叫做 file_operations 的结构体,此结构体就是 Linux 内核驱动操作函数集合。

2、从驱动加载开始的详细流程(字符驱动)

(1)加载一个驱动模块,产生一个设备文件,有唯一对应的inode结构体。

(2)应用层调用open函数打开设备文件,对于上层open调用到内核时会发生一次软中断,从用户空间进入到内核空间

(3)open会调用到sys_open(内核函数),sys_open根据文件的地址,找到设备文件对应的struct inode结构体描述的信息,可以知道接下来要操作的设备类型(字符设备还是块设备),还会分配一个struct file结构体

(4)根据struct inode结构体里面记录的主设备号和次设备号,在驱动链表(管理所有设备的驱动)里面,找到字符设备驱动.

(5)每个字符设备都有一个struct cdev结构体。此结构体描述了字符设备所有信息,其中最重要的一项就是字符设备的操作函数接口.

(6)找到struct cdev结构体后,linux内核就会将struct cdev结构体所在的内存空间首地址记录在struct inode结构体i_cdev成员中,将struct cdev结构体中的记录的函数操作接口地址记录struct file结构体的f_ops成员中

(7)执行xxx_open驱动函数

3、一些问题

(1)inode和cdev的关系

(2)i_cdev的作用

(3)struct file结构体

4、设备号

  • Linux 中每个设备都有一个设备号,设备号由主设备号和次设备号两部分组成
  • 主设备号表示某一个具体的驱动,次设备号表示使用这个驱动的各个设备。
  • Linux 提供了一个名为 dev_t 的数据类型表示设备号其中高 12 位为主设备号, 低 20 位为次设备
  • 使用"cat /proc/devices"命令即可查看当前系统中所有已经使用了的设备号(主)
MAJOR // 用于从 dev_t 中获取主设备号,将 dev_t 右移 20 位即可。
MINOR //用于从 dev_t 中获取次设备号,取 dev_t 的低 20 位的值即可。
MKDEV //用于将给定的主设备号和次设备号的值组合成 dev_t 类型的设备号。

二、地址映射与I/O内存访问

        虚拟地址空间和实际的内存之间的映射关系,就叫地址映射。在驱动开发的过程中会用到内存映射函数。对于32位处理器来说,虚拟地址范围是2^32=4GB.

        CPU只能访问虚拟地址,而CPU需要向寄存器地址写入数据的时候不能直接写入,必须得到寄存器物理地址在Linux系统中对应的虚拟地址。物理内存和虚拟内存之间的转换,需要用到: ioremap 和 iounmap两个函数。

1、ioremap与iounmap:获取指定物理地址空间对应的虚拟地址空间

        ioremap的用法:

#define addr (0X020E0068)  // 物理地址
static void __iomem*  va; //指向映射后的虚拟空间首地址的指针
va=ioremap(addr, 4);   // 得到虚拟地址首地址

        这里就是用ioremap获得了addr对应的虚拟地址空间。

        卸载驱动时要使用 iounmap 函数释放掉 ioremap 函数所做的映射。

iounmap(va);//va是要取消映射的虚拟地址空间首地址

2、为什么需要ioremap

3、I/O内存访问函数

        当外部寄存器外部内存映射到内存空间时,称为 I/O 内存。但是对于 ARM 来说没有 I/O 空间,因此 ARM 体系下只有 I/O 内存(可以直接理解为内存)。

        使用 ioremap 函数将寄存器的物理地址映射到虚拟地址后,可以直接通过指针访问这些地址,但是 Linux 内核不建议这么做,而是推荐使用一组操作函数来对映射后的内存进行读写操作

(1)读操作函数

u8 readb(const volatile void __iomem *addr)
u16 readw(const volatile void __iomem *addr)
u32 readl(const volatile void __iomem *addr)

        readb、 readw 和 readl 分别对应 8bit、 16bit 和 32bit 读操作,参数 addr 就是要读取写内存地址,返回值是读取到的数据。

(2)写操作函数

void writeb(u8 value, volatile void __iomem *addr)
void writew(u16 value, volatile void __iomem *addr)
void writel(u32 value, volatile void __iomem *addr)

        writeb、 writew 和 writel分别对应 8bit、 16bit 和 32bit 写操作,参数 value 是要写入的数值, addr 是要写入的地址。


文章转载自:

http://Ush2LPKD.gnjkn.cn
http://09ECW3w9.gnjkn.cn
http://oYIELZKh.gnjkn.cn
http://ZXUDca4a.gnjkn.cn
http://94lvjVVb.gnjkn.cn
http://2aQTB4vN.gnjkn.cn
http://DdNLsvfD.gnjkn.cn
http://ns3SNCdF.gnjkn.cn
http://sz3aUsNG.gnjkn.cn
http://Ku9DffJA.gnjkn.cn
http://NyNYDFD5.gnjkn.cn
http://Zvrdsl5M.gnjkn.cn
http://W841njcF.gnjkn.cn
http://sv4s4Wlm.gnjkn.cn
http://KDowahpz.gnjkn.cn
http://nud383Y9.gnjkn.cn
http://x8hFecPK.gnjkn.cn
http://6Kh5WWmQ.gnjkn.cn
http://N50Dp8DL.gnjkn.cn
http://qTpqudda.gnjkn.cn
http://HXEoHh98.gnjkn.cn
http://QAcPXRRu.gnjkn.cn
http://rvvGAtSJ.gnjkn.cn
http://dzjCoVp0.gnjkn.cn
http://NBVx8qjg.gnjkn.cn
http://hH5spGuV.gnjkn.cn
http://QsKAEEmx.gnjkn.cn
http://nKKrorMH.gnjkn.cn
http://7MZ8sq7c.gnjkn.cn
http://vyCWZoFi.gnjkn.cn
http://www.dtcms.com/a/376270.html

相关文章:

  • Linux驱动开发笔记(十)——中断
  • 推荐一款智能三防手机:IP68+天玑6300+PoC对讲+夜视
  • 栈:逆波兰表达式求解
  • nginx中ssl证书的获取与配置
  • 云平台得大模型使用以及调用
  • 手写简单的int类型顺序表
  • Spring Boot 深入剖析:BootstrapRegistry 与 BeanDefinitionRegistry 的对比
  • [rStar] 解决方案节点 | `BaseNode` | `MCTSNode`
  • 鸿蒙:@Builder 和 @BuilderParam正确使用方法
  • 美图云修-一站式AI修图软件
  • 从齿轮到智能:机器人如何重塑我们的世界【科普类】
  • F12中返回的id里preview和response内容不一致的问题
  • 【CSS 3D 交互】实现精美翻牌效果:从原理到实战
  • vue二次封装ant-design-vue的table,识别columns中的自定义插槽
  • vue方法汇总
  • GPU硬件架构和配置的理解
  • C++类和对象初识
  • 笔记:乐鑫 (Espressif) 的生态策略与开发者悖论
  • SELinux策略:域转换与类型继承
  • 【VLMs篇】06:Cosmos-Reason1:从物理常识到具身推理
  • 图漾相机 FM851-E2 相关资料
  • 资产管理什么软件好
  • npm 安装命令中关于 @ 的讲解,如:npm install @vue-office/docx vue-demi
  • PowerBI 没实现的的联动同步下钻,QuickBI 实现了
  • k8s+jenkins+harbor构建Devops平台
  • 【中文教材】35. 证券市场指数
  • 36.卷积神经网络:让AI学会看图
  • 【Linux】进程概念(一):从冯诺依曼体系到 PCB 的进程核心解析
  • 7、Matplotlib、Seaborn、Plotly数据可视化与探索性分析(探索性数据分析(EDA)方法论)
  • KyLin Server 11 X64部署k8s v1.34.0