7--1linux设备驱动中的并发控制

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

 

共享资源-> 竞态

自旋锁 信号量 是对 共享数据的保护,而不是对代码的保护。

 

感觉:

       只要 掌握 自旋锁 spin_lock  这个 锁, 和 信号量 down_interruptible(&sem)这连个最常用的就可以了。

 

***********************************************************

 

信号量(semephore)是用于保护临界区的一种常用方法。他的使用方法与自旋锁类似。

相同之处:只有得到信号量的进程才能进入执行临界区代码。

不同之处:当获取不到信号量时,进程不会原地打转,而是进入 休眠  等待状 态。

 

获得信号量:

int down_interruptible(struct semaphore *sem);

该函数功能与down()类似,不同之处为,因为down()而进入睡眠状态的进程不能被信号打断,

而因为down_interruptible()而进入睡眠状态的进程能被信号打断,信号也会导致该函数返回,这时候函数的返回值非0

。。。。

if(down_interruptilble(&sem))

{

     return -ERESTARTSYS;

}

。。。。

自己的理解:

               首先执行  down_interruptible();

               如果立即 获得信号量,则跳过if(),,向下继续执行。。

               如果没有立即获得信号量,则进程进入睡眠等待状态,在进程睡眠等待的时候,可以响应中断,如果进程被信号打断,那么

函数down_interruptible(&sem) 返回一个非 0 的值,

               -ERESTRATSYS,重新执行该系统调用(相当于重新启动)

 

互斥体:

         int fastcall mutex_lock(struct mutex *lock)

***************************************************************************

当参数个数多于一个时,按照什么顺序把参数压入堆栈
函数调用后,由谁来把堆栈恢复原装    
内存 还是 寄存器
在高级语言中,通过函数调用约定来说明这两个问题。常见的调用约定有:

stdcall
cdecl
fastcall
thiscall
naked call

 

 

fastcall
fastcall调用约定和stdcall类似,它意味着:

函数的第一个和第二个DWORD参数(或者尺寸更小的)通过ecx和edx传递,其他参数通过
从右向左的顺序压栈
被调用函数清理堆栈
函数名修改规则同stdcall
其声明语法为:int fastcall function(int a,int b)

 

fastcall
1)参数压栈顺序从右到左。
2)如果可能使用寄存器(register)来传递参数。使用寄存器做参数比将参数压入堆栈(堆栈就是内存)快得多,所以叫fastcall。


http://tieba.baidu.com/f?kz=87050749  资料来源

***************************************************************************


**********************网上关于fastcall解答***************************************

最近在阅读Linux内核源代码的时候,发现有很多__attribute__其中有一个宏FASTCALL(x)或者fastcall用的就比较多,定 义如下:
#define FASTCALL(x)x __attribute__((regparm(3)))
#define fastcall __attribute__((regparm(3)))
意思是,最多可以使用3个寄存器(或许是eax,edx,ecx)来传送前3个参数,其他参数则压入栈中,而一般来说,函数的调用是基于栈的。
#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
意思就是使用0个寄存器来进行参数传递,顾名思义它是想使得调用这个函数时的所有参数都压入栈中,相对于FASTCALL的使用方式当然是要慢一些了

 ***************************the end************************************************    

 


 

 

 


智能座舱测试工程师必看:从零搭建自动化测试框架的5个实战技巧 本文为智能座舱测试工程师提供从零搭建自动化测试框架的5个实战技巧,涵盖环境搭建、ADB高级应用、Python脚本工程化、Monkey测试优化及性能调优。通过ADB深度操作和Python脚本封装,帮助测试人员构建高可复用的智能座舱测试解决方案,显著提升测试效率与问题发现率。 阅读详情

相关推荐

STM32 使用IO口模拟I2C时序

上一篇《I2C协议详解》 我们了解了I2C的操作流程,这一篇,我们就使用I2C,来对EEPROM进行操作吧。 我们做两种选择: 1.时序由IO口模拟高低电平,需要了解协议并按照协议操作相应的IO口。 2.时序由硬件自行产生,不需要人工干预; 由硬件产生的I2C时序,我们借助Stm32Cube配置实现便可,我们这一篇,抛开Stm32Cube,手撕代码,根据I2C的时序,一步步地实现I2C对...

8904

Linux下设计并发队列

设计并发队列 #include #include using namespace std; template class Queue { public: Queue( ) { pthread_mutex_init(&_lock, NULL); } ~Queue( ) {

luxiaoxun的专栏 2899

网络可视化工具netron详细安装流程

