自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(11)
  • 收藏
  • 关注

原创 riscv项目plus

比如编译lowlevelboot时,编译后生成.o文件,然后指定链接器脚本将目标文件进行各段的链接,并指定运行的地址和entry(链接完毕后得指定函数入口地址,从哪个程序开始运行,这里是start.s中的__start),如flash,那么lowlevelboot将会被加载器加载进flash中执行(lowlevelboot的作用是将各个可执行文件从flash中加载进dram中执行),最后将lowlevelboot,opensbi,os等文件合成firmware固件。2.run.sh:将固件放入flash。

2025-04-21 11:39:43 183

原创 riscv操作系统总结(10)

fork功能可实现创建子进程,子进程有单独的内存空间,但是内容与父进程一样,也就是对父进程的复制!

2025-03-05 17:50:58 642

原创 riscv操作系统项目总结(9)

也就是__alltraps函数,这里我们已经熟悉了,在之前的__restore中,我们把sscratch指向了用户空间的上下文处,也就是TRAFRAME,因此这里sp将指向用户空间的上下文处,将Trap的内容不存在了用户空间!因为要执行处理函数,traphandler,只能在内核态执行!a0是传进来的TRAFRAME,Trap上下文保存的位置,a1是用户地址页,这段代码的内容为,切换到用户地址空间,恢复sstatus,sepc寄存器,恢复一开始初始化app的内容到寄存器中,sret到sepc。

2025-02-27 23:03:36 808

原创 riscv操作系统项目总结(8)

(页表本身是真实存在的,存放在物理地址中)它存在的目的是为了加快寻址速度,比如MMU寻址后,便可虚拟地址和物理地址形成一个键值对存放在快表中,下次需要寻找地址时,优先查看快表中有没有"现成的",这样可以避免MMU去寻址,拖慢运行速度,若没有“现成的”,则MMU去寻址。分配器分配时,优先分配已经回收的,也就是recycled栈里面的内存页,若没有,则分配未分配过的内存页,也就是current和end之间的内存页(不能超出范围,内存就这么大).最后返回一个分配的页号。我们采用了栈式物理页帧的方法进行分配,

2025-02-26 11:58:55 329

原创 riscv操作系统项目总结(7)

若中断特权级高于CPU当前特权级,若CPU处于U态,中断来自S态,那么中断不会被屏蔽,若二者皆为S态,则需要判断相应的CSR寄存器。前面实现了协作式多任务,但是内核的"权力"下放过大,如果一个应用始终不把cpu资源让出来,那么将会一直"霸占"cpu,因此应该让内核来进行调度,引起抢占式多任务调度就是如此,可以让每个程序公平地运行一段时间然后切换下一个任务,这样就需要加入计时器和中断来完成。若中断特权级低于CPU当前特权级,则中断会被屏蔽,比如CPU处于S态,中断来自U态。设置了有关时钟和中断相关内容。

2025-02-24 15:14:57 310

原创 riscv操作系统项目总结(6)

接下来重复执行上述过程,task2执行,trap内核态,ret用户态,task3执行,trap内核态,当运行到__switch时,注意,最后要进行ret返回到ra,在__switch之前的schedule()中根据时间轮转算法已经把task1作为下一个任务上下文传入__switch,因此在task1 __switch task2时,会自动将ra设置为调用指令的下一条地址(这里调用了__switch,ra为__switch的下一条地址),因此这里返回到task1的__switch后继续执行!

2025-02-23 21:58:14 515

原创 riscv操作系统项目总结(5)

riscv操作系统运行时主要有四种模式,U,S,H,M,前面所说的opensbi就是处于M模式(权限最高),我们写的os程序是处于S态的,再往上就是应用程序,处于U态,其中向应用程序提供的接口标准称为ABI。各种状态的不同在于访问寄存器的权限不同,用户态的权限是最低的,那么用户态触发异常时便可进入内核。处理函数可以根据异常原因进行判断,这里只是简单处理,然后条用_restore进行恢复,最后sret返回到spec的地址。本次代码编写简单实现了用户态到内核态的切换以及返回,Trap机制。我们具体总结下流程。

2025-02-21 17:57:27 275

原创 riscv操作系统项目总结(4)

随后调用_vsnprintf函数,函数较长就不放了,他的作用就是对字符串进行格式话,判断第一个参数%的的个数确定可变参数的个数。,给上层os kernel提供了调用接口,内部有SBI函数,os可通过ecall指令调用。总之,应用层系统调用内核,内核通过ecall调用SBI函数,不断向底层调用。下面来看sbi_ecall,发现已经没有函数调用了,已经无限接近os的底层了,再往下就是opensbi层了。定义args为可变参数,它指向了count的地址,随后const char*类型的args,最后结束。

2025-02-20 17:31:53 289

原创 riscv操作系统项目总结(3)

随后是编译u-boot,由于我的目标是riscv架构,因此要有相应的交叉编译器。这里使用riscv64-unknown-elf-gcc这个编译器是不行的,需要用到riscv64-unknown-linux-gnu-gcc,如果没有这个编译器需要去官方获取编译好的工具链,获取后之间直接解压即可使用。比如我下载的是这个,riscv64-glibc-ubuntu-20.04-llvm-nightly-2023.11.20-nightly.tar.gz,直接解压即可完成安装。未完待续......

2025-02-20 15:32:01 341

原创 riscv操作系统项目总结(2)

函数末尾会调用rom_add_blob_fixed_as将reset_vec中存放的机器指令放入到rom,以便上电后运行rom的指令,随后调用riscv_rom_copy_firmware_info将fw_dynimic_info结构体放到rom中的reset_vec之后,用来load设备树,但是我们不用它来load。编译好后,run运行,结果发现说串口0被占用,找了好久也没找到,以为是qemu本身的bug,最后经过大半天时间,最后发现是创建设备的时候多创建了串口(最后一行重复了)。来分析一下整个流程。

2025-02-19 11:15:29 547

原创 riscv操作系统项目总结(1)

固件的概念:固件(Firmware)位于硬件和应用软件之间,它是一种底层软件,直接运行在硬件之上,通常不可修改,使硬件按照预定的方式工作。建立boot文件夹,放置boot.lds链接器脚本文件和start.s汇编文件。首先看汇编文件的部分内容:目的就是将hello quard star board!依次输入到串口的发送data寄存器。(.section .text 的的意思是告诉汇编器,接下来的代码放在text段)

2025-02-17 23:18:18 779 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除