5

x86中断0x1A似乎给了计算机的时钟时间,但它只能给出55ms以内的准确时间(AH=0)。有没有办法获得比这更小的增量(也许更“正常”),比如 1ms?我正在尝试制作自己的玩具操作系统,所以我不能使用我自己无法编写的任何东西。

4

2 回答 2

6

您可以使用rdtscx86 上的(读取时间戳计数器)指令将 64 位 CPU 时间戳转换为edx:eax. 该指令的实现取决于您的处理器,但它要么每个时钟递增一次,要么以恒定速率递增。因此,时间分辨率也有所不同,但应该优于 1ms。

使用有一些注意事项rdtsc

  1. 时间戳计数器不一定在 CPU 内核之间同步。这可能是超线程和多核 CPU 中的一个问题。
  2. 计数器不一定以恒定速率递增。它可能会受到处理器的节流或节能功能的影响。
  3. 休眠会导致计数器重置。

由于您正在编写自己的操作系统,因此您可能无需担心其中一些问题。

于 2012-07-19T23:24:55.340 回答
3

由于您正在制作自己的操作系统,因此您不必保持计时器周期。可以重新编程 PIT 以更频繁地触发 INT 8 (IRQ 0)。见这里

在较新的计算机上,您还可以使用高精度事件计时器

于 2012-07-20T08:54:01.740 回答