项目描述:本项目旨在将xv6操作系统移植到 Milk-V Duo 开发板上,以实现在该硬件平台上的运行。xv6 是一个经典的教学性质操作系统,具有简单而可扩展的设计,适合用于教育和研究目的。Milk-V Duo 是一款嵌入式开发板,搭载了特定的处理器和外围设备,移植 xv6 到该平台将为学术研究和嵌入式系统开发提供一个有趣的机会。
主要活动形式:
分析 XV6 的设计,并输出文档或分享
将 xv6 从 virt machine 上移植到 Milk-V Duo 开发板上,目前已经调研过要进行的步骤有
主要产出形式:
输出 xv6 的相关文章
操作系统理论知识介绍
xv6 模块设计及组织(如中断异常处理、内存分配、进程调度)
将xv6移植到开发板上的经验
在 Milk-V Duo 开发板上部署xv6的成熟方案
如果进展顺利,可以进行线上技术交流,分享具体 xv6 的设计分析及移植经验
主要内容:
前置知识
操作系统相关理论知识
xv6 内核设计及其实践
了解 Milk-V Duo 开发板特性
RISC-V 相关知识(RISC-V 汇编语言、特权模式和 CSR)
C 语言、汇编语言等
额外挑战(若行有余力):
参考资料:
设备树解析
xv6 for riscv 源码
Xv6, a simple Unix-like teaching operating system
The RISC-V Instruction Set Manua
Duo 中文论坛
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
方案讨论:
1.没理解为什么要动uboot的设备树,官方的sdk不是可以生成Uboot吗?
至于xv6内核,没有用设备树这种方式,都写到代码里的。
2.xv6 在板子上跑起来,需要关注
外设:串口 和 磁盘,这个在 xv6 里面是 qemu 里面虚拟的这两个外设,得结合 duo 的外设寄存器进行移植。
内存:xv6-riscv 将内核放在 qemu 的物理地址 4G 偏移处的内存处,且仅使用的是 128M 大小。实际板子上得改一下,物理内存应该没有4G, 至于具体偏多少,看看芯片手册外设寄存器的地址范围,在这之外即可。
中断:中断控制器得结合芯片手册了,还有周期的时钟中断,这个也是用的 qemu 的,得改成实际芯片的。
今天踩了一些坑,完成了uboot的编译,明天会开始进行xv6代码的分析并形成文档
今天因为在等其他部分工作,稍微有时间调研了一下,可以在 milkv duo 板子上使用 uboot 命令行,已经测试了,运行得很好,照我的理解,uboot 已经初始化好了 uart,那么我们只需要往地址上写字符即可实现串口通信,不过这个因为我最近重装回了 windows,失去了 linux 环境没能验证(我有点抗拒虚拟机);
还有就是对于文件系统,暂且决定使用 fat32 文件系统,但是文件系统的接口编写会有一些工作量,我在调研中发现了 fatfs,文件系统的话,应该使用的是什么平台无关吧?我在想 fatfs 是否可以在 riscv 上使用,如果可以的话应该可以节省许多时间
任何建议或批评我都感激不尽。
目前已经实现了通过 uboot 进入我们的小程序,串口输出的问题也有方法了,跟之前想的一样,uboot 已经初始化好了串口,只需要往寄存器中写东西就好了
开发板的设备树地址和设备树大小,开发板的内存分配情况
cv180x_c906# bdinfo
boot_params = 0x0000000000000000
DRAM bank = 0x0000000000000000
-> start = 0x0000000080000000
-> size = 0x0000000003f40000
flashstart = 0x0000000000000000
flashsize = 0x0000000000000000
flashoffset = 0x0000000000000000
baudrate = 115200 bps
relocaddr = 0x0000000082433000
reloc off = 0x0000000002233000
Build = 64-bit
current eth = ethernet@4070000
ethaddr = (not set)
IP addr = 192.168.0.3
fdt_blob = 0x0000000081bece10
new_fdt = 0x0000000081bece10
fdt_size = 0x0000000000006020
lmb_dump_all:
memory.cnt = 0x1
memory[0] [0x80000000-0x83f3ffff], 0x03f40000 bytes flags: 0
reserved.cnt = 0x2
reserved[0] [0x80000000-0x8003ffff], 0x00040000 bytes flags: 0
reserved[1] [0x81beb9c0-0x83f3ffff], 0x02354640 bytes flags: 0
登录 后才可以发表评论