学习xv6:riscv64操作系统xv6实现

学习xv6:riscv64操作系统xv6实现

xv6是Dennis Ritchie和Ken Thompson的Unix的重新实现
版本6(v6)。xv6遵循v6的结构和风格,使用ANSI C为现代RISC-V多处理器实现的操作系统。

官方课程地址:6.S081 / Fall 2021

源代码:https://github.com/mit-pdos/xv6-riscv

这份源代码需要Ubuntu24.04版本或QEMU大于7.2版本。

下载源代码:

git clone https://github.com/mit-pdos/xv6-riscv.git

下载xv6配套书:

git clone https://github.com/mit-pdos/xv6-riscv-book.git

另一份公开的源代码:GitHub - mit-pdos/xv6-public: xv6 OS

这份代码可以在Ubuntu22.04下运行。 

下载源代码 

git clone https://github.com/mit-pdos/xv6-public

中文书:GitHub - deyuhua/xv6-book-chinese: MIT操作系统工程的教学操作系统Xv6的源码剖析中文翻译项目,使用ANSI标准C重新在riscv架构上实现Unix v6;

安装使用流程

安装qemu

sudo apt install qemu qemu-system

下载源代码

​git clone https://github.com/mit-pdos/xv6-public

编译并启动到xv6:

make qemu-nox

启动成功,显示: 

SeaBIOS (version 1.15.0-1)


