【问题标题】:Physical address of Linux "jiffies" variableLinux“jiffies”变量的物理地址
【发布时间】:2023-03-29 05:55:01
【问题描述】:

我想获取Linux“jiffies”变量的物理地址,这样我就可以通过读取这个内存地址的内容来读取它。

【问题讨论】:

    标签: linux linux-kernel


    【解决方案1】:

    从内核模式代码(例如可加载的内核模块)中,您需要包含 <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 章。]
    • @Eric Seppanen:我什至从未想过要提到 32 位值。被它和质量有问题的 3rd 方内核驱动程序烧毁了几次 - 我看到 32 位值在我的一些系统上翻转,我不得不处理后果......
    • Jiffies 翻转应该不是问题,只要您编写正确的代码。这就是 time_after()time_before() 存在的原因——优雅地处理翻转。
    【解决方案2】:

    对于内核代码,请使用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 也是需要牢记的。

    【讨论】:

      【解决方案3】:

      这与您的问题直接不相关,但可能仍然相关。 我在这里维护一个小项目(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,并且一些 + 因子也是预期的......)。 ... "

      详情请查看项目页面。 它被发现对驱动程序开发人员非常有用-例如,他们可以在不编写代码的情况下探测/更改寄存器值:) 试一试吧!

      【讨论】:

        【解决方案4】:

        如果你安装了源代码,

        locate jiffies
        

        应该显示 .c 和 .h 文件,如:

        /usr/src/linux-headers-$(uname -r)/include/linux/jiffies.h
        

        【讨论】:

          【解决方案5】:

          当您从内核代码中引用jiffies 时,就会发生这种情况。您认为在正常使用中需要改进什么?如果您需要地址,请使用&jiffies

          【讨论】:

          • 不过,显然您不应该直接引用该变量。它是一个 64 位变量,在 32 位系统上对它的访问不是原子的,因此是 get_jiffies_64() 函数。
          • 如果你只接收 32 位值没问题,你可以在 32 位机器上直接使用jiffies。如果您需要,高 64 位就在那里(这就是 get_jiffies_64() 的用途,但您很少需要完整的值。
          【解决方案6】:

          我认为您想要的是从用户空间访问 jiffies 值。

          您可以编写一个小模块,将jiffies 变量暴露给proc 文件。

          【讨论】:

            猜你喜欢
            • 2019-04-04
            • 1970-01-01
            • 2018-06-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多