Linux 无法读取APIC计时器寄存器

Linux 无法读取APIC计时器寄存器,linux,x86-64,apic,Linux,X86 64,Apic,我正在编写一个Linux内核模块来读取转储本地APIC计时器寄存器。 我正在X86_64平台上使用Ubuntu 16.04桌面。 X2APIC已禁用,grub.cfg中的nohz=off 我使用以下代码读取APIC定时器寄存器 #include <linux/slab.h> #include <linux/time.h> #include <asm/string.h> #include <linux/kernel.h> #include <l

我正在编写一个Linux内核模块来读取转储本地APIC计时器寄存器。
我正在X86_64平台上使用Ubuntu 16.04桌面。
X2APIC已禁用,grub.cfg中的nohz=off

我使用以下代码读取APIC定时器寄存器

#include <linux/slab.h>
#include <linux/time.h>
#include <asm/string.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/hrtimer.h>
#include <linux/ktime.h>
#include <asm/apic.h>

void read_apic_timer(void)
{
    printk("APIC_TDCR = 0x%x\n", apic_read(APIC_TDCR));
    printk("APIC_TMICT = 0x%x\n", apic_read(APIC_TMICT));
    printk("APIC_TMCCT = 0x%x\n", apic_read(APIC_TMCCT));
}

static int __init timer_init(void)
{
    read_apic_timer();
    return 0;
}

static void __exit timer_exit(void)
{
    printk("module uninstalling\n");
}

module_init(timer_init);
module_exit(timer_exit);
MODULE_LICENSE("GPL");
令我惊讶的是,初始计数器和当前计数器都是0,对吗


还是我错过了什么或做错了什么?

我想我得到了答案。这是因为CPU支持LAPIC定时器的TSC截止时间功能/模式。在此模式下,不使用APIC_TDCR/TMICT/TMCCT。就是这样。

只是想确定一下,您的内核是否已启用?当然,它已启用,内核日志显示,[0.000000]ACPI:Local APIC address 0xfee00000I正在询问,因为如果该配置未启用
APIC\u read
将无条件返回0。无论如何,0是所有寄存器的有效值:TDCR中的0表示除以2,TMICT中的0表示“禁用计时器”。TMCCT从TMICT倒计时到0。如果定时器在一次触发模式下编程,一旦TMCCT为0,它将保持为0,我得到你的分数。然后,我在local_apic_timer_interrupt()中添加了一个printk,以检查lapic timer是在一次触发模式还是在周期模式下工作。我发现它处于周期模式(nohz=off),就像这个“本地apic定时器中断,880,TMRINIT\u CNT=0,TMR\u CUR\u CNT=0,TMR\u DIV=0”。但寄存器读数都是“0”。我认为这是不对的。我的目的是弄清楚Linux中支持什么/如何支持hrtimer,它是来自HPET、CMOS/RTC还是lapic定时器。如果你能澄清,这是非常好的。
[ 5619.047497] APIC_TDCR = 0x0
[ 5619.047498] APIC_TMICT = 0x0
[ 5619.047499] APIC_TMCCT = 0x0