一种用户态程序获取内核jiffies的方法和系统的制作方法

文档序号:6540676阅读:1715来源:国知局
一种用户态程序获取内核jiffies的方法和系统的制作方法
【专利摘要】本发明提供了一种用户态程序获取内核jiffies的方法,其特征在于,该方法包括:S1.在内核中申请一块内存,用来存放内核全局变量jiffies的数值,设所述内存起始地址为kmem,每当内核发生一次时钟中断,jiffies的值加1,每当jiffies发生变化时,内核就将jiffies的值写到kmem中;S2.内核将所述内存的虚拟起始地址kmem转换为物理起始地址kphy;S3.用户态程序获取所述内存的物理起始地址kphy;S4.用户态程序将所述内存的物理起始地址kphy转换为用户态程序用的虚拟起始地址uvir;S5.用户态程序通过读取所述虚拟起始地址uvir,得到内核存储在kmem地址中的内核全局变量jiffies的值。本发明能够在用户态程序方便快捷地获取内核jiffies,进而快速获取系统时间。
【专利说明】—种用户态程序获取内核jiffies的方法和系统
【技术领域】
[0001]本发明涉及计算机【技术领域】,具体涉及一种用户态程序获取内核jiffies的方法和系统。
【背景技术】
[0002]Linux内核具有一个名为jiffies的全局变量,它代表从机器启动时算起的时间节拍数。这个变量最初被初始化为0,每次时钟中断时都会加I。内核通过编程预设系统定时器的频率(即节拍率tick rate),每一个周期称作一个节拍,内核频率通常是1000Hz,也就是每秒钟1000个节拍。通过jiffies和tick rate可以计算时间和相对时间。比如2秒这个时间段可以2*tick rate来表示,那么两秒以后的时间就可以表示为jiffies+2*tickrate,由此可见,通过jiffies可以到当前时间以及N秒以后的时间,这样就为当前要触发或者N秒后要触发的事项提供了可以精确衡量的基准时间。用户态的程序也需要一个基准时间,用来管理用户态程序要处理的事项,因此用户态程序需要一个方法获取基准时间。
[0003]目前用户态程序获取基准时间的方式通常是使用标准的编程接口time或localtime (会精确到年月日时分秒),然后通过此时间来计算N秒以后的时间。
[0004]现有用户态程序需要通过time或local time编程接口获取基准时间,但这些接口都会产生系统调用,如果频繁的获取时间的话,那么整个用户态程序性能、效率就会变得异常低。

【发明内容】

