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

文档序号:9708105阅读:1179来源:国知局
一种基于linux用户态调用定时器的方法及系统的制作方法
【技术领域】
[0001]本发明涉及计算机领域,尤其涉及一种基于linux用户态调用定时器的方法及系统
【背景技术】
[0002]计算机技术领域内,定时器是一种常见且必须的技术,是一系列函数的集合体,通过使用其提供的方法能够使软件在固定的时间内完成指定的功能,其目的在于使软件在固定的时间内自动执行某种操做或任务,目前在很多应用系统或应用平台中都要用到定时器来完成周期性的任务或特定时刻的任务执行,如实现自动控制,定时状态切换或延时处理等功能。
[0003]1 inux内核态拥有自己的定时器,可以获取内核的系统时间以及对应的任务调度,但目前用户态没有一个用户态自己的且与内核态同步的定时器,只能够通过调用linux内核提供的init_timer和add_timer,对定时器初始化,将定时器添加到内核的定时器中,由内核的定时器,来实现定时调度,以实现定时处理用户添加的定时器处理任务。
[0004]但上述通过内核定时器实现用户添加的定时器功能,都会产生系统调用,如果系统频繁调用或用户态添加的定时器处理太多的话,那么整个系统的性能和效率就会降低。
[0005]因此,有必要提供一种基于linux用户态调用定时器的方法及系统,以解决上述现有技术存在的技术问题。

【发明内容】