iPXE (https://ipxe.org) 00:03.0 CA00 PCI2.10 PnP PMM+1FF8B4A0+1FECB4A0 CA00



Booting from Hard Disk..xv6...
cpu0: starting 0
sb: size 1000 nblocks 941 ninodes 200 nlog 30 logstart 2 inodestart 32 bmap start 58
init: starting sh

要退出qemu的xv6环境,可以CTRL+a 然后键入x,退出

实践

在Windows10里安装Ubuntu,在Microsoft Store商店里找到相应的Ubuntu版本安装即可。

在Windows 10里使用Ubuntu22.04 实践xv6-public

首先下载源代码

git clone https://github.com/mit-pdos/xv6-public

安装make 

sudo apt install make 

安装QEMU

sudo apt install qemu qemu-system

安装gcc

sudo apt install gcc

编译并进入xv6系统

 make qemu-nox

显示输出: 

SeaBIOS (version 1.15.0-1)


iPXE (https://ipxe.org) 00:03.0 CA00 PCI2.10 PnP PMM+1FF8B4A0+1FECB4A0 CA00



Booting from Hard Disk..xv6...
cpu0: starting 0
sb: size 1000 nblocks 941 ninodes 200 nlog 30 logstart 2 inodestart 32 bmap start 58
init: starting sh
$ ls
.              1 1 512
..             1 1 512
README         2 2 2286
cat            2 3 15468
echo           2 4 14348
forktest       2 5 8792

在Windows 10里使用Ubuntu22.04 实践xv6-riscv(失败)

安装源码

https://github.com/mit-pdos/xv6-riscv.git

安装gcc-riscv64-linux-gnu

sudo apt install gcc-riscv64-linux-gnu

编译 

make qemu

在Windows 10里使用Ubuntu24.04 实践xv6-riscv

 安装qemu

sudo apt install qemu qemu-system

安装make

sudo apt install make

 安装gcc-riscv64-linux-gnu

sudo apt install gcc-riscv64-linux-gnu

安装gcc

sudo apt install gcc

编译进入qemu的xv6系统

make qemu

终于进入了vx6系统:

xv6 kernel is booting

hart 1 starting
hart 2 starting
init: starting sh

上难度:添加一个自己的程序

进入xv6-riscv源代码的user目录,写一个demo.c文件:

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
int main(){
        printf("hello world by printf");
}

 修改xv6-riscv根目录下的Makefile文件,在UPROGS部分加入 $U/_demo\ 这句:

UPROGS=\
        $U/_cat\
        $U/_echo\
        $U/_forktest\
        $U/_grep\
        $U/_init\
        $U/_kill\
        $U/_ln\
        $U/_ls\
        $U/_mkdir\
        $U/_rm\
        $U/_sh\
        $U/_stressfs\
        $U/_usertests\
        $U/_grind\
        $U/_wc\
        $U/_demo\
        $U/_zombie\

重新编译进入qemu的xv6系统

make qemu

进入vx6系统后,执行demo:

xv6 kernel is booting

hart 1 starting
hart 2 starting
init: starting sh
$ demo
hello world by printf$

 哈哈,咱们写的hello world 执行啦!

调试

在Ubuntu22.04 进行xv6-riscv 编译make qemu 卡住

 make qemu
qemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp 3 -nographic -global virtio-mmio.force-legacy=false -drive file=fs.img,if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0

看看版本:

qemu-system-riscv64 -version
QEMU emulator version 6.2.0 (Debian 1:6.2+dfsg-2ubuntu6.24)
Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers

有人说建议升级Ubuntu到24:xv6 kernel doesn't boot: stuck at "make qemu". · Issue #262 · mit-pdos/xv6-riscv · GitHub

有人建议qemu-system-riscv64升级到大于7.2,

please run this command qemu-system-riscv64 -version first and make sure your version >= 7.2

而当前的是QEMU 6.2.0 monitor

换Ubuntu24,在Windows10里安装Ubuntu24.04

编译报错make: gcc: No such file or directory

proc.o kernel/swtch.o kernel/trampoline.o kernel/trap.o kernel/syscall.o kernel/sysproc.o kernel/bio.o kernel/fs.o kernel/log.o kernel/sleeplock.o kernel/file.o kernel/pipe.o kernel/exec.o kernel/sysfile.o kernel/kernelvec.o kernel/plic.o kernel/virtio_disk.o
riscv64-linux-gnu-ld: warning: kernel/kernel has a LOAD segment with RWX permissions
riscv64-linux-gnu-objdump -S kernel/kernel > kernel/kernel.asm
riscv64-linux-gnu-objdump -t kernel/kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > kernel/kernel.sym
gcc -Werror -Wall -I. -o mkfs/mkfs mkfs/mkfs.c
make: gcc: No such file or directory
make: *** [Makefile:117: mkfs/mkfs] Error 127

sudo apt upgrade 试试

不行

sudo apt install gcc 试试

ok了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/939570.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c语言----选择结构

基本概念 选择结构是C语言中用于根据条件判断来执行不同代码块的结构。它允许程序在不同的条件下执行不同的操作,使程序具有决策能力。 if语句 单分支if语句 语法格式: if (条件表达式) { 执行语句块; } 功能: 当条件表达式的值为真&#…

RK3588 , mpp硬编码rgb, 保存MP4视频文件.

RK3588 , mpp硬编码yuv, 保存MP4视频文件. ⚡️ 传送 ➡️ RK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGBRk3588 FFmpeg 拉流 RTSP, 硬解码转RGBUbuntu x64 架构, 交叉编译aarch64 FFmpeg mppCode Init MppMPP_RET init_mpp

uniapp blob格式转换为video .mp4文件使用ffmpeg工具

前言 介绍一下这三种对象使用场景 您前端一旦涉及到文件或图片上传Q到服务器,就势必离不了 Blob/File /base64 三种主流的类型它们之间 互转 也成了常态 Blob - FileBlob -Base64Base64 - BlobFile-Base64Base64 _ File uniapp 上传文件 现在已获取到了blob格式的…

【Linux运维】配置ssh免密登录

1.场景描述 内网环境,需要同步17服务器的文件到10服务器进行备份。因为每次输入密码比较繁琐,如果实现免密登录后,即可简化脚本。 要求:需要2台服务器-免密登录 2.方案分析 (1)现状:登录需要输…

使用Python从阿里云物联网平台获取STM32温度数据

在物联网(IoT)应用中,设备数据的采集与监控至关重要。本文将详细介绍如何使用Python从阿里云物联网平台获取STM32设备的温度数据。我们将从已有的Java代码出发,逐步将其转换为Python,并处理在过程中遇到的问题&#xf…

职场上,如何做好自我保护?

今天我们讨论一个话题:在职场上,如何保护好自己?废话不多说,我们直接上干货。 (一) 1.时刻准备一点零食或代餐,如果遇到长时间的会议,就补充点能量。代餐最好选流体,这…

网络编程 02:IP 地址,IP 地址的作用、分类,通过 Java 实现 IP 地址的信息获取

一、概述 记录时间 [2024-12-18] 前置文章:网络编程 01:计算机网络概述,网络的作用,网络通信的要素,以及网络通信协议与分层模型 本文讲述网络编程相关知识——IP 地址,包括 IP 地址的作用、分类&#xff…

tryhackme-Pre Security-HTTP in Detail(HTTP的详细内容)

任务一:What is HTTP(S)?(什么是http(s)) 1.What is HTTP? (HyperText Transfer Protocol)(什么是 HTTP?(超文本传输协议)) http是你查看网站的时候遵循的…

UDP网络编程套接

目录 本文核心 预备知识 1.端口号 认识TCP协议 认识UDP协议 网络字节序 socket编程接口 sockaddr结构 UDP套接字编程 服务端 客户端 TCP与UDP传输的区别 可靠性: 传输方式: 用途: 头部开销: 速度: li…

MyBatis-Plus中isNull与SQL语法详解:处理空值的正确姿势

目录 前言1. 探讨2. 基本知识3. 总结 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全&#x…

EGO Swarm翻译

目录 摘要 Ⅰ 介绍 Ⅱ 相关工作 A . 单四旋翼局部规划 B . 拓扑规划 C. 分布式无人机集群 Ⅲ 基于梯度的局部规划隐式拓扑轨迹生成 A.无需ESDF梯度的局部路径规划 B.隐式拓扑轨迹生成 Ⅳ 无人机集群导航 A 机间避碰 B. 定位漂移补偿 C. 从深度图像中去除agent Ⅴ …

电商数据采集电商,行业数据分析,平台数据获取|稳定的API接口数据

电商数据采集可以通过多种方式完成,其中包括人工采集、使用电商平台提供的API接口、以及利用爬虫技术等自动化工具。以下是一些常用的电商数据采集方法: 人工采集:人工采集主要是通过基本的“复制粘贴”的方式在电商平台上进行数据的收集&am…

PostgreSQL和Postgis安装

Windows下PostgreSQL和对应的版本的Postgis安装 PostgreSQL安装 1、官网下载地址 https://www.enterprisedb.com/downloads/postgres-postgresql-downloads 2、根据自己的系统下载完成,Windows下可以直接傻瓜式安装就OK 建议不要通过自带的这个程序安装postgis,…

代码开发相关操作

使用Vue项目管理器创建项目:(vue脚手架安装一次就可以全局使用) windowR打开命令窗口,输入vue ui,进入GUI页面,点击创建-> 设置项目名称,在初始化git下面输入:init project&…

Vulnhub DC-6靶机攻击实战(一)

导语   之前的分享中我们介绍了关于Vulnhub虚拟机前五个机器的攻防演练测试,接下来我们继续分享Vulnhub DC-6靶机攻击实战。 文章目录 搭建测试环境第一步、信息采集第二步、wpscan爆破第三步、开始查找其他的用户第四步、提权总结搭建测试环境 首先需要从Vulnhub官网中下载…

深度学习之超分辨率算法——FRCNN

– 对之前SRCNN算法的改进 输出层采用转置卷积层放大尺寸,这样可以直接将低分辨率图片输入模型中,解决了输入尺度问题。改变特征维数,使用更小的卷积核和使用更多的映射层。卷积核更小,加入了更多的激活层。共享其中的映射层&…

深度学习从入门到精通——图像分割实战DeeplabV3

DeeplabV3算法 参数配置关于数据集的配置训练集参数 数据预处理模块DataSet构建模块测试一下数据集去正则化模型加载模块DeepLABV3 参数配置 关于数据集的配置 parser argparse.ArgumentParser()# Datset Optionsparser.add_argument("--data_root", typestr, defa…

大数据操作实验一

1.Postgresql 1.1 数据库的对象创建 1.1.1 创建数据库(Database) 鼠标右键database进行创建 1.1.2 创建图(Schema) 鼠标右键schema,然后创建schema图纸 1.1.3 创建表(Table) 鼠标右键Table,创建表 1.2数据库实列化 1.2.1 实列化静态数据 提…

IDEA2024如何创建一个普通的Java Web项目工程(JSP)

本章教程,主要介绍如何在IDEA2024 专业版本中,创建一个普通的Java Web项目。 一、新建项目 二、配置项目 依次点击File——Project Structure——Modules 修改路径中的web为webapp,然后点击Create Artifact默认保存。 至此,一个基础的Java web就创建完成了。

Linux下mysql 8.0安装教程

本文介绍了如何在Linux下安装MySQL8.0,供大家参考,具体内容如下 准备工作: mysql8.0 rpm文件 测试工具(比如 idea的database工具) 安装步骤: 1. 下载mysql的repo源,下载地址: 进入Linux系统,输入指令: 1 wgethttps://dev.mysql.com/get/mysql80-community-rele…