【发布时间】:2023-03-29 05:55:01
【问题描述】:
我想获取Linux“jiffies”变量的物理地址,这样我就可以通过读取这个内存地址的内容来读取它。
【问题讨论】:
标签: linux linux-kernel
我想获取Linux“jiffies”变量的物理地址,这样我就可以通过读取这个内存地址的内容来读取它。
【问题讨论】:
标签: linux linux-kernel
从内核模式代码(例如可加载的内核模块)中,您需要包含 <linux/jiffies.h> 头文件。它包含jiffies 变量的定义:
extern unsigned long volatile __jiffy_data jiffies;
但是,它也包含以下警告:
/*
* The 64-bit value is not atomic - you MUST NOT read it
* without sampling the sequence number in xtime_lock.
* get_jiffies_64() will do this for you as appropriate.
*/
即你不应该直接访问这个变量。它是一个 64 位变量,对它的访问在 32 位系统上不是原子的,因此来自同一头文件的 get_jiffies_64() 函数。在 64 位系统上,该函数是一个非常简单的内联函数,它返回 jiffies 变量的值。
另一方面,从用户空间代码中,您根本无法访问内核内存。
【讨论】:
jiffies_64 不应直接访问。但是,jiffies 可以安全地在所有架构上直接访问(您只能在 32 位架构上获得低 32 位,这通常已经足够了)。 [参见 LDD3 第 7 章。]
time_after() 和 time_before() 存在的原因——优雅地处理翻转。
对于内核代码,请使用include/linux/jiffies.h 中定义的函数。 (例如get_jiffies_64)。
Kernel command using Linux system calls 使用读取 jiffies 的用户空间系统调用来说明 Linux 中的系统调用处理。可能是你所追求的。
Linux obtain current of jiffies since reboot over at superuser 也有一些您可能感兴趣的信息。
Converting jiffies to milli seconds 也是需要牢记的。
【讨论】:
这与您的问题直接不相关,但可能仍然相关。 我在这里维护一个小项目(devmem-rw): http://code.google.com/p/device-memory-readwrite/
它对驱动程序/内核开发人员/测试人员非常有用;它允许一个设置能够读取/写入任何有效的内存位置——这可能是 RAM(用户/内核空间)、内存映射的寄存器位置、共享内存区域等。
请查看项目的 wiki 区域(具体来说,http://code.google.com/p/device-memory-readwrite/wiki/UsageWithExamples)。
与您的问题更相关,我使用这个项目来演示几个用例,其中一个是重复读取“jiffies”值。看到它的变化证明了这一点..
来自http://code.google.com/p/device-memory-readwrite/wiki/UsageWithExamples:
"... 例如。 2:在 x86 PC 上读取 'jiffies' 的值 前面提到的 'vm_img' 内核模块,也向我们展示了 'jiffies_64' 内核全局变量(保存当前 jiffies 值)的位置;在上面的运行中,它的内核位置原来是 0xc07c7a40。所以:
# ./rdmem 0xc07c7a40 ; sleep 1; ./rdmem 0xc07c7a40 ; sleep 1; ./rdmem 0xc07c7a40
+0 +4 +8 +c 0 4 8 c
+0000 00 1a bc 20 ...
+0 +4 +8 +c 0 4 8 c
+0000 00 1a bd 23 ...#
+0 +4 +8 +c 0 4 8 c
+0000 00 1a be 1f ....
#
我们可以看到它是如何更新的......(实际上,在这个系统上,CONFIG_HZ=250,并且一些 + 因子也是预期的......)。 ... "
详情请查看项目页面。 它被发现对驱动程序开发人员非常有用-例如,他们可以在不编写代码的情况下探测/更改寄存器值:) 试一试吧!
【讨论】:
如果你安装了源代码,
locate jiffies
应该显示 .c 和 .h 文件,如:
/usr/src/linux-headers-$(uname -r)/include/linux/jiffies.h
【讨论】:
当您从内核代码中引用jiffies 时,就会发生这种情况。您认为在正常使用中需要改进什么?如果您需要地址,请使用&jiffies。
【讨论】:
get_jiffies_64() 函数。
jiffies。如果您需要,高 64 位就在那里(这就是 get_jiffies_64() 的用途,但您很少需要完整的值。
我认为您想要的是从用户空间访问 jiffies 值。
您可以编写一个小模块,将jiffies 变量暴露给proc 文件。
【讨论】: