Linux设备驱动---jiffies与jiffies_64
2013-10-09 16:17
423 查看
在 Linux 内核中,jiffies 用于记录系统自启动到当前时刻系统时钟所产生的滴答数。 每一秒系统时钟的中断次数等于 HZ 的值,比如一般的 PC 中 PC 的值定义为 1000,也就是说,一秒钟内系统要收到 1000 次的时钟中断;同样,jiffies 的值在一秒钟内增加 HZ 。 系统自启动到当前时刻为止运行了 jiffies/HZ 秒。 在 include/linux/jiffies.h 中有 jiffies 的声明: [C++] 纯文本查看 复制代码 ? 因此,2.6 内核中引入了一个 64 位的无符号整型变量 jiffies_64 。在 1000HZ 的情况下,该变量要在运行几亿年都不会发出溢出,从而有效的防治了溢出导致的潜在问题。jiffies_64 也在 include/linux/jiffies.h 中有声明: [C++] 纯文本查看 复制代码 ? 为了保持兼容性及访问效率,内核中仍然保留了 jiffies 变量,因为大量的驱动程序使用该变量来进行一些与时间相关的操作。 通过链接器脚本 vmlinux.lds (x86 上位于 arch/x86/kernel 下) 可看到: OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") OUTPUT_ARCH(i386) ENTRY(phys_startup_32) jiffies = jiffies_64; 这里使得 jiffies 只占用了 jiffies_64 的低 32 位。这里可能会有疑问,链接器脚本如何得知这两个定义在别的文件里的变量?long long 型变量赋值给 long 型变量怎么不会发出警告? 关于上面的疑问,涉及到链接器中的一个重要的概念: 在目标文件内定义的符号可以在链接器脚本内赋值,此时该符号应试被定义为全局的。每个符号都对应了一个地址,在链接器中的复制就是更改这个符号对应的地址。所以,这和 C 语言中的赋值是完全不同的概念!C 中是赋值,链接器中是改变地址,所以不存在发出类型不相符的警告问题。 下面代码模拟这一过程: 链接代码 jiffies.lds: OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") OUTPUT_ARCH(i386) jiffies = jiffies_64; 用户态程序代码: [C++] 纯文本查看 复制代码 ? [beyes@SLinux jiffies]$ gcc -Wall -std=c99 -o jiffies jiffies.c jiffies.lds [beyes@SLinux jiffies]$ ./jiffies jiffies_64 = 0x112345678 jiffies_64 = 0x80496f0 jiffies = 0x12345678 jiffies = 0x80496f0 由输出可见,jiffies 的地址和 jiffies_64 是一样的,不同的是在程序中体现的长度不同罢了。到此,也可以看到,链接器对定义在目标文件中的全局变量(同名全局符号)是可见的。 另外,jiffies_64 变量会被初始化为 INITIAL_JIFFIES ,该值定义在文件 include/linux/jiffies.h 中: [C++] 纯文本查看 复制代码 ? 在设备驱动程序中,通常使用 jiffies 变量。因为在 32 位的系统中访问 64 位的 jiffies_64 没有直接访问 jiffies 来得快,因为在 32 位系统中访问 64 位变量需要进行两次内存访问,而且在两次内存访问中可能不是原子的,且可能会被中断,从而造成读取数据的不正确。对于需要访问 jiffies_64 变量(一般在驱动程序中很少访问 jiffies_64,通常只有内核核心代码才会访问),内核提供了 get_jiffies_64() 来访问,该函数采用了加锁机制,以防止读取数据的不正确。 转自:http://www.groad.net/bbs/thread-3352-1-1.html |
相关文章推荐
- 如何让jiffies 占用 jiffies_64 的低32位
- jiffies 和 jiffies_64 的联系与区别
- jiffies 和 jiffies_64 的联系与区别(转)
- 移植出错:eeti_ts.c:64: error: implicit declaration of function 'irq_to_gpio'
- 网页静态化与bease64加密cookie
- vs2012 win8 64 visual assistX 中文 ??
- 南阳OJ 题目64:小学生算术
- 嵌入式 linux中的jiffies变量小结
- mysql 5.7.18 winx64密码修改
- Red Hat Enterprise Linux 5 64-bit chinese language support config steps
- arm64-linux-kernel-virtual-address-space
- 基于Linux x86_64系统编译arm-gcc-4.8: arm-none-eabi-gcc
- arm64-v8a汇编指令
- c#将十进制转64进制
- cuda程序编译出错: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.8.5
- 编译安全线程安全的php5.5.12 和pthreads(x86_64)
- linux设备驱动第一篇:设备驱动程序简介
- Add a system call on Ubuntu 13.04(x64) with x86_64
- Maxwell16.0 下载 (64-bit) 破解版 亲测可用
- 配置使用;yum安装slatstack的master,minion<at>centos6_x86_64