一种基于linux用户态调用定时器的方法及系统的制作方法_2

文档序号:9708105阅读:来源:国知局
存的上一次时间,调用用户态的定时器处理定时器任务。
[0040]所述While循环的最后面,添加一个sleep(10)的休眠,保证循环一次休眠10毫秒,通过步骤S6获取系统时间后,比较判断所述系统时间与本地保存的上一次时间,如果大于10毫秒,即调用用户态的定时器处理定时器任务。
[0041]通过采用上述流程,即用户态创建的定时器处理,通过用户态提供的接口,添加到用户态的定时器中,实现用户态调用定时器处理的方式,实现定时处理任务,减少系统调用,提尚系统性能和效率。
[0042]图2显示了本发明的基于linux用户态调用定时器的系统中内核态结构图;图3显示了本发明的基于linux用户态调用定时器的系统中用户态结构图;图4显示了本发明的基于linux用户态调用定时器的系统原理图。
[0043]参见图2和图3及图4所示,本发明的基于1inux用户态调用定时器的系统,包括内核态和用户态。
[0044]其中,所述内核态包括内核获取地址单元1和内核转换单元2,所述内核获取地址单元1在内核通过分配内存函数kma lloc申请8字节连续的内存,返回内存的首虚拟地址kmem,具体地,通过分配内存函数kmal 1 oc()函数,根据语法,void*kmal 1 oc(size_t size,int flags)在内核态中分配连续的虚拟地址,其中,size是要分配内存的大小,以字节为单位,本发明实施例中size为8,即分配8字节连续的内存,并且返回内存的首虚拟地址kmem ;
[0045]所述内核转换单元2将所述虚拟地址kmem通过—pa转换为物理地址kphy,具体的转换计算过程就是,虚拟地址,大小4个字节(32bit),包含着找到物理地址的信息,分为3个部分:第22位到第31位这10位(最高10位)是页目录中的索引,第12位到第21位这10位是页表中的索引,第0位到第11位这12位(低12位)是页内偏移。处理器通过CR3找到当前页目录所在物理页,取虚拟地址的高lObit,然后把这lObit右移2bit(因为每个页目录项4个字节长,右移2bit相当于乘4)得到在该页中的地址,取出该地址处Η)Ε(4个字节),就找到了该虚拟地址对应页表所在物理页,取虚拟地址第12位到第21位这10位,然后把这lObit右移2bit(因为每个页表项4个字节长,右移2bit相当于乘4)得到在该页中的地址,取出该地址处的PTE(4个字节),就找到了该虚拟地址对应物理页的地址,最后加上12bit的页内偏移得到了对应的物理地址。
[0046]用户态包括用户态获取地址单元4和用户态转换单元5,所述用户态获取地址单元4在用户态启动时,通过设备驱动程序中对设备的10通道进行管理的接口函数1ctl函数()向内核态获取所述物理地址kphy。
[0047]用户态向内核态获取所述物理地址kphy后,通过所述用户态转换单元4计算转换所述物理地址kphy为虚拟地址umem用来进行用户态地址访问,即内核申请的虚拟地址kmem对应的物理地址为kphy,而用户态的虚拟地址umem对应的是与内核同一个物理地址kphy,所以内核向虚拟地址kmem写入的任何数据,用户态都可以通过虚拟地址umem读出来。
[0048]所述内核态还包括计时载入单元3,用于在内核中定义一个全局变量jiffies并写入虚拟地址kmem中,所述全局变量jiff ies用来纪录自系统启动以来产生地节拍的总数,启动时,内核将该变量jiff ies初始化为0,每当内核发生一次时钟中断时,就会将变量jiff ies加1,当变量jiff ies变化时,内核就将变量j if f ies的数值写入到所述虚拟地址kmem 中。
[0049]用户态还包括循环线程单元6,用于创建一个线程,线程里面执行一个While (1)的死循环,循环中首先获取用户态虚拟地址umem的内容,如上述描述,用户态都可以通过虚拟地址umem读出来,故用户态可以通过虚拟地址umem对应到内核虚拟地址kmem,获取到内核写入在虚拟地址kmem上的所述变量j i f f i e s的值;如上所述,又因变量j iffies的值是用来纪录自系统启动以来产生地节拍的总数,即能获取系统时间。
[0050]所述While循环的最后面,添加一个sleep(10)的休眠,保证循环一次休眠10毫秒,用户态还包括比较单元7,比较判断获取的所述系统时间与本地保存的上一次时间,如果大于10毫秒,即调用用户态的定时器处理定时器任务。
[0051]通过采用上述系统,即用户态创建的定时器处理,通过用户态提供的接口,添加到用户态的定时器中,实现用户态调用定时器处理的方式,实现定时处理任务,减少系统调用,提尚系统性能和效率。
[0052]综上所述,本发明的一种基于linux用户态调用定时器的方法及系统,用户态创建的定时器处理,通过用户态提供的接口,添加到用户态的定时器中,实现用户态调用定时器处理的方式,实现定时处理任务,减少系统调用,提高系统性能和效率。
[0053]应当理解的是,本发明的上述【具体实施方式】仅仅用于示例性说明或解释本发明的原理,而不构成对本发明的限制。因此,在不偏离本发明的精神和范围的情况下所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。此外,本发明所附权利要求旨在涵盖落入所附权利要求范围和边界、或者这种范围和边界的等同形式内的全部变化和修改例。
【主权项】
1.一种基于linux用户态调用定时器的方法,其特征在于,包括以下步骤: 步骤S1,在内核通过分配内存函数kmal 10C申请8字节连续的内存,返回内存的首虚拟地址kmem ; 步骤S2,将所述虚拟地址kmem通过—pa命令转换为物理地址kphy ; 步骤S3,用户态启动时,通过1ctl函数向内核态获取所述物理地址kphy; 步骤S4,用户态将所述物理地址kphy转换为虚拟地址umem,用来进行用户态地址访问; 步骤S5,在内核态中定义一个全局变量jiffies并写入虚拟地址kmem; 步骤S6,用户态创建执行一个while(l)的死循环线程,获取所述jiff ies的值,通过jiffies的值获取系统时间; 步骤S7,比较判断所述系统时间与本地保存的上一次时间,调用用户态的定时器处理定时器任务。2.根据权利要求1所述的基于linux用户态调用定时器的方法,其特征在于,所述步骤S4中,内核申请的虚拟地址kmem对应的物理地址为kphy,用户态的虚拟地址umem对应的是同一个物理地址kphy,内核向虚拟地址kmem写入的任何数据,用户态都可以通过虚拟地址umem读出来。3.根据权利要求2所述的基于linux用户态调用定时器的方法,其特征在于,所述步骤S5中,每当内核发生一次时钟中断时,则将jiff ies加1,当jiff ies变化时,内核就将jiffies的数值写入虚拟地址kmem中。4.根据权利要求3所述的基于linux用户态调用定时器的方法,其特征在于,所述步骤S6中Whi le循环首先获取虚拟地址umem的内容,再对应到内核虚拟地址kmem,获取到内核写入在虚拟地址kmem上的所述j i f f i es的值。5.根据权利要求1至4中任一项所述的基于linux用户态调用定时器的方法,其特征在于,所述步骤S6中,While循环的最后面,添加一个sleep(lO)的休眠以设置循环一次休眠106.—种基于linux用户态调用定时器的系统,其特征在于,包括:内核态和用户态,其中, 内核态包括内核获取地址单元和内核转换单元,所述内核获取地址单元用于在内核通过分配内存函数kmal loc申请8字节连续的内存,返回内存的首虚拟地址kmem,所述内核转换单元用于将虚拟地址kmem通过—pa命令转换为物理地址kphy; 用户态包括用户态获取地址单元和用户态转换单元,所述用户态获取地址用于在用户态启动时,通过1ctl函数向内核态获取物理地址kphy;所述用户态转换单元用于将物理地址kphy转换为虚拟地址umem,用来进行用户态地址访问; 内核态还包括计时载入单元,用于在内核中定义一个全局变量j if f ies并写入虚拟地址kmem中; 用户态还包括循环线程单元,用于创建执行一个while(l)的死循环线程,获取所述jiff ies的值并且通过jiff ies的值获取系统时间; 用户态还包括比较单元,用于比较判断系统时间与本地保存的上一次时间,调用用户态的定时器处理定时器任务。7.根据权利要求6所述的基于linux用户态调用定时器的系统,其特征在于,所述内核申请的虚拟地址kmem对应的物理地址为kphy,用户态的虚拟地址umem对应的是同一个物理地址kphy,内核向虚拟地址kmem写入的任何数据,用户态都可以通过虚拟地址umem读出来。8.根据权利要求7所述的基于linux用户态调用定时器的系统,其特征在于,所述计时载入单元,每当内核发生一次时钟中断时,则将jiffies加1,当jiffies变化时,内核就将jiffies的数值写入虚拟地址kmem中。9.根据权利要求8所述的基于linux用户态调用定时器的系统,其特征在于,所述循环线程单元,Whi le循环首先获取虚拟地址umem的内容,再对应到内核虚拟地址kmem,获取到内核写入在虚拟地址kmem上的所述j i f f i es的值。10.根据权利要求6至9中任一项所述的基于linux用户态调用定时器的系统,其特征在于,所述循环线程单元还用于在所述While循环的最后面,添加一个sleep(10)的休眠,保证循环一次休眠10毫秒。
【专利摘要】本发明公开一种基于linux用户态调用定时器的方法及系统,其包括在内核通过kmalloc申请8字节连续的内存,返回内存的首虚拟地址kmem;将虚拟地址kmem通过_pa转换为物理地址kphy;用户态启动通过ioctl向内核态获取物理地址kphy;将物理地址kphy转换为虚拟地址umem,用来进行用户态地址访问;在内核态中定义一个全局变量jiffies并写入虚拟地址kmem;用户态创建执行一个while(1)的死循环线程,获取jiffies的值,通过jiffies的值获取系统时间;比较判断系统时间与本地保存的上一次时间,调用用户态定时器处理定时器任务;如此减少系统调用,提高系统的性能和效率。
【IPC分类】G06F9/445
【公开号】CN105468400
【申请号】CN201510482761
【发明人】赵众
【申请人】汉柏科技有限公司
【公开日】2016年4月6日
【申请日】2015年8月3日
当前第2页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1