在理解了Unikernel的基本启动流程之后,不难发现,其中并没有对MMIO相关的区域做映射,且映射的粒度也很粗,即要实现重建映射。
流程大致如下:
- 依赖axalloc,重新分配一页做根页表
- 根据elf中标记的各个段的flag,合理地设置各个段的页表项在页表中的可读可写性等,且此时不做巨页映射了,都是4K的小页映射,但还是一对一的固定偏移静态映射,一开始就写好在页表里了。
- SBI不做映射,这是为了安全性考虑,用户本来也不应该能直接访问SBI,然后这段虚拟地址空间可以被重新利用。
- 映射MMIO设备
- 更改satp寄存器,换为新根页表的物理地址