[0005]针对现有技术的不足,本发明提供一种用户态程序获取内核jiffies的方法和系统,能够在用户态程序方便快捷地获取内核jiffies,进而快速获取系统时间。
[0006]为实现上述目的,本发明通过以下技术方案予以实现:
[0007]一种用户态程序获取内核jiffies的方法,该方法包括:
[0008]S1.在内核中申请一块内存,用来存放内核全局变量jiffies的数值,设所述内存起始地址为kmem,每当内核发生一次时钟中断,jiffies的值加I,每当jiffies发生变化时,内核就将jiffies的值写到kmem中;
[0009]S2.内核将所述内存的虚拟起始地址kmem转换为物理起始地址kphy ;
[0010]S3.用户态程序获取所述内存的物理起始地址kphy ;
[0011]S4.用户态程序将所述内存的物理起始地址kphy转换为用户态程序用的虚拟起始地址uvir ;
[0012]S5.用户态程序通过读取所述虚拟起始地址uvir,得到内核存储在kmem地址中的内核全局变量jiffies的值。
[0013]其中,所述步骤SI包括:在内核中通过内核函数kmalloc申请一块内存,该内存用来存放内核全局变量jiffies,所述kmalloc函数返回该内存起始地址kmem,每当内核发生一次时钟中断,jiffies的值加I,每当jiffies发生变化时,内核就将jiffies的值写到kmem 中。
[0014]其中,所述步骤S2包括:利用内核提供的宏_pa将所述内存的虚拟起始地址kmem转换为物理起始地址kphy。
[0015]其中,所述步骤S3包括:用户态程序通过ioctl方法获取所述内存的物理起始地址 kphyο
[0016]其中,所述步骤S4包括:用户态程序通过标准编程接口 mmap将所述内存的物理起始地址kphy转换为用户态程序用的虚拟起始地址uvir。
[0017]一种用户态程序获取内核jiffies的系统,该系统包括内核模块和用户态模块,其中,
[0018]内核模块,用于在内核中申请一块内存,存放内核全局变量jiff ies,设所述内存起始地址为kmem,每当内核发生一次时钟中断,jiffies的值加I,每当jiffies发生变化时,内核就将jiffies的值写到kmem中;内核将所述内存的虚拟起始地址kmem转换为物理起始地址kphy ;
[0019]用户态模块,用于获取所述内存的物理起始地址kphy,将所述内存的物理起始地址kphy转换为用户态程序用的虚拟起始地址uvir,通过读取所述虚拟起始地址uvir,得到内核存储在kmem地址中的内核全局变量jiffies的值。
[0020]其中,所述内核模块中在内核中申请一块内存,存放内核全局变量jiffies包括:通过内核函数kmal1c在内核中申请一块内存,该内存用来存放内核全局变量jiff ies,所述kmal1c函数返回该内存起始地址kmem。
[0021]其中,所述内核模块中将所述内存的虚拟起始地址kmem转换为物理起始地址kphy包括:利用内核提供的宏_pa将所述内存的虚拟起始地址kmem转换为物理起始地址kphy。
[0022]其中,所述用户态模块中获取所述内存的物理起始地址kphy包括:用户态程序通过ioctl方法获取所述内存的物理起始地址kphy。
[0023]其中,所述用户态模块中将所述内存的物理起始地址kphy转换为用户态程序用的虚拟起始地址uvir包括:用户态程序通过标准编程接口 _ap将所述内存的物理起始地址kphy转换为用户态程序用的虚拟起始地址uvir。
[0024]本发明至少具有如下的有益效果:
[0025]在本发明中,从内核申请的起始地址为kmem的内存,内核通过kmem对应到具体的物理地址kvir,用户态程序通过uvr对应到具体的物理地址kphy。也就是说当内核向该申请的内存写入任何数据时,用户态程序都可以通过uvir读取到。jiffies对于内核来讲就是一个全局变量,每当发生一次内核的时钟中断时,就会将jiffies进行加I,每次jiffies变化时,内核就将jiffies的数值写到kmem中,这样用户态程序就可以随时通过读取uvir来得到内核jiffies的数值了。该方法利用读写共享内存的方式获取系统时间,不需要通过time或local time编程接口,省去了对系统进行频繁调用的麻烦,节省了时间,提高了系统性能。
【专利附图】

