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

 

共享资源-> 竞态

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

 

感觉:

       只要 掌握 自旋锁 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************************************************    

 


 

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值