netron安装目录1.netron 简介2.不同操作系统下的安装使用方式2.1 在线版本:只要有浏览器就可以2.2 不同操作系统安装使用3.netron支持的网络框架4.netron测试演示 1.netron 简介 在实际的项目中,经过会遇到各种网络模型,需要我们快速去了解网络结构。如果单纯的去看模型文件,脑海中很难直观的浮现网络的架构。 这时,就可以使用netron可视化工具,可以清晰的看到每一层的输入输出,网络总体的架构,而且支持各种不同网络框架,简单好用。 2.不同操作系统下的安装使用方式 2.1

江南研习社 12万+

自旋锁与信号量(转载)

原文地址:自旋锁与信号量(转载)作者:joee33在驱动程序中,当多个线程同时访问相同的资源时 (驱动程序中的全局变量是一种典型的共享资源), 可能会引发"竞态",因此我们必须对共享资源进行并发控制Linux内核中解决并发控制的最常用方法是自旋锁与信号量(绝大多数时候作为互斥锁使用)。   自旋锁与信号量"类似而不类",类似说的是它们功能上的相似性,"不类"指代它们在本质和实现机理上完全不一样

shangyaowei的专栏 405

7章 Linux设备驱动中的并发控制之一(并发与竞态)

本章导读Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态(竞争状态)。Linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景。7.1讲解了并发和竞态的概念及发生场合。7.2讲解了编译乱序、执行乱序的问题,以及内存屏障。7.3~7.8分别讲解了中断屏蔽、原子操作、自旋锁、信号量和互斥体等并发控制机制。7.1 并发与竞态并发是多个执行单元同时、并行...

xiezhi123456的博客 623

Linux设备驱动开发详解

Linux设备驱动开发详解Linux设备驱动开发详解Linux设备驱动开发Linux设备驱动开发详解1. linux设备驱动概述及开发环境搭建2. 驱动设计的硬件基础3. linux内核内核编程4. linux内核模块5. linux文件系统与设备文件6. 字符设备驱动7. linux设备驱动中的并发控制8. linux设备驱动中的阻塞与非阻塞I/O9. linux设备驱动中的异步通知与异步I/O10. 中断与时钟11. 内存与I/O访问12. linux设备驱动的软件架构思想13. linux块设备驱.

tan1666的博客 2万+

7Linux设备驱动并发控制详解

本文详细介绍了Linux设备驱动开发中的并发控制机制,重点分析了竞态条件问题及其解决方案。主要内容包括:1) 原子操作(整型和位操作)实现简单共享变量的安全访问;2) 自旋锁机制用于短临界区保护;3) 信号量和完成量处理复杂同步场景。通过多个内核模块代码示例(如原子计数器、自旋锁保护共享数据等),展示了这些技术在Ubuntu 20.04环境下的实际应用。文章强调,合理选择并发控制方法是确保驱动稳定性和性能的关键。

小宝哥Code的专栏 804

Linux设备驱动开发详解【七】_ Linux设备驱动中的并发控制

本文简介 Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发访问会导致竞态。 Linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景。7.1节描述了并发和竞态的概念及发生场合。7.2~7.5节分别讲解了中断屏蔽、原子操作、自旋锁和信号量等并发控制机制。7.6节讲解了增加并发控制后的globalmem的设备驱动。 ...

santirenpc的博客 547

Linux设备驱动中的并发控制(一)

Linux设备驱动中必须解决的一个问题是,并发的访问会导致竞态,即使是经验丰富的驱动工程师也会常常设计出包含并发问题bug的驱动程序。Linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景。一起了解一下。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 522

Linux设备驱动开发详解-Note(14)--- Linux 设备驱动中的并发控制(1)

Linux 设备驱动中的并发控制(1) 成于坚持,败于止步 并发与竞态 并发(concurrency)指的是多个执行单元同时、并行被执行,而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问则很容易导致竞态(race conditions)。例如,对于 globalmem 设备,假设一个执行单元 A 对其写入 3000 个字符“a”,而另一个执行单元 B 对其写入 4000 ...

Ryze的博客 380

第七章-Linux设备驱动中的并发控制

第七章-Linux设备驱动中的并发控制

分享嵌入式,移动端,智能应用,数据库等专业板块,记录知识碎片!!! 348

LinuxLinux设备驱动开发详解:基于最新的Linux 4.0内核

1 Linux设备驱动概述及开发环境构建 1.1 设备驱动的作用 驱使硬件设备行动 1.2 无操作系统时的设备驱动 典型架构:一个无限循环中夹杂着对设备中断的检测或者对设备的轮询 1.3 有操作系统时的设备驱动 并发 、内存管理 1.4 Linux 设备驱动 1.4.1 设备的分类及特点 ● 字符设备。 ● 块设备。 ● 网络...