【附图说明】
[0026]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0027]图1是本发明实施例1中用户态程序获取内核jiffies方法的流程图;
[0028]图2是本发明实施例2中用户态程序获取内核jiffies系统的结构示意图。
【具体实施方式】
[0029]为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0030]实施例1
[0031]本发明实施例提出了一种用户态程序获取内核jiffies的方法,参见图1,包括如下步骤:
[0032]步骤101:在内核中申请一块内存,用来存放内核全局变量jiffies的数值,设所述内存起始地址为kmem,每当内核发生一次时钟中断,jiffies的值加I,每当jiffies发生变化时,内核就将jiffies的值写到kmem中。
[0033]在本步骤中,在内核中通过内核函数kmal1c在内核中申请一块内存,该内存用来存放内核全局变量jiffies,所述kmalloc函数返回该内存起始地址kmem,每当内核发生一次时钟中断,jiffies的值加I,每当jiffies发生变化时,内核就将jiffies的值写到kmem 中。
[0034]步骤102:内核将所述内存的虚拟起始地址kmem转换为物理起始地址kphy。
[0035]在本步骤中,利用内核提供的宏_pa将所述内存的虚拟起始地址kmem转换为物理起始地址kphy。
[0036]步骤103:用户态程序获取所述内存的物理起始地址kphy。
[0037]在本步骤中,用户态程序通过ioctl方法获取所述内存的物理起始地址kphy。
[0038]步骤104:用户态程序将所述内存的物理起始地址kphy转换为用户态程序用的虚拟起始地址uvir。
[0039]在本步骤中,用户态程序通过标准编程接口 mmap将所述内存的物理起始地址kphy转换为用户态程序用的虚拟起始地址uvir。
[0040]步骤105:用户态程序通过读取所述虚拟起始地址uvir,得到内核存储在kmem地址中的内核全局变量jiffies的值。
[0041]在本步骤中,内核将jiffies的数值写到kmem中,这样用户态程序就可以随时通过读取uvir来得到内核jiffies的数值了
[0042]在本实施例中可以看到对于从内核申请到得这块内存,内核通过kmem对应到具体的物理地址kphy,用户态程序通过uvir对应到具体的物理地址kphy。也就是说当内核向该申请的内存写入任何数据时,用户态程序都可以通过uvir读取到。jiffies对于内核来讲就是一个全局变量,每当发生一次内核的时钟中断时,就会将jiffies进行加1,每次jiffies变化时,内核就将jiffies的数值写到kmem中,这样用户态程序就可以随时通过读取uvir来得到内核jiffies的数值了。该方法利用读写共享内存的方式获取系统时间,不需要通过time或local time编程接口,省去了对系统进行频繁调用的麻烦,节省了时间,提闻了系统性能。
[0043]实施例2
[0044]本发明实施例2还提出了一种用户态程序获取内核jiffies的系统,参见图2,该系统包括内核模块201和用户态模块202,其中,
[0045]内核模块201,用于在内核中申请一块内存,存放内核全局变量j if f ies,设所述内存起始地址为kmem,每当内核发生一次时钟中断,jiffies的值加I,每当jiffies发生变化时,内核就将jiffies的值写到kmem中;内核将所述内存的虚拟起始地址kmem转换为物理起始地址kphy ;
[0046]用户态模块202,用于获取所述内存的物理起始地址kphy,将所述内存的物理起始地址kphy转换为用户态程序用的虚拟起始地址uvir,通过读取所述虚拟起始地址uvir,得到内核存储在kmem地址中的内核全局变量jiffies的值。
[0047]其中,所述内核模块中在内核中申请一块内存,存放内核全局变量jiffies包括:通过内核函数kmal1c在内核中申请一块内存,该内存用来存放内核全局变量jiff ies,所述kmalloc函数返回该内存起始地址kmem。
[0048]其中,所述内核模块中将所述内存的虚拟起始地址kmem转换为物理起始地址kphy包括:利用内核提供的宏_pa将所述内存的虚拟起始地址kmem转换为物理起始地址kphy。
[0049]其中,所述用户态模块中获取所述内存的物理起始地址kphy包括:用户态程序通过ioctl方法获取所述内存的物理起始地址kphy。
[0050]其中,所述用户态模块中将所述内存的物理起始地址kphy转换为用户态程序用的虚拟起始地址uvir包括:用户态程序通过标准编程接口 _ap将所述内存的物理起始地址kphy转换为用户态程序用的虚拟起始地址uvir。
[0051]在本实施例中可以看到对于从内核申请到得这块内存,内核通过kmem对应到具体的物理地址kphy,用户态程序通过uvir对应到具体的物理地址kphy。也就是说当内核向该申请的内存写入任何数据时,用户态程序都可以通过uvir读取到。jiffies对于内核来讲就是一个全局变量,每当发生一次内核的时钟中断时,就会将jiffies进行加1,每次jiffies变化时,内核就将jiffies的数值写到kmem中,这样用户态程序就可以随时通过读取uvir来得到内核jiffies的数值了。该方法利用读写共享内存的方式获取系统时间,不需要通过time或local time编程接口,省去了对系统进行频繁调用的麻烦,节省了时间,提闻了系统性能。
[0052]以上实施例仅用于说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
【权利要求】
1.一种用户态程序获取内核jiffies的方法,其特征在于,该方法包括: S1.在内核中申请一块内存,用来存放内核全局变量jiffies的数值,设所述内存起始地址为kmem,每当内核发生一次时钟中断,jiffies的值加I,每当jiffies发生变化时,内核就将jiffies的值写至Li kmem中; S2.内核将所述内存的虚拟起始地址kmem转换为物理起始地址kphy; S3.用户态程序获取所述内存的物理起始地址kphy; S4.用户态程序将所述内存的物理起始地址kphy转换为用户态程序用的虚拟起始地址 uvir ; S5.用户态程序通过读取所述虚拟起始地址uvir,得到内核存储在kmem地址中的内核全局变量jiffies的值。
2.根据权利要求1所述的方法,其特征在于,所述步骤SI包括:在内核中通过内核函数kmalloc申请一块内存,该内存用来存放内核全局变量jiffies,所述kmalloc函数返回该内存起始地址kmem,每当内核发生一次时钟中断,jiffies的值加I,每当jiffies发生变化时,内核就将jiffies的值写到kmem中。
3.根据权利要求1所述的方法,其特征在于,所述步骤S2包括:利用内核提供的宏_pa将所述内存的虚拟起始地址kmem转换为物理起始地址kphy。
4.根据权利要求3所述的方法,其特征在于,所述步骤S3包括:用户态程序通过ioctl方法获取所述内存的物理起始地址kphy。
5.根据权利要求4所述的方法,其特征在于,所述步骤S4包括:用户态程序通过标准编程接口 _ap将所述内存的物理起始地址kphy转换为用户态程序用的虚拟起始地址Uvir0
6.一种用户态程序获取内核jiffies的系统,其特征在于,该系统包括内核模块和用户态模块,其中, 内核模块,用于在内核中申请一块内存,存放内核全局变量jiff ies,设所述内存起始地址为kmem,每当内核发生一次时钟中断,jiffies的值加I,每当jiffies发生变化时,内核就将jiffies的值写到kmem中;内核将所述内存的虚拟起始地址kmem转换为物理起始地址kphy ; 用户态模块,用于获取所述内存的物理起始地址kphy,将所述内存的物理起始地址kphy转换为用户态程序用的虚拟起始地址uvir,通过读取所述虚拟起始地址uvir,得到内核存储在kmem地址中的内核全局变量jiffies的值。
7.根据权利要求6所述的系统,其特征在于,所述内核模块中在内核中申请一块内存,存放内核全局变量j i f f i es包括:通过内核函数kmal 1c在内核中申请一块内存,该内存用来存放内核全局变量jiffies,所述kmalloc函数返回该内存起始地址kmem。
8.根据权利要求6所述的系统,其特征在于,所述内核模块中将所述内存的虚拟起始地址kmem转换为物理起始地址kphy包括:利用内核提供的宏_pa将所述内存的虚拟起始地址kmem转换为物理起始地址kphy。
9.根据权利要求8所述的系统,其特征在于,所述用户态模块中获取所述内存的物理起始地址kphy包括:用户态程序通过ioctl方法获取所述内存的物理起始地址kphy。
10.根据权利要求9所述的系统,其特征在于,所述用户态模块中将所述内存的物理起始地址kphy转换为用户态程序用的虚拟起始地址uvir包括:用户态程序通过标准编程接口 _ap将所述内 存的物理起始地址kphy转换为用户态程序用的虚拟起始地址uvir。
【文档编号】G06F9/48GK103902371SQ201410096597
【公开日】2014年7月2日 申请日期:2014年3月14日 优先权日:2014年3月14日
【发明者】李鹏 申请人:汉柏科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1