Yifan Wu
Yifan Wu
目前lab4分支上最新的代码确实是34,应该是文档还没更新吧。
经历了无数坑爹的事情,目前终于做到了: 1. 能在 S 态处理基本上所有的异常; 2. 能在 S 态处理时钟中断并输出 `100 ticks`; 3. 能在 S 态收到软件中断并进行处理; 4. 能将 M 态外部中断限制到在 hart0 上收到,但是由于 K210 上 S 态外部中断不存在,因此任何软硬件代理都无效,代理到 S 态软件中断并进行处理应该可行,且效果与之前基本相同。预计明天可以完成。 具体探索历程请看[这里](https://github.com/wyfcyx/osnotes/blob/master/book/v3/read-notes.md#lab1)。
关于这次移植的一点心得体会: 为何不直接用 M 态? > 由于这会与基于 Qemu 的原本 rCore-Tutorial 在架构上出入太大,且需要扔掉在 OS 原理中非常重要的虚拟内存相关内容。当然,选择将内核放到 S 态运行就意味着网上能参考的资料非常少,甚至官方提供的手册都基本没有什么用,只能去啃官方 SDK 代码试图反推怎样才能更好跟硬件打交道。 移植现状? > 情况还是比较乐观的,经过一通简单的魔改(修改 hart 上以及 PLIC 上的若干寄存器),验证 K210 对于 S 态的支持还算比较好,中断/异常都基本能很好的处理了。比较大的问题是猜测 S 态外部中断没有实现,因此只能通过 S...
之前通过实现发现将 M 态外部中断代理到 S 态软中断进行处理是可行的,然而高速串口基于中断的输入有问题,总是会莫名其妙向后偏移 7 次输入。注意到能够找到的所有串口中断输入的程序都使用通用串口,猜测可能高速串口对于中断的处理有问题,试图将串口的使用从 K210 上的高速串口换成通用串口。 最近几天有一半时间都不能干活,简单将 K210 官方 SDK 中的相关代码直接放到 OpenSBI 中完成了串口替换,轮询输入仍没有问题,但是中断的时候读到的寄存器的值还是有问题。后来发现不能在输入中断处理过程中向串口中输出,会影响到相关状态寄存器的值。删掉相关代码之后终于能通过中断正确输入一个字符,然而后续中断无法触发,原因不明。而且整个项目已经被我搞的非常混乱,给调试带来很大困难。按照之前的计划,只能先放弃处理串口中断基于轮询进行输入。这个就等 tutorial 跑起来之后再考虑。 **一些相关资源** * 基于 K210 官方 SDK 能够工作在 M 态的通用串口中断小程序 ```c // 注意在...
搞完 lab2 之后重新整理了一下代码,发现高速串口中断在 M 态可以正常处理了! 然后继续尝试软件代理到 ssoft,在 M 态中断处理中使用了 `sbi_putc(0)` 黑科技才能收到 S 态软中断,现在做的比较粗糙,直接用 `stval` 保存收到的字符,这样有其他外部中断的话就不支持了,之后会尝试在 OpenSBI 里面搞一块缓冲区保存读到的字符,S 态就直接从里面读。但不管怎样,它终于正常工作了! 其实一定要弄到 S 态处理的理由是中断处理需要修改处于 S 态的内核的数据结构,如果在 M 态处理的话,由于 M 态只能看到物理地址,就得手动查页表。但即使如此,我也觉得把外部中断弄到 M 态处理相比现下的强行代理要好上许多:不仅更加自然,潜在的 bug...
看起来这是 OpenSBI 和 Qemu 的兼容性问题。 [这是](https://github.com/rcore-os/rCore-Tutorial-v3/tree/ch1)该项目的新一轮迭代截至第一章的代码,最终也调用了 SBI 的 shutdown 接口。这一版中,我们将 SBI 实现替换为 [RustSBI](https://github.com/luojia65/rustsbi),它完全使用 Rust 开发,更加简洁,且完全足以用于教学。你可以试试这个 ch1 分支在你原来的环境下可否正常运行。这是[第一章的文档](https://rcore-os.github.io/rCore-Tutorial-Book-v3/chapter1/index.html)。
@TroubleMaker369 你说得对,这里的确应该调用`find_pte`而非`find_pte_create`,稍后修改。
> 高于256G且低于0xffff_ffc0_0000_0000是不是不能被访问到,因为通不过mmu 你的理解是对的。
@mxq-151 帮你删掉了。如果想自己删除的话,只需要找到当前节的issue页面就能删掉自己的评论了。
@RobinWitch 这样的话会保留应用可执行文件中的调试信息,使得应用可执行文件大小膨胀,最终超出我们预设的物理内存大小限制。