Linux驱动----7、与硬件通信

本文探讨Linux驱动中与硬件通信的关键概念,包括使用IO端口和IO内存。介绍了IO端口的注册及访问方法,强调了内存屏障在防止指令重排序和确保可见性中的作用。同时,对比了不同架构如X86和ARM对IO访问的处理方式,特别是内存映射技术在外设交互中的应用。
摘要由CSDN通过智能技术生成

对常规内存优化 ,优化过程是透明的,而且效果良好,但是对I/O操作来说这些优化可能造成致命错误,因为它们受边界效应影响。

side effect(译为边际效应或副作用):是指读取某个地址时可能导致该地址内容发生变化,比如,有些设备的中断状态寄存器只要一读取,便自动清零。I/O 寄存器的操作具有side effect,因此,不能对其操作不能使用cpu缓存。

由编译器优化和硬件重新排序引起的问题的解决方法,对硬件必须以特定顺序执行的操作之间设置内存屏障。

void rmb(void);
void smp_wmb(void);//针对SMP系统

在某些架构上,允许把赋值语句和内存屏障进行合并以提升效率
#define set_mb(var, value) do {var = value; mb();} while 0

int a, b;
a = 2; 
b = 2;

内存屏障就是禁止屏障两边的指令互相穿越,上述可能先执行b=2再执行a=2。当我们在a=2和b=2指令中间插入一个内存屏障的时候,b操作不会越过a操作。把a变成volatile关键字修饰,它就会插入一个内存屏障,volatile关键字有两个内存语义1.可视性,2.禁止指令重排序。

使用IO端口

内核为我们提供了一个IO注册接口,它告诉内核需要使用firs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值