您的位置:首页 > 运维架构 > Linux

Linux内核驱动编程中的一些API(进程并发相关)

2010-11-25 16:58 246 查看
最近刚刚开始看linux内核驱动编程相关的东西,以下是在此过程中比较重要的一些api以及对其的理解,做个笔记,留作以后的参考^-^

struct semaphore{

spinlock_t lock;

usigned int count;

struct list_head;

}

这个数据结构是用于并发控制的信号量。lock为自旋锁,count为信号量计数, list_head是一个双向链表结构的等待队列。

init_MUTEX(semaphore)初始化信号量。

jiffies是linux内核中的全局变量,用来记录自系统启动以来所产生的节拍的总数,其类型为无符号长整形(unsigned int)。系统启动时该变量被初始化为0,随着系统的运行,每次时钟中断程序都会增加该变量的值。

EXPORT_SYMBOL只定义在2.6以后的内核中,作用是被其声明的函数或符号会对全部内核代码都公开,也就是将函数或符号声明为全局的,不用修改内核代码就可以在用户编写的模块中直接调用。

MAX_SCHEDULE_TIMEOUT的值是(long)(~0UL>>1), ~0UL在32位系统中的值为0xffffffff。

schedule_timeout(timeout)函数,为了实现进程在超时到期时被唤醒而又不等待特定的时间(避免声明和使用一个多余的等待队列头),内核提供了schedule_timeout()函数。timeout是要延迟的jiffies数,除非这个函数在给定的timeout流失完之前返回,否则这个函数返回0。在调用该函数之前,要求调用者首先设置当前进程的状态(使用__set_task_state(task,state)),TASK_INTERRUPTIBAL说明这个延迟为可中断的,TASK_UNINTERRUPTIBLE为不可中断的。

down_interruptible()用于获得信号量,如果信号量的值大于0,说明该资源没有被占用,可以立即占用,返回0。该函数是可以被中断的,如果被中断则返回-EINTR。在调用这个函数的过程中如果资源被占用,那么内核会调用schedule_timeout(timeout)来将当前进程挂起timeout时间,如果在挂起的时间内没有获得该资源,那么函数返回-ETIME。通常在获取后面两种返回值后,程序应该返回-ERESTARTSYS。

down_interruptible()几乎是我们始终要使用的版本,它允许等待在某个信号量上的用户空间进程可被用户中断。作为通常的规则,我们不应该使用非中断操作,除非没有其他可变通的方法。非中断操作是建立不可杀进程的好方法,但会让用户感到懊恼。使用down_interruptible()需要额外小心,如果操作被中断,该函数会返回非零值,而调用者不会拥有该信号量,所以需要始终检查返回值,并作出相应的相应。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: