代码之家  ›  专栏  ›  技术社区  ›  wangt13

读取APIC计时器寄存器失败

  •  0
  • wangt13  · 技术社区  · 6 年前

    我正在编写一个Linux内核模块来读取转储本地APIC计时器寄存器。
    我使用的是X86\u64平台上的ubuntu16.04桌面。

    我使用以下代码读取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,对吗?

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

    0 回复  |  直到 6 年前
        1
  •  2
  •   wangt13    6 年前

    我想我知道答案了。这是因为CPU支持LAPIC定时器的TSC截止时间特性/模式。在此模式下,不使用APIC\ U TDCR/TMICT/TMCCT。就是这样。