[0006]本发明的目的是提供一种基于linux用户态调用定时器的方法及系统,以减少系统调用,提高系统的性能和效率。
[0007]根据本发明的一个方面,提供一种基于linux用户态调用定时器的方法,包括以下步骤,步骤s 1,在内核通过分配内存函数kmal loc申请8字节连续的内存,返回内存的首虚拟地址kmem;步骤S2,将所述虚拟地址kmem通过—pa命令转换为物理地址kphy ;步骤S3,用户态启动時通过1ctl函數向内核态获取所述物理地址kphy;步骤S4,用户态将所述物理地址kphy转换为虚拟地址umem,用来进行用户态地址访问;步骤S5,在内核态中定义一个全局变量jiff ies并写入虚拟地址kmem;步骤S6,用户态创建执行一个while(l)的死循环线程,获取所述j i f f i e s的值,通过j i f f i e s的值获取系统时间;步骤S7,比较判断所述系统时间与本地保存的上一次时间,调用用户态的定时器处理定时器任务。
[0008]其中,在上述发明中,所述步骤S4中,内核申请的虚拟地址kmem对应的物理地址为kphy,用户态的虚拟地址umem对应的是同一个物理地址kphy,内核向虚拟地址kmem写入的任何数据,用户态都可以通过虚拟地址umem读出来。
[0009]其中,在上述发明中,所述步骤S5中,每当内核发生一次时钟中断时,则将jiffies加1,当jiff ies变化时,内核就将jiff ies的数值写入虚拟地址kmem中。
[0010]其中,在上述发明中,所述步骤S6中While循环首先获取虚拟地址umem的内容,再对应到内核虚拟地址kmem,获取到内核写入在虚拟地址kmem上的所述j iff ies的值。
[ΟΟ??]其中,在上述发明中,所述步骤S6中,While循环的最后面,添加一个sleep(lO)的休眠,以设置循环一次休眠10毫秒。
[0012]根据本发明的另一个方面,提供一种基于linux用户态调用定时器的系统,包括内核态和用户态,其中,内核态包括内核获取地址单元和内核转换单元,所述内核获取地址单元用于在内核通过分配内存函数kmal loc申请8字节连续的内存,返回内存的首虚拟地址kmem,所述内核转换单元用于将虚拟地址kmem通过—pa命令转换为物理地址kphy;用户态包括用户态获取地址单元和用户态转换单元,所述用户态获取地址用于在用户态启动时,通过1ctl函数向内核态获取物理地址kphy;所述用户态转换单元用于将物理地址kphy转换为虚拟地址umem,用来进行用户态地址访问;内核态还包括计时载入单元,用于在内核中定义一个全局变量jiff ies并写入虚拟地址kmem中;用户态还包括循环线程单元,用于创建执行一个while(l)的死循环线程,获取所述jiff ies的值并且通过jiffies的值获取系统时间;用户态还包括比较单元,用于比较判断系统时间与本地保存的上一次时间,调用用户态的定时器处理定时器任务。
[0013]其中,在上述发明中,所述内核申请的虚拟地址kmem对应的物理地址为kphy,用户态的虚拟地址umem对应的是同一个物理地址kphy,内核向虚拟地址kmem写入的任何数据,用户态都可以通过虚拟地址umem读出来。
[0014]其中,在上述发明中,所述计时载入单元,每当内核发生一次时钟中断时,则将jiff ies加1,当jiff ies变化时,内核就将jiff ies的数值写入虚拟地址kmem中。
[0015]其中,在上述发明中,所述循环线程单元,While循环首先获取虚拟地址umem的内容,再对应到内核虚拟地址kmem,获取到内核写入在虚拟地址kmem上的所述j if f ies的值。
[0016]其中,在上述发明中,所述循环线程单元还用于在所述While循环的最后面,添加一个s 1 eep (10)的休眠,保证循环一次休眠10毫秒。
[0017]根据本发明的一种基于linux用户态调用定时器的方法及系统,通过用户态获取内核态jiff ies的值即能获取系统时间,比较判断所述系统时间与本地保存的上一次时间,调用用户态的定时器处理定时器任务,以减少系统调用,提高系统的性能和效率。
[0018]下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
【附图说明】
[0019]图1是本发明的基于linux用户态调用定时器的方法流程图;
[0020]图2是本发明的基于linux用户态调用定时器的系统中内核态结构图;
[0021]图3是本发明的基于linux用户态调用定时器的系统中用户态结构图;
[0022]图4是本发明的基于linux用户态调用定时器的系统原理图。
【具体实施方式】
[0023]为使本发明的目的、技术方案和优点更加清楚明了,下面结合【具体实施方式】并参照附图,对本发明进一步详细说明。应该理解,这些描述只是示例性的,而并非要限制本发明的范围。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本发明的概念。
[0024]图1显示了本发明的基于linux用户态调用定时器的方法流程图;
[0025]参见图1所示,本发明的基于linux用户态调用定时器的方法,包括以下步骤:
[0026]步骤S1,在内核通过分配内存函数kmalloc申请8字节连续的内存,返回内存的首虚拟地址kmem ;
[0027]在此步骤S1中,通过分配内存函数kmalloc()函数,根据语法,void*kmalloc(size_t size,int flags)在内核态中分配连续的虚拟地址,其中,size是要分配内存的大小,以字节为单位,本发明实施例中size为8,即分配8字节连续的内存,并且返回内存的首虚拟地址kmem ;
[0028]步骤S2,将所述虚拟地址kmem通过—pa命令转换为物理地址kphy ;
[0029]在此步骤S2中,所述虚拟地址kmem通过—pa命令转换为物理地址,具体的转换计算过程就是,虚拟地址,大小4个字节(32bit),包含着找到物理地址的信息,分为3个部分:第22位到第31位这10位(最高10位)是页目录中的索引,第12位到第21位这10位是页表中的索引,第0位到第11位这12位(低12位)是页内偏移。处理器通过CR3找到当前页目录所在物理页,取虚拟地址的高lObit,然后把这lObit右移2bit(因为每个页目录项4个字节长,右移2bi t相当于乘4)得到在该页中的地址,取出该地址处PDE (4个字节),就找到了该虚拟地址对应页表所在物理页,取虚拟地址第12位到第21位这10位,然后把这lObit右移2bit(因为每个页表项4个字节长,右移2bit相当于乘4)得到在该页中的地址,取出该地址处的PTE(4个字节),就找到了该虚拟地址对应物理页的地址,最后加上12bit的页内偏移得到了对应的物理地址。
[°03°] 步骤S3,用户态启动通过1ctl函数向内核态获取所述物理地址kphy ;
[0031]通过上述步骤S1和步骤S2,内核态得到所述物理地址kphy后,用户态启动,通过设备驱动程序中对设备的10通道进行管理的接口函数1ctl()向内核态获取所述物理地址kphy ο
[0032]步骤S4,将所述物理地址kphy转换为虚拟地址umem,用来进行用户态地址访问;
[0033]在步骤S3用户态向内核态获取所述物理地址kphy后,通过计算转换所述物理地址kphy为虚拟地址umem ;
[0034]通过上述步骤S1到所述步骤S4,内核申请的虚拟地址kmem对应的物理地址为kphy,而用户态的虚拟地址umem对应的是与内核同一个物理地址kphy,所以内核向虚拟地址kmem写入的任何数据,用户态都可以通过虚拟地址umem读出来。
[0035]步骤S5,在内核态中定义一个全局变量jiff ies并写入虚拟地址kmem;
[0036]在此步骤S5中,所述全局变量jiffies用来纪录自系统启动以来产生地节拍的总数,启动时,内核将该变量j if f ies初始化为0,每当内核发生一次时钟中断时,就会将变量jiff ies加1,当变量jiff ies变化时,内核就将变量j if f ies的数值写入到所述虚拟地址kmem 中。
[0037 ] 步骤S6,用户态创建执行一个wh ile(l)的死循环线程,获取所述jiffies的值,通过jiffies的值获取系统时间;
[0038]在此步骤S6中,用户态创建一个线程,线程里面执行一个While(l)的死循环,循环中首先获取用户态虚拟地址umem的内容,在上述步骤S1到所述步骤S4,用户态都可以通过虚拟地址umem读出来,故用户态可以通过虚拟地址umem对应到内核虚拟地址kmem,获取到内核写入在虚拟地址kmem上的所述变量jiff ies的值;如上步骤S5所述,又因变量jiffies的值是用来纪录自系统启动以来产生地节拍的总数,即能获取系统时间。
[0039]步骤S7,比较判断所述系统时间与本地保
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1