九牧林的博客 1万+

Linux设备驱动开发详解:第7Linux设备驱动中的并发控制

(1)、自旋锁:是一种典型的 对临界资源进行互斥访问的手段,其名称来源于它的工作方式。(2)、 local_irq_disable()与local_irq_enable()都只能禁止和使能本CPU内的中断,因此并不能解决SMP多CPU引发的竞态,使用上述接口意味着bug,它适合于自旋锁联合使用;(3)、 local_irq_save(flags)除了进行禁止中断的操作以外,还保存目前CPU的中断位信息, local_irq_restore(flags)与之相反,对于ARM而言,就是保存和恢复CPSR;

qq_41962968的博客 1306

Linux设备驱动开发详解:基于最新的Linux 4.0内核

baohua@baohua-VirtualBox:~/develop/linux$ sudo ./module.sh CHK include/config/kernel.release CHK include/generated/uapi/linux/version.h CHK include/generated/utsrelease.h make[1]: `...

xlbtlmy的博客 2980

linux设备驱动开发详解》插图汇总

该文档所有插图均来自宋宝华老师的《linux设备驱动开发详解——-基于最新的linux4.0内核》一书。截图出来仅做平时网页查阅学习。

专注嵌入式软硬件开发。 4506

Linux设备驱动开发详解-Note(15)--- Linux 设备驱动中的并发控制(2)

Linux 设备驱动中的并发控制(2) 成于坚持,败于止步 信号量 信号量的使用 信号量(semaphore)是用于保护临界区的一种常用方法,它的使用方式和自旋锁类似。与自旋锁相同,只有得到信号量的进程才能执行临界区代码。但是,与自旋锁不同的是,当获取不到信号量时,进程不会原地打转而是进入休眠等待状态。 Linux 系统中与信号量相关的操作主要有如下 4 种。 1.定义信号量 下列代码定义名称为 ...

Ryze的博客 361

linux驱动程序设计7 Linux设备驱动中的并发控制

Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态,即使是经验丰富的驱动工程师也会常常设计出包含并发问题bug的驱动程序。Linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景。7.1节讲解了并发和竞态的概念及发生场合。7.2节则讲解了编译乱序、执行乱序的问题,以及内存屏障。7.3~7.8节分别讲解了中断屏蔽、原子操作、自旋锁、信号量和互斥体等...

oushaojun2的专栏 1188

Linux设备驱动中的并发控制(四)

并发和竞态广泛存在,中断屏蔽、原子操作、自旋锁和互斥体都是解决并发问题的机制。中断屏蔽很少单独被使用,原子操作只能针对整数进行,因此自旋锁和互斥体应用最为广泛。自旋锁会导致死循环,锁定期间不允许阻塞因此要求锁定的临界区小。互斥体允许临界区阻塞,可以适用于临界区大的情况。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 218

linux 两个驱动 竞态,第7章 Linux设备驱动中的并发控制之一(并发与竞态)

本章导读Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态(竞争状态)。Linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景。7.1讲解了并发和竞态的概念及发生场合。7.2讲解了编译乱序、执行乱序的问题,以及内存屏障。7.3~7.8分别讲解了中断屏蔽、原子操作、自旋锁、信号量和互斥体等并发控制机制。7.1 并发与竞态并发是多个执行单元同时、并行...

weixin_30162121的博客 237

【亲测免费】 深入Linux设备驱动的世界:《Linux设备驱动详解第二版》推荐

深入Linux设备驱动的世界:《Linux设备驱动详解第二版》推荐 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在Linux开发领域,设备驱动程序是连接硬件与操作系统的桥梁,掌握设备驱动的开发技术对于嵌入式工程师和Linux开发人员来说至关重要。《Linux设备驱动详解第二版》是由资深Linux内核开发者宋宝华老师精心编写的一本全面介绍Linux设备驱动开发的权威书...

gitblog_09803的博客 1162

Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)进展同步更新

本博实时更新《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)的最新进展。 目前已经完成稿件。 2015年8月9日,china-pub开始上线预售: http://product.china-pub.com/4733972 2015年8月20日,各路朋友报喜说已经拿到了书。 本书已经rebase到开发中的Linux 4.0内核,案例多数基于多核CORTEX-A9平台。 本书微信公众号"linux阅码场", 扫描下方二维码关注

宋宝华 6万+
上一篇: 6--1 globalmem虚拟设备
下一篇: 黄家驹 ----无悔这一生
yuweixian
博客等级 码龄17年 106粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值