halt
是一个简单的强制关机指令
主要是通过向特定地址写入特定值来出发关机操作
uint64
sys_halt(void)
{
*((volatile uint32*)0x100000) = 0x5555;
return 0;
}
但是仅仅是这样是无法成功关机的,因为在 xv6 中,用户空间不能直接访问物理地址,需要在内核中建立正确的页表映射,通过系统调用在内核态下进行设备访问
所以还需要添加正确的页表映射
kvmmap(kpgtbl, 0x100000, 0x100000, PGSIZE, PTE_R | PTE_W); //关机
这样我们便可以访问这个物理地址,而不会出发页面错误
$ halt
Shutting down ...
scause 0x000000000000000f
sepc=0x00000000800032f4 stval=0x0000000000100000
panic: kerneltrap