Ngắt x86 0x1A dường như cho thời gian đồng hồ của máy tính, nhưng nó chỉ có thể cho thời gian chính xác trong vòng 55ms (AH = 0). Có cách nào để có được gia số nhỏ hơn (và có thể một chút "bình thường") hơn thế, như có thể 1ms? Tôi đang cố gắng làm cho hệ điều hành đồ chơi của riêng mình, vì vậy tôi không thể sử dụng bất cứ điều gì tôi không thể viết bản thân mình.Thời gian gia tăng 1ms
5
A
Trả lời
3
Vì bạn đang tạo hệ điều hành của riêng mình, bạn không phải giữ khoảng thời gian hẹn giờ. Có thể lập trình lại PIT để kích hoạt INT 8 (IRQ 0) thường xuyên hơn. Xem here.
Trên các máy tính mới hơn, bạn cũng có thể sử dụng số High Precision Event Timer.
6
Bạn có thể sử dụng lệnh rdtsc
(đọc dấu thời gian) trên x86 để lấy dấu thời gian CPU 64 bit vào edx:eax
. Việc thực hiện lệnh này phụ thuộc vào bộ xử lý của bạn, nhưng nó tăng một lần trên mỗi đồng hồ hoặc ở tốc độ không đổi. Bởi vì điều này, độ phân giải thời gian cũng khác nhau, nhưng nó phải tốt hơn 1ms.
Có một số hãy cẩn thận khi sử dụng rdtsc
:
- Các dấu thời gian truy cập không nhất thiết phải đồng bộ trên lõi CPU. Đây có thể là một vấn đề trong CPU siêu luồng và đa lõi.
- Bộ đếm không nhất thiết phải tăng với tốc độ không đổi. Nó có thể bị ảnh hưởng bởi các tính năng điều tiết hoặc tiết kiệm năng lượng của bộ vi xử lý.
- Chế độ ngủ đông có thể khiến bộ đếm đặt lại.
Vì bạn đang viết hệ điều hành của riêng mình, bạn có thể không cần phải lo lắng về một số vấn đề này.
người ta cũng có thể sử dụng bộ hẹn giờ APIC: http://wiki.osdev.org/APIC_timer – Necrolis