您查看的文章来源于http://www.oklinux.cn
使用 Power Architecture™ 技术的 Time Base 寄存器可以在使用 PowerPC® 和 Cell Broadband Engine™ (Cell/B.E.)微处理器运行 Linux® 的系统中以纳秒的精度来度量时间。可以有效使用这些技术的应用程序包括时间戳事务(通常是对单一用途的消息进行加密或进行数字签名),对代码进行分析,实现微小、精确的软件延时。
应用程序通常都会使用至少一种形式来度量时间(例如,事务时间戳)。为了实现这个目的,POSIX 库提供了一些与时间有关的函数,例如 gettimeofday
,它为应用程序开发人员提供了一个简单易用的接口。当应用程序深入使用这些时间函数时,更有效地使用这些与时间有关的函数,可以改进程序的整体性能。这对于某些底层任务来说是无价的,例如对代码进行分析,或者在设备驱动程序或其他严格时间要求的代码中进行精确的延时。
在 Power Architecture 平台上,可以通过使用 gettimeofday
进一步改进性能。本文后面给出了一种在 PowerPC 和 Cell/B.E. PPE 处理器上运行的 64 位 Linux® 操作系统上从 UNIX® 纪元(1970 年 1 月 1 日)开始至今的一种有效而精确的时间度量机制,它可以提供毫秒和纳秒的精度。然而,需要注意有些 Linux 版本提供了本文中给出的一个 gettimeofday
的类似实现,不过您可能会注意到它们所实现的精度要稍微低一些。
这种技术也可以在 AIX 操作系统上实现。不过,下面介绍的例子和系统细节都是对应于 64 位的 Linux 实现的。
Time Base 寄存器
Power Architecture 文档(Book II: PowerPC Virtual Environment Architecture,请参阅 参考资料)提供了一个名为 Time Base(TB)的计数寄存器,它用来记录系统时间。TB 寄存器会以一种依赖于实现的频率周期性地增加,这个频率可能不是恒定的。操作系统(OS)要负责确定更新频率是否发生了变化,以及对内部结构进行必要的调整。
PowerPC Architecture 声明如下:
- TB 寄存器是 64 位长的。
- 每次更新都会增加 1。
- 操作系统必须要能够确定更新频率。
- 当 TB 达到自己的最大值时,就会溢出并从 0 重新开始。此时没有明显的迹象,要交由操作系统进行处理。
- OS 必须要在开机时对 TB 寄存器进行初始化。
详细信息请查看 PowerPC Virtual Environment Architecture(可在本页底部的 参考资料 部分查看关于这些声明和本文提及的其他文档的链接)。注意 Cell/B.E. PPE 也实现了 TB 寄存器。
TB 寄存器自己并没有包含计算时间所需要的足够信息。Power Architecture 规范将很多对 TB 寄存器进行处理的责任都交给操作系统来完成,操作系统需要提供其他一些信息,例如更新频率、启动时的 Time Base 寄存器的值,等等。整个计算机制非常迅速且高效。
在 Linux 操作系统的情况中,系统库可以在 systemcfg
结构中导出以下信息:
清单 1. Time Base 特有的系统信息
struct systemcfg {
...
__u64 tb_orig_stamp; /* Time Base at boot */
__u64 tb_ticks_per_sec; /* Time Base ticks / sec */
__u64 tb_to_xs; /* Inverse of TB to 2^20 */
__u64 stamp_xsec;
__u64 tb_update_count; /* Time Base atomicity ctr */
...
};
|
其中:
tb_orig_stamp
:系统引导时 TB 寄存器的值
tb_ticks_per_sec
:每秒 TB 寄存器的滴答数(在今后计算中不会使用)
tb_to_xs
:用来将 TB 滴答数转换成 xseconds
stamp_xsec
:包含了系统引导时的时间,单位是 xseconds
tb_update_count
:在对 TB 寄存器进行更新时用作计数器使用
这个结构可以通过包含下面的头文件来访问:
#include <asm/systemcfg.h>
如何使用汇编语言读取寄存器
mftb
指令可以将 TB 寄存器的值传输到一个通用寄存器中。其语法如下:
mftb rx
PowerPC Virtual Environment Architecture [1] 提供了更多有关这条指令的技术细节,并介绍了一个使用汇编语言计算