假如我们须要设定内核在某个时间后执行某个动作,而且在该时间抵达之前不会阻塞当前进程,则可以使用内核定时器了。也就是:在未来的某个时间点执行某个函数linux系统安装,完成某个任务;例如周期的寻址设备的状态;
通常来说当某个进程注册了定时器和定时器执行函数后,这种函数都不会在该进程还在运行时就执行。反倒是当该进程退出运行后(或则休眠,或则在其他cpu上执行)linux 内核 定时器,这种定时器函数才能执行,也就是说这种定时器函数是异步的执行(不是进程的上下文中执行的,也就是说current表针指向的不是注册那些函数的进程了)。这些异步执行类似中断,所以内核定时器往往也作为“软件中断”的结果而运行的。在这些原子性的上下文中运行时linux 内核 定时器,代码会受好多限制。
必需要遵循的原子上下文规则:
1、不准许访问用户空间;由于这是异步操作linux删除命令,注册进程早已不是当前运行进程了。所以未能获取到正确的进程,也就不能访问用户空间了。
2、current表针在原子模式下是没有任何意义的,也是不可用的。current表针指向的是当前运行进程,而执行代码和当前运行进程无关,所以。。。
3、不能执行休眠或则调度。不能使用schedule或则wait_event,其实也不能用可能会休眠的函数;
代码可以调用in_interrupt()函数来判定自己是否运行在中断上下文中,该函数返回非零时,则表示在中断上下文中执行代码;和in_interrupt()函数相关的是in_atomic()函数。当调度不被准许时,in_atomic()返回值也是非零的;调度不被容许的情况包括硬件和软件中断上下文以及拥有自选锁的任何时间点。在自选锁的情况下,current表针还是可以使用的,但严禁访问用户空间,由于会造成调度的发生;
定时器结构体:
structtimer_list{
.....
structlist_headentry;
unsignedlongexpires;
structtvec_base*base;