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