загрузка процессора: 0%требования:
create_gate (настройка обработчиков IRQ)pic_mask_clear (включить определенные прерывания)rtc_poll (настроить RTC)rtc_irqsmp_wake_up
; In\ RAX = Time in millisecond
; Out\ All registers preserved
sleep:
push rcx
push rax
mov rcx, [rtc_irq.up_time]
add rax, rcx
.os_delay_loop:
hlt
cmp qword [rtc_irq.up_time], rax
jle .os_delay_loop
pop rax
pop rcx
ret
smp_wake_up
; In\ Nothing
; Out\ Nohting
smp_wakeup_all:
push rdi
push rax
mov rdi, [os_LocalAPICAddress]
xor eax, eax
mov [rdi+0x0310], eax ; Write to the high bits first
mov eax, 0x000C0080 ; Execute interrupt 0x80
mov [rdi+0x0300], eax ; Then write to the low bits
pop rax
pop rdi
ret
rtc_irq:
; UIP (0), RTC@32.768KHz (010), Rate@1024Hz (0110)
; In\ Nothing
; Out\ Nothing
rtc_irq:
inc qword[.up_time]
call smp_wakup_all
ret
.up_time: dq 0
использование:
mov rax, 1000 (millisecond)
call sleep
штраф