想起来自己是有博客的,所以先发这个复活一下。
这篇文章纯纯引流,欢迎访问 https://github.com/LajiPZ/Salyut-J 参考本人大三上学期的编译课设,内含源码以及优化文章等等文书,欢迎点开自行参考…
架构整体参考了锎神的编译器设计,并在其基础上做了修改,实现了Building An Optimizing Compiler所述的编译器分配逻辑(可能有bug),并顺带多掺了一些优化。
你问我感想是什么?笼中斗是一个很累人的事情,就这一句话吧
想起来自己是有博客的,所以先发这个复活一下。
这篇文章纯纯引流,欢迎访问 https://github.com/LajiPZ/Salyut-J 参考本人大三上学期的编译课设,内含源码以及优化文章等等文书,欢迎点开自行参考…
架构整体参考了锎神的编译器设计,并在其基础上做了修改,实现了Building An Optimizing Compiler所述的编译器分配逻辑(可能有bug),并顺带多掺了一些优化。
你问我感想是什么?笼中斗是一个很累人的事情,就这一句话吧
这一部分由我与另一位同学共同完成。我主要完成的是SD卡部分的工作。仅此向Lab4就已探索出前三个Lab移植的他表示敬意…
这一部分只介绍较为关键的改动。有关Makefile中编译选项的修改,指令名称、格式变动引起的修改,在此不多加赘述。
LA32R需要在状态控制寄存器(CSR)中,配置EENTRY和TLBRENTRY两项,分别对应普通例外的入口地址,以及TLB重填例外的入口地址。不难注意到,LA32R的TLB重填例外,是与其他例外分开处理的。
此外,由于触发 TLB 重填例外之后,处理器核将进入直接地址翻译模式,TLBRENTRY处所填入口地址应当是物理地址。EENTRY不受影F响。
归档于2025年7月8日。

我们需要回顾一下内存空间相关的知识。
kuseg:用户态空间,需要通过TLB和Cachekseg0:过Cache,不过TLB;MMU拉低最高位(-0x8000_0000)得物理地址kseg1:Cache和TLB都不过;MMU拉低高三位得物理地址kseg2:过TLB和Cache还有,MIPS通过MMIO (Memory Mapped IO)进行外设访问。显然外设处在固定的物理地址上,我们肯定想到kseg1。
TLB需要软件初始化,故内核最开始自然放在不用TLB的kseg0上。kseg1暂时认为是访问IO设备专用。
归档于2025年7月8日。
感觉开始上强度了。
我需要从头理一些东西。
以debugf()为例:
vdebugf()vdebugf()中调用熟悉的vprintfmt,用debug_output作为后端debug_flush(),调用出syscall_print_conssyscall_print_cons()调用msyscall(),传入信号参数SYS_print_cons,指示之归档于2025年7月8日。
e->env_pgdir[PDX(UVPT)]访问了页目录中,指向页目录自身的页目录项;PADDR(e->env_pgdir) | PTE_V,也就是在构建自映射,并让这一项有效,从而使得页目录可被正确访问。归档于2025年7月8日。
这跟Cache的更新策略有一些关系。
若Cache采用了写回策略,则:由kseg0写设备,向设备传递的数据会被存入Cache,而不会真正到达设备;仅在对应Cache块被清除掉时,向设备传输的数据才能到达设备。这会导致设备的延迟响应,甚至不响应。
Cache的更新策略,也与这个问题有关。如果Cache中缓存了设备的状态寄存器,那么:众所周知,设备的状态往往实时变化,若要保持Cache与设备状态寄存器的一致,我们必须时刻更新Cache,其性能开销极大,完全背离了Cache的设计本意;不维持一致性,则在Cache中读出的设备状态信息与实际的设备状态往往不符,会引起程序逻辑的问题。
这样做对不同设备的影响当然是不同的。对于IDE硬盘,可能是一次读/写请求迟迟不响应,导致程序长时间阻塞;对于显示设备(串口输出/显示器/…),可能是迟迟不显示该显示的内容。
直接就是博客作业。文末的课程收获是真情实感。
漫长的OO历程,终于到此结束了。
本篇文章将简要介绍本人在本单元中,利用UML进行正向建模的经历,并对一学期以来的课程经历做一个简要回顾。
本文使用Python搭建评测机。使用其他语言,在具体实现上可能存在差异,本文只是提供了一个思路。
众所周知,本次作业采用了“交互式评测”,会根据同学们的程序输出,来动态生成新的指令。这对本地复现作业评测方式,构建自动化测试带来了一些挑战。
本人在一番折腾,并在各路大模型的协助后,成功在本地初步完成了交互式评测的搭建。本文将对我折腾的经验,进行一些简要的分享。