Skip to content

questions

yufeng edited this page May 11, 2024 · 3 revisions

无法通过编译是什么原因?

您需要检查一下您是否进行了以下操作:

  1. 在程序的入口添加了 #[polyhal::arch_entry]#[polyhal::arch_interrupt] 且保证唯一;
  2. 添加了合适的链接脚本,可以参考 linker.ld
  3. 已经传递了正确的 cfg,可以参考 编译配置
  4. 尝试使用和 example 一致的 rust-toolchain.toml

为什么需要 polyhal::init 函数,这个函数是做什么的?

有些同学可能会感到疑惑,在进入我们定义的 main 函数之前是由 polyhal 进行的引导,为什么我们不在这个阶段就完成 polyhal 的初始化?其实是因为在 polyhal 中用到了一些 alloc 库的一些功能,且在 polyhal 映射页表的时候需要申请页来作为 page-directory。所以需要操作系统向 polyhal 提供相应的接口,也就是 PageAlloc 这个 trait

至于 polyhal::init 这个函数到底初始化了哪些东西,这个根据平台的差异会略有不同。但是基本上都包含了对于可用内存范围和一些 polyhal 中定义的变量的初始化。以及将页表申请的接口传递给 polyhal,便于后续进行页表映射的时候申请页表。

PolyHAL 的多核支持的如何?该怎么使用?

目前 polyhal 仅对 riscv64 平台进行了多核支持。在使用的时候需要在 Cargo.toml 里面标注使用 polyhalmulticore feature, 然后在需要启动多核的地方调用 polyhal::MultiBoot::boot_all() 就可以启动其他核心,请注意这个函数需要在 polyhal::init 之后调用。其他平台目前也有这个函数,但是暂时不会启动其他核心,会面会逐渐更新,也欢迎积极提交 pr。

其他的架构代码都可以运行,但是只有 x86_64 会出现 #GP 异常是什么原因?

可能是以下原因:

  1. 对于 x86_64 架构的 trap_frame 要求是 16 字节对齐的,请输出一下 trapframe 的指针是不是 16 字节对齐。

polyhal 的启动栈是多大?

目前启动栈的大小是 0x8_0000

为什么 polyhal 要求的链接脚本地址都是 0xfffff*

polyhal 将入口放在高地址,访问内存需要加上一个偏移VIRT_ADDR_START,这种设计可以比较方便的将内核和用户程序放在同一地址空间,对于实现一个宏内核比较方便。