首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | HR | 镜像
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
搜索中心 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>系统管理>系统管理>正文

64 位 Linux 中 Power Architecture Time Base 的寄存器

http://www.oklinux.cn  2007-07-14  IBM Carlos Cavanna  会员收藏  游客收藏  【 】 
您查看的文章来源于http://www.oklinux.cn

下面让我们来详细考察一下:

  1. 将 TB 寄存器的值读入 64 位变量 tbr 中。这需要使用汇编语言实现,因为在 C 语言中没有提供相应机制来访问这个寄存器。

    __asm__ __volatile__ ("mftb %[tbr]" : [tbr] "=r" (tbr):);

  1. 计算 TB 寄存器和 tb_orig_stamp 之间的差值作为 elapsed_ticks_since_boot

    elapsed_ticks_since_boot = tbr - cfg->tb_orig_stamp;

  1. 计算 elapsed_ticks_since_boottb_to_xs 的乘积作为 elapsed_xseconds_since_boot

    multiply(elapsed_ticks_since_boot, cfg->tb_to_xs,
    &elapsed_xseconds_since_boot_hi,
    &elapsed_xseconds_since_boot_lo);

    注意我们很有必要使用一个辅助乘法函数。这两个操作数 elapsed_ticks_since_bootcfg->tb_to_xs 都是 64 位长的,它们的乘积是一个 128 位的数字。这么大的值无法使用一个 C 变量来表示,因此这个辅助乘法函数会将其分成两部分,在本例中分别称为 elapsed_xseconds_since_boot_hielapsed_xseconds_since_boot_lo。乘法的详细信息会在 乘法辅助函数 一节中介绍。

  1. 计算 elapsed_xseconds_since_boot_histamp_xsec 之和作为 xseconds_since_epoch

    xseconds_since_epoch =
    cfg->stamp_xsec + elapsed_xseconds_since_boot_hi;

  1. xseconds_since_epoch 除以 xseconds_per_second(右移 20 位)转换成秒,并将结果乘以 nanoseconds_per_second 转换成纳秒作为 作为 nanoseconds_since_epoch。注意这个算法首先执行一个乘法,然后又执行一个除法(移位)。这样可以提供更好的精度。
    multiply(xseconds_since_epoch, nanoseconds_per_second,
                  &nps_temp_hi,
                  &nps_temp_lo);
    
    nanoseconds_since_epoch_lo = nps_temp_lo >> 20;
    nanoseconds_since_epoch_hi = nps_temp_hi << (64 ? 20);
    
    nanoseconds_since_epoch =
              nanoseconds_since_epoch_hi | nanoseconds_since_epoch_lo;
    

请注意:大部分计算都避免更改 tb_update_count 值,该值保存在 count_startcount_end 变量中。这是用来确保从 tb_to_xsstamp_xsec 变量中读出的值是一致的。这种变量的值可以在操作系统检测到更新频率发生变化或操作系统进行频率更改时进行改变。

Linux libc 库解释了 tb_update_count 是如何更新的,以及如何对这个值进行解释:

更新这些变量的代码会增大 tb_update_count 的值,然后更新这两个变量,并再次增大 tb_update_count 的值。这段代码会读取 tb_update_count 的值,读取这两个变量值,然后再次读取 tb_update_count 的值。它会循环处理这个过程,直到两次读取 tb_update_count 可以产生相同的结果并且这个结果是偶数为止。这可以确保能够得到这两个变量的一个一致视图(请参阅 参考资料 中的引用)

另外,tb_update_count 还会用来检测 TB 寄存器何时会溢出。当发生这种情况时,会按照相同的协议执行;tb_update_count 会在必须的修改反映到其他变量中时进行更新。操作系统需要负责检测这种情况。

最后,值得一提的一件有趣的事情是一个 64 位的纳秒值可以表示大约 585 年的时间。



共6页: 上一页 [1] [2] 3 [4] [5] [6] 下一页

上一篇:Linux 上的 WebSphere MQ 开发快速入门   下一篇:Linux下建立Mysql镜像数据库(mysql 4.1)

收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·Linux操作系统下常用压缩文件的解压方式
·Linux平台下安全防护十大招数
·Linux系统磁盘存储区管理原理技巧详解
·Linux环境进程间通信—— 信号(下)
·Linux环境进程间通信——信号(上)
·如何恢复Linux系统中被删除的Ext3型文件
·详细讲解用命令行加挂Linux文件系统的方法
·使用 ActiveScaffold 增强 Ruby on Rails 的功能
·Linux攻略 用Ghost备份Linux系统的方法
·Linux系统攻略 如何重新划分Swap交换分区
·Linux安全攻略如何修复系统的Root密码
·Linux系统下如何进行磁盘配额Quota的设置
·故障排除 Linux操作系统死机处理方法总结
·Linux操作系统时间设置方法介绍
·解决RPM包不能正常使用的问题
·详细讲解 Linux系统下Ramdisk的制作过程
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·VirtualBox为Ubuntu系统配置共享文件夹
·Ubuntu下安装Netgear WG511v2 无线网卡
·Redhat Enterprise Linux磁带机简单操
·Linux系统下创建DBCA报错的解决方法
·Fedora和XP双系统中网卡Realtek冲突问
·Ubuntu开机自动挂载Win分区
·ubuntu8.04如何访问其它分区
·Fedora 9的安全措施
· 移动Linux系统中的TMP分区
·双Linux和多Linux系统的安装方法介绍
·轻松设置Wine程序的中文显示
·Linux系统下强大的杀毒软件:Avast
  阅读排行
·在Linux系统下查看端口的使用情况及启
·在Linux操作系统下查看磁盘空间的好方
·使用源代码将 Glibc 升级到 2.6
·Useradd和Adduser添加用户工具使用方法
·Linux系统的头文件和库文件搜索路径
·Linux下推荐的常用应用程序列表
·Linux环境进程间通信——信号(上)
·设置GRUB默认启动系统及Menu.lst参数介
·Linux系统挂载U盘和硬盘光驱的问题
·Df命令:查看Linux磁盘剩余空间方法介
·什么是Linux?Linux与UNIX之间的关系
·Linux系统利用Crontab命令实现定时重启
·使用 ActiveScaffold 增强 Ruby on Rai
·Linux系统下常用命令及账户管理
·新手入门:手把手教你如何写Makefile
网摘收藏: