Skip to the content.

感觉,实际上,arm 也是没问题的

简单分析 arm 的实现

mac 上,arm 的实现在: drivers/clocksource/arm_arch_timer.c

static struct clocksource clocksource_counter = {
	.name	= "arch_sys_counter",
	.id	= CSID_ARM_ARCH_COUNTER,
	.rating	= 400,
	.read	= arch_counter_read,
	.flags	= CLOCK_SOURCE_IS_CONTINUOUS,
};

https://docs.kernel.org/virt/kvm/arm/ptp_kvm.html

ptp_kvm https://raw.githubusercontent.com/kata-containers/packaging/refs/heads/master/kernel/patches/4.19.x/0001-4.19-enable-ptp_kvm-for-arm64-in-kata.patch

看来 arm 的时钟不简单啊

http://www.wowotech.net/timer_subsystem/armgeneraltimer.html#comment-8869

[ ] 所以,从原则上来说,arm 热迁移是有问题才对

应该是存在问题的,热迁移是虚拟化无感知的,但是频率的确是修改了的。

arm 是如何将 frequently 传递过去的?

arch_timer_acpi_init

	arch_timer_rate = arch_timer_get_cntfrq(); // 是通过访问一个寄存器获取的
	ret = validate_timer_rate();

kernel 中的启动代码 : arch_timer_banner

[    0.000000] arch_timer: cp15 timer(s) running at 24.00MHz (virt).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns
[    0.000000] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
#0  arch_timer_banner (type=1) at drivers/clocksource/arm_arch_timer.c:1080
#1  0xffff800081a7d90c [PAC] in arch_timer_common_init () at drivers/clocksource/arm_arch_timer.c:1376
#2  0xffff800081a7d688 [PAC] in arch_timer_acpi_init (table=0xffffffffff476818) at drivers/clocksource/arm_arch_timer.c:1805
#3  0xffff800081a5d868 [PAC] in acpi_table_parse (id=id@entry=0xffff800081b39178 <__acpi_probe_arch_timer> "GTDT", handler=0xffff800081a7d4e4 <arch_timer_acpi_init>) at drivers/acpi/tables.c:331
#4  0xffff800081a5f38c [PAC] in __acpi_probe_device_table (ap_head=<optimized out>, nr=1) at drivers/acpi/scan.c:2767
#5  0xffff800081a7d008 [PAC] in timer_probe () at drivers/clocksource/timer-probe.c:41
#6  0xffff800081a24dc4 [PAC] in time_init () at arch/arm64/kernel/time.c:60
#7  0xffff800081a20588 [PAC] in start_kernel () at init/main.c:992
#8  0xffff800081a2a688 [PAC] in __primary_switched () at arch/arm64/kernel/head.S:243

居然走的是 acpi ,实在是有趣啊。

分析这些需要对于 arm 更加深入的理解了

https://stackoverflow.com/questions/71981223/modify-the-value-of-cntfrq-el0-in-arm-kvm-for-the-guest-to-boot

PTP_KVM

arm 也是有时间同步的机制的:

看看 arm 环境中这里 pvtime 的实现原理是什么,为什么要使用

(qemu) info ramblock
              Block Name    PSize              Offset               Used              Total                HVA  RO
                    mem0   16 KiB  0x0000000000000000 0x0000000200000000 0x0000000200000000 0x0000fffce2000000  rw
             virt.flash0   16 KiB  0x0000000200000000 0x0000000004000000 0x0000000004000000 0x0000fffcd6000000  rw
             virt.flash1   16 KiB  0x0000000204000000 0x0000000004000000 0x0000000004000000 0x0000fffcd0000000  rw
    /rom@etc/acpi/tables   16 KiB  0x0000000208100000 0x0000000000020000 0x0000000000200000 0x0000ffff08c00000  ro
0000:00:02.0/virtio-net-pci.rom   16 KiB  0x0000000208040000 0x0000000000040000 0x0000000000040000 0x0000ffff14600000  ro
0000:00:03.0/virtio-net-pci.rom   16 KiB  0x0000000208080000 0x0000000000040000 0x0000000000040000 0x0000ffff14400000  ro
0000:00:04.0/virtio-net-pci.rom   16 KiB  0x00000002080c0000 0x0000000000040000 0x0000000000040000 0x0000ffff14200000  ro
   /rom@etc/table-loader   16 KiB  0x0000000208300000 0x0000000000004000 0x0000000000010000 0x0000ffff08a00000  ro
      /rom@etc/acpi/rsdp   16 KiB  0x0000000208340000 0x0000000000004000 0x0000000000010000 0x0000ffff08800000  ro
                  pvtime   16 KiB  0x0000000208000000 0x0000000000004000 0x0000000000004000 0x0000ffff18200000  rw

此外,对比一下 info ramblock 在 x86 中的 seabios 和 UEFI 环境中的实现。

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。