Не удалось прочитать регистры таймера APIC

Я пишу модуль ядра Linux для чтения дамп локальных регистров таймера APIC.
Я использую рабочий стол Ubuntu 16.04 на платформе X86_64.
X2APIC отключен, а nohz=off в grub.cfg.

Я использую следующие коды для чтения регистров таймера 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 ответ

Решение

Я думаю, что я получил ответ. Это потому, что CPU поддерживает функцию / режим крайнего срока TSC для таймера LAPIC. В этом режиме APIC_TDCR/TMICT/TMCCT не используются. Вот и все.

Другие вопросы по тегам