基于 riscv32 的 OS 设计:Trap 和 Exception 中断 和 异常相关寄存器不管是 中断 还是 异常,大致处理流程都是一致的。 mcause当 trap 发生时,hart 会设置该寄存器通知我们 trap 发生的原因。最高位 Interrupt 为 1 时标识了当前 trap 为 interrupt,否则是 exception。剩余的 Exception Code 用于标识具体的 interrupt 或者 exception 的种类。 mtvec( 2025-03-21 OS #OS #riscv
基于 riscv32 的 OS 设计:多任务 多任务首先创造两个任务: 12345678910111213141516171819void user_task0(void){ uart_puts("Task 0: Created!\n"); while (1) { uart_puts("Task 0: Running...\n"); task_delay(DELAY); tas 2025-03-20 OS #OS #riscv
基于 riscv32 的 OS 设计:切换上下文 ContextOS 中实际上并没有什么线程、进程,不过是一个个不同的上下文而已。 上下文非常重要,任务 A 和任务 B 的切换,核心就是保存 A 的上下文、恢复 B 的上下文。 在之前的 MIPS yieldOS 中,已经实现过上下文以及上下文的切换了,本质都是差不多的。 1234567891011121314151617181920212223242526272829303132333435/* 2025-03-19 OS #OS #riscv
基于 riscv32 的 OS 设计:内存分页 内存的组织kernel 跑起来之后,要在 kernel 中运行一些程序,这些程序有的会使用堆区、有的仅仅使用栈区。因此,组织这些内存很重要。 初始的组织,要使用链接脚本。链接脚本告诉编译器 OS 的代码段、数据段、bss 等位置在哪里。另外,编译器还提供了可以在 ld 脚本中使用的一些命令,比如一个简单的脚本如下: 12345678910111213141516171819202122232425 2025-03-18 OS #OS #riscv
基于 riscv32 的 OS 设计:启动最简单的 OS 启动最简单的 OS这个 OS 超级简单,就是一个裸机程序: 1234void start_kernel(void){ while (1) {}; // stop here!} 我们只需要将这个程序编译成二进制文件,然后丢给 qemu,就可以跑了。 但是,本节会提到一个大大的问题,这个问题在上一个博客中并没有提到。 CPU 是多核心的如果在多核心上启动一个 k 2025-03-16 OS #OS #riscv
基于 riscv32 的 OS 设计:qemu 启动! 写的 OS 如何运行?如果写过 CPU,那就会明白,OS 和其它裸机程序几乎没有什么区别。当然,复杂的 OS 可能引入各种模式,比如 S-mode,但这不影响 OS 是一个比较复杂的裸机程序的事实。 因此,写好的 OS 加载到内存中,让 CPU 的 PC 指向 OS 的第一条指令,然后开始运行,OS 就成功运行了。 根据以上判断,OS 想要跑起来,需要: 一个 CPU; 一个 RAM。 有一个 2025-03-15 OS #OS #riscv
MIPS 处理器的设计 Why MIPS?学校的课程设计需要做一个 MIPS 的五级流水线单周期处理器,这是 项目链接。 MIPS 有一个特点,那就是延迟槽。如果在编译参数中将延迟槽关掉,那么每一个分支指令后面的延迟槽就会变成空指令,这为流水线的指令相关解决提供了便利。 这个项目提供了简单的测试环境,但是遗憾的是由于时间有限,并没有提供 difftest。 程序编译流程 mips 交叉编译工具链编译成目标文件; 将目标文 2025-03-10 CPU 设计 #MIPS
Rust 中的 traits 最近笔者在学 Rust,被 Rust 中精巧的设计深深吸引,尤其是 traits。它不仅能够应用到 Struct、Enum等,而且还能作为参数传入函数。应用于结构体先看这个例子: 12345678910111213141516171819202122232425262728293031323334353637383940414243trait Shape { fn area(&am 2025-02-18 编程语言 > Rust #Rust #Java
ssh 免密登录失效问题 问题突然间我发现我需要密码才能登录到服务器,但是我仔细对比检查了私钥和秘钥,发现一切正常。这是什么原因呢? 问题原因原来,前几天我用 snap 安装了 hugo,hugo 需要文件夹权限,为了让 snap 应用访问用户家目录下的文件,我按照网上教程将家目录权限修改为 777。 ssh 为了保证通信安全,防止 key 被篡改或窃取,对目录和文件的权限要求相当严格: 12345chmod 0755 ~ 2025-02-15 Ubuntu #ssh #snap
对 SPI、FLASH 的思考 从 flash 中读出数据(1)之前在 ysyxSoC/perip/spi/rtl/spi_top_apb.v 中定义宏 FAST_FLASH,因此当程序访问 0x30000000+X 的时候,就会访问这个模块: 123456789101112131415161718`ifdef FAST_FLASHwire [31:0] data;parameter invalid_cmd = 8' 2025-02-09 ysyx #flash #SPI