idle.rs 776 B

123456789101112131415161718192021222324252627282930
  1. use core::hint::spin_loop;
  2. use log::error;
  3. use crate::{
  4. arch::CurrentIrqArch,
  5. exception::InterruptArch,
  6. process::{ProcessFlags, ProcessManager},
  7. sched::{SchedMode, __schedule},
  8. };
  9. impl ProcessManager {
  10. /// 每个核的idle进程
  11. pub fn arch_idle_func() -> ! {
  12. loop {
  13. let pcb = ProcessManager::current_pcb();
  14. if pcb.flags().contains(ProcessFlags::NEED_SCHEDULE) {
  15. __schedule(SchedMode::SM_NONE);
  16. }
  17. if CurrentIrqArch::is_irq_enabled() {
  18. unsafe {
  19. x86::halt();
  20. }
  21. } else {
  22. error!("Idle process should not be scheduled with IRQs disabled.");
  23. spin_loop();
  24. }
  25. }
  26. }
  27. }