-
Notifications
You must be signed in to change notification settings - Fork 12
questions
yufeng edited this page May 11, 2024
·
3 revisions
您需要检查一下您是否进行了以下操作:
- 在程序的入口添加了
#[polyhal::arch_entry]和#[polyhal::arch_interrupt]且保证唯一; - 添加了合适的链接脚本,可以参考 linker.ld;
- 已经传递了正确的
cfg,可以参考 编译配置; - 尝试使用和 example 一致的
rust-toolchain.toml。
有些同学可能会感到疑惑,在进入我们定义的 main 函数之前是由 polyhal 进行的引导,为什么我们不在这个阶段就完成 polyhal 的初始化?其实是因为在 polyhal 中用到了一些 alloc 库的一些功能,且在 polyhal 映射页表的时候需要申请页来作为 page-directory。所以需要操作系统向 polyhal 提供相应的接口,也就是 PageAlloc 这个 trait。
至于 polyhal::init 这个函数到底初始化了哪些东西,这个根据平台的差异会略有不同。但是基本上都包含了对于可用内存范围和一些 polyhal 中定义的变量的初始化。以及将页表申请的接口传递给 polyhal,便于后续进行页表映射的时候申请页表。
目前 polyhal 仅对 riscv64 平台进行了多核支持。在使用的时候需要在 Cargo.toml 里面标注使用 polyhal 的 multicore feature, 然后在需要启动多核的地方调用 polyhal::MultiBoot::boot_all() 就可以启动其他核心,请注意这个函数需要在 polyhal::init 之后调用。其他平台目前也有这个函数,但是暂时不会启动其他核心,会面会逐渐更新,也欢迎积极提交 pr。
可能是以下原因:
- 对于
x86_64架构的trap_frame要求是 16 字节对齐的,请输出一下trapframe的指针是不是 16 字节对齐。
目前启动栈的大小是 0x8_0000。
polyhal 将入口放在高地址,访问内存需要加上一个偏移VIRT_ADDR_START,这种设计可以比较方便的将内核和用户程序放在同一地址空间,对于实现一个宏内核比较方便。