-
Notifications
You must be signed in to change notification settings - Fork 236
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
rCore-Tutorial-Book-v3/chapter4/6multitasking-based-on-as #50
Comments
说起来这里的 |
@benpigchu 如果后面需要支持处理从内核态进来的Trap的话,需要额外再写一套不同的__alltraps和__restore,它们都是汇编,就可以调整对齐了。现在这样确实也是有点bug,可能导致触发异常之后不能正确panic而是死循环,不过还能满足当前内核的功能需求。 |
“跳板的实现”一节中“到这里,我们就全程在内核地址空间中完成了保存 Trap 上下文的工作。”,“内核地址空间”是否应该改为“应用地址空间”? |
@why986 确实如此,多谢指出。 |
|
我觉得, TaskControlBlock中 |
@Tokubara 大概就是一个空间和性能的权衡问题吧,毕竟手动查页表在没有TLB加持的情况下更不cache友好。 |
MapArea的unmap方法没有被调用过, 但是我对它的实现有疑问, unmap最终调用的是PageTable的unmap方法, 这个方法只是回收了PPN, 但是并未将相应PTE重置为0. |
@Tokubara 在PageTable::unmap的时候重置了页表项: pub fn unmap(&mut self, vpn: VirtPageNum) {
let pte = self.find_pte_create(vpn).unwrap();
assert!(pte.is_valid(), "vpn {:?} is invalid before unmapping", vpn);
*pte = PageTableEntry::empty();
} 注意最后一行。 |
第 33~46 行,用上面的信息来创建并返回任务控制块实例 task_control_block;这里说的好像是33~36行 |
问一下为什么单核+静态的 |
请问为什么 |
使用Rc会报错线程不安全 |
asm!("sfence.vma" :::: "volatile");直接用会报错,我改成了 asm!("volatile", "sfence.vma"); |
重新映射的trap.S好难调试啊,gdb跟到地址空间切换就报异常了卡了好久检查代码,发现好像是gdb跟踪不到新地址空间了代码全速运行是好的,不知道有啥办法能更好的调试没有 |
遇到同样的问题,执行了 sfence.vma 之后,GDB就无法继续调试了 |
在lab4之前,对内存访问没有什么限制,但是在lab4启动虚拟内存之后,无法越权访问内存 以上方法可以调试ecall/sret这样手动切换状态,但是对时钟这样的自动中断好像还不好调试 |
为了方便调试用户应用程序,可以对项目进行适当修改 |
最后 |
关于这点没记错的话window里面的做法是,所有进程的页表在内核地址那一段都是指向的同一份真实的内核地址空间的页表的,这样在trap进内核的时候是可以直接使用内核空间的地址的不需要发生satp寄存器的切换,这样即保证了连续性也减小了satp切换导致的tlb缓存刷新的性能问题 |
@AlwaysKing 参见 wiki。这样的设计也有需求,虽然确实导致性能下降 |
在本章练习中,我们需要重写 换句话说,如果有这种需要os/kernel去填充用户地址的情况,我们可能没有一个很好的办法做到zero-copy? 另外有人知道 |
改进sys_write一节中translated_byte_buffer的实现似乎没有更新为源码仓库中最新的版本,文档中的版本对于跨物理页end_va的offset为0的情况会出现push区间为空? v.push(&ppn.get_bytes_array()[start_va.page_offset()..end_va.page_offset()]); 仓库: if end_va.page_offset() == 0 {
v.push(&mut ppn.get_bytes_array()[start_va.page_offset()..]);
} else {
v.push(&mut ppn.get_bytes_array()[start_va.page_offset()..end_va.page_offset()]);
} |
@xukp20 多谢,已更新。 |
|
如果我没理解错的话😂不能保证。只不过测试都短,不会写满一页的。操作系统,很神奇吧。 |
现在是只支持ASCII的,就没什么问题。如果输出中文或者一些奇怪的多字节码确实有可能有问题,但是暂时还不考虑支持。 |
我猜是因为 __alltraps 刚进入的时候还是在应用空间。应用的内核栈是要在内核空间才能访问的,所以得先从 trap context 装载对应的 satp,而 trap context 在应用空间。这应该也是内核栈 跟 trap context分别在不同的 page的原因。 |
我有个问题,在改进 Trap 处理的实现时,通过set_kernel_trap_entry函数将S态的异常处理地址设置成了trap_from_kernel函数,那时钟中断也会进入这个函数来处理吧,按照之前分时多任务的处理逻辑,当检测到是时钟中断时会进入_alltraps函数然后跳转到trap_handler来分发,从而进行调度。而在这里修改后,调度的过程是怎么发生的,我没想明白 |
mm中的memory_set.rs中的from_elf函数运行时出现了Did not find ELF magic number该怎么处理呢? |
基于地址空间的分时多任务 — rCore-Tutorial-Book-v3 0.1 文档
https://rcore-os.github.io/rCore-Tutorial-Book-v3/chapter4/6multitasking-based-on-as.html
The text was updated successfully, but these errors were encountered: