Linux内核驱动编程中的一些API(进程并发相关)
2010-11-25 16:58
330 查看
最近刚刚开始看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()需要额外小心,如果操作被中断,该函数会返回非零值,而调用者不会拥有该信号量,所以需要始终检查返回值,并作出相应的相应。
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()需要额外小心,如果操作被中断,该函数会返回非零值,而调用者不会拥有该信号量,所以需要始终检查返回值,并作出相应的相应。
相关文章推荐
- OC中并发编程的相关API和面临的挑…
- 关于Web开发里并发、同步、异步以及事件驱动编程的相关技术
- OC中并发编程的相关API和面临的挑战(1)
- 关于Web开发里并发、同步、异步以及事件驱动编程的相关技术
- OC中并发编程的相关API和面临的挑战(1)
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux中断机制之四--中断API
- OC中并发编程的相关API和面临的挑战(1)
- OC中并发编程的相关API和面临的挑战
- OC中并发编程的相关API和面临的挑战
- OC中并发编程的相关API和面临的挑战(2)
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux中断机制之四--中断API
- 并发,同步,异步以及事件驱动编程的相关技术
- OC中并发编程的相关API和面临的挑战(1)
- OC中并发编程的相关API和面临的挑战(2)
- OC中并发编程的相关API和面临的挑战
- inux 进程2 --- 进程的创建及相关api
- 网络编程(6)单进程多线程并发服务器实现
- linux内核中与进程相关的数据结构(基于linux3.16-rc4)
- UFT GUI 测试—— 概述 相关项: GUI 测试和组件 UFT GUI 测试解决方案采用关键字驱动测试的概念, 以增强测试创建和维护。 关键字驱动测试是一项将大量编程工作与实际测试步骤分离的技术
- Android编程实现连接Wifi(运用Wifi 相关 API)