无法读取APIC计时器寄存器

时间:2019-02-26 05:07:02

标签: 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 <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");

我得到了这些

[ 5619.047497] APIC_TDCR = 0x0
[ 5619.047498] APIC_TMICT = 0x0
[ 5619.047499] APIC_TMCCT = 0x0

令我惊讶的是,初始计数器和当前计数器均为0,对吗?

还是我错过了某件事或做错了什么?

1 个答案:

答案 0 :(得分:2)

我想我得到了答案。这是因为CPU支持LAPIC计时器的TSC截止日期功能/模式。在这种模式下,不使用API​​C_TDCR / TMICT / TMCCT。就是这样。