操作系统实践课程结课报告

news2024/12/28 4:53:51

操作系统实践课程结课报告

目标:Write your own OS in C
作者:我也需要被治愈(学号:hello os)
日期:2023年7月20日

个人觉得这个过程还是蛮有意思的,初步了解了有关的一些内容顺带复习了操作系统课程,虽然很正常的学完后感到头疼和庞杂,但这太正常了,不是吗?
诸君共勉

目录

文章目录

  • 简介
  • 环境准备
  • 交叉编译器
    • 尝试过程
    • 成功实现
  • qemu模拟器
  • gdb调试器
  • make构造工具
  • 上下文切换代码示例运行
  • 启动RVOS
    • 制作交叉工具链
    • 下载源码
    • 制作内核
    • 制作 rootfs
    • 运行

简介

操作系统实践课程实践任务,包括开发环境的准备与交叉编译器、qemu模拟器、gdb调试器等工具的安装与使用。
基于qemu的RISC-V 64 位版本的 Linux的启动。

报告截图的用户名会有变化,因为我创建了多台虚拟机进行实验。

环境准备

  • VMware Workstation 16 Pro
  • 操作系统:ubuntu-20.04.6-desktop-amd64
    在这里插入图片描述

虚拟机搭建见个人总结博文:搭建虚拟机

直接使用官方提供的 GNU工具链和 QEMU 模拟器,执行如下命令在线安装:

sudo apt update
sudo apt install build-essential gcc make perl dkms git gcc-riscv64-unknown-elf gdb-multiarch qemu-system-misc

至此环境准备结束。

交叉编译器

在这里插入图片描述

尝试过程

GNU交叉编译工具链已安装 riscv64-unknown-elf-gcc

riscv64-unknown-elf-gcc --version

在这里插入图片描述
尝试编使用riscv64-unknown-elf-gcc进行编译,报错。
在这里插入图片描述

由参考资料errata.pdf【勘误4-2】可知,错误是正常且不影响课程的。
在这里插入图片描述

尝试使用riscv64-linux-gnu-gcc成功编译。
在这里插入图片描述

但是qemu模拟运行却报错。

Invalid ELF image for this architecture

使用file查看文件
在这里插入图片描述

发现默认是Shared object file,在编译的时候加上-no-pie参数。

riscv64-linux-gnu-gcc -no-pie hello.c 

重新file查看。
在这里插入图片描述

但是重新qemu运行依然报错,思考后认为是编译默认64位(riscv64-unknown-elf-gcc的参数指定在riscv64-linux-gnu-gcc中无效)和qemu模拟32位的冲突。

成功实现

参照参考文献【5】,重新进行。
在这里插入图片描述
编译后file查看确定无误为RISC-V,交叉编译成功。
在这里插入图片描述

qemu模拟器进行模拟,报错按照提示修复即可。
在这里插入图片描述
在这里插入图片描述

可以看到这个目标文件是不能在当前的系统下运行的
在这里插入图片描述

最后通过qemu模拟运行,成功!
在这里插入图片描述

qemu模拟器

QEMU 是一套由 (Fabrice Bellard) 编写的以 GPL 许可证分发源码的计算机系统模拟软件,在 GNU/Linux 平台上使用广泛。

在环境准备中已经安装好了qemu,下面检查一下是否成功。
使用如下命令查看qemu:

qemu-system-riscv64 --version

在这里插入图片描述

gdb调试器

在环境准备中已经安装好了gdb,下面检查一下是否成功。
在这里插入图片描述

使用参考:学习使用 GDB 调试代码 | Linux 中国

make构造工具

自动化构建管理工具。

上下文切换代码示例运行

在这里插入图片描述

os.h的context结构体存储寄存器状态。
在这里插入图片描述
我们的系统仅仅运行在一个核中,要实现多任务需要保存上下文的值(实际上就是寄存器以及程序计数器等重要环境的值)。

关键函数是(switch_to)
在这里插入图片描述

启动RVOS

工作目录是riscv64-linux,交叉工具链目录是riscv-gnu-toolchain
在这里插入图片描述

制作交叉工具链

根据参考文献【5】,以及前文的内容完成交叉工具链的制作。

需要注意参考文献【6】中的所有内容都需要把 riscv64-unknown-linux-gnu-gcc替换为 $WS/install/bin/riscv64-unknown-linux-gnu-gcc

在学习过程中发现就算是按照指导进行使用国内镜像也总是会有问题,在解决的过程中找到了前辈分享的资源riscv-gnu-toolchain,可以免去苦苦等待且可能出问题的子仓库下载内容。

下载源码

下载源码压缩包并解压。

wget https://download.qemu.org/qemu-5.1.0.tar.xz
tar xvJf qemu-5.1.0.tar.xz

在这里插入图片描述

编译并安装。

cd qemu-5.1.0/
./configure --target-list=riscv64-softmmu,riscv64-linux-user --prefix=/opt/qemu
make -j $(nproc)
sudo make install

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

导出 qemu 的安装目录并验证安装是否正确。
在这里插入图片描述

制作内核

回到工作目录riscv64-linux,然后下载内核源码并进入linux目录。
检出到5.4版本。
在这里插入图片描述

编译和配置。

make ARCH=riscv CROSS_COMPILE=$WS/install/bin/riscv64-unknown-linux-gnu- defconfig
make ARCH=riscv CROSS_COMPILE=$WS/install/bin/riscv64-unknown-linux-gnu- -j $(nproc)

在这里插入图片描述

再次强调这里不是riscv64-unknown-linux-gnu,而是$WS/install/bin/riscv64-unknown-linux-gnu-后面也一样。

制作 rootfs

下载并进入busybox。

git clone https://gitee.com/mirrors/busyboxsource.git
cd busyboxsource/

配置busybox。

CROSS_COMPILE=$WS/install/bin/riscv64-unknown-linux-gnu- make menuconfig

这里遇到bug如下:
fatal error: curses.h: No such file or directory
在这里插入图片描述
通过如下命令解决:
sudo apt-get install libncurses5-dev
在这里插入图片描述

继续运行

注意这里要把终端窗口大小调大一些,不然会报如下错误:
在这里插入图片描述
是我窗口太小不能展示出busybox的GUI界面所致,调大窗口即可。

成功运行。
在这里插入图片描述

设置打开配置菜单后进入第一行的 “Settings”,在"Build Options"节中,选中 “Build static binary (no shared libs)”,设置好后退出保存配置。
在这里插入图片描述
在这里插入图片描述

编译和安装。

CROSS_COMPILE=$WS/install/bin/riscv64-unknown-linux-gnu- make -j $(nproc)
CROSS_COMPILE=$WS/install/bin/riscv64-unknown-linux-gnu- make install

在这里插入图片描述
在这里插入图片描述

可以看到_install目录下生成的内容。
在这里插入图片描述

制作一个最小的文件系统。
返回工作目录,输入以下命令。

qemu-img create rootfs.img  1g
mkfs.ext4 rootfs.img

在这里插入图片描述

接下来输入如下命令,将_install内的内容拷贝,创建一些文件。

mkdir rootfs
sudo mount -o loop rootfs.img  rootfs
cd rootfs
sudo cp -r ../busyboxsource/_install/* .
sudo mkdir proc sys dev etc etc/init.d

在这里插入图片描述

然后另外再新建一个最简单的 init 的 RC 文件,具体步骤如下:

cd etc/init.d/
sudo touch rcS
sudo vi rcS

将以下内容粘入文件

#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
/sbin/mdev -s

然后修改 rcS 文件权限,加上可执行权限,这样当 busybox 的init 运行起来后,就能运行这个 /etc/init.d/rcS 脚本。

sudo chmod +x rcS

最后退出 rootfs 目录并卸载文件系统:

sudo umount rootfs

在这里插入图片描述

至此,文件系统就制作完成了。

运行

准备工作全部完成,退回工作目录。
运行如下代码:

qemu-system-riscv64 -M virt -m 256M -nographic -kernel linux/arch/riscv/boot/Image -drive file=rootfs.img,format=raw,id=hd0  -device virtio-blk-device,drive=hd0 -append "root=/dev/vda rw console=ttyS0"

在这里插入图片描述
出现问题。

根据参考文献【6】
修改参数如下:

qemu-system-riscv64 -M virt -m 256M -nographic -kernel linux/arch/riscv/boot/Image -drive file=rootfs.img,format=raw,id=hd0  -device virtio-blk-device,drive=hd0 -append "root=/dev/vda rw console=ttyS0" -bios default

成功运行!
在这里插入图片描述在这里插入图片描述

参考文献

[1] 课程视频讲解
[2] riscv-operating-system-mooc
[3] csdn [MIT 6.S081] Lab 0: 实验配置, 调试及测试
[4] Running 64- and 32-bit RISC-V Linux on QEMU
[5] 制作交叉工具链 riscv-gnu-toolchain
[6] target-riscv
[7] 在 QEMU 上运行 RISC-V 64 位版本的 Linux

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运营人必备这个微信运营工具

微信管理系统CRM在各行各业都有应用的场景---IT互联网、制造业、商业服务、金融投资、教育培训、房产家装、电商、政务等20行业领域均得到广泛应用。 微信CRM管理系统的主要功能: 多个微信号聚合聊天:解决多个微信来回切换,换着手着手机的麻烦…

PHP 行事准则:allow_url_fopen 与 allow_url_include

文章目录 参考环境allow_url_fopenallow_url_fopen 配置项操作远程文件file 协议 allow_url_includeallow_url_include 配置项 allow_url_include 与 allow_url_fopen区别联系默认配置配置项关闭所导致异常运行时配置ini_set()限制 参考 项目描述搜索引擎Bing、GoogleAI 大模型…

VulnHub Earth

一、信息收集 1.主机和端口扫描 nmap -sS 192.168.103.1/24 发现443端口有DNS解析,在hosts文件中添加DNS解析: 2.收集earth.local信息 发现有Previous Messages 37090b59030f11060b0a1b4e0000000000004312170a1b0b0e4107174f1a0b044e0a000202134e0a161…

Verilator: sh: 1: exec: < PATHNAME >: not found

事出有因 I assumed that I install verilator via git clone its source, so I need to set the export VERILATOR_ROOT. At first, due to laziness, I just copy the code directly to my ubuntu. so stupid I am!!! Then, I recoginzed that the pathname is not real, …

Opengl之立方体贴图

简单来说,立方体贴图就是一个包含了6个2D纹理的纹理,每个2D纹理都组成了立方体的一个面:一个有纹理的立方体。你可能会奇怪,这样一个立方体有什么用途呢?为什么要把6张纹理合并到一张纹理中,而不是直接使用6个单独的纹理呢?立方体贴图有一个非常有用的特性,它可以通过一…

HTML5+CSS3+移动web 前端开发入门笔记(一)

千古前端图文教程 千古前端图文教程 git的使用 Git是一个分布式版本控制系统,它的作用主要包括以下几个方面: 版本管理:Git可以跟踪文件的修改历史,记录每次提交的内容、时间和作者等信息。通过Git,开发人员可以轻…

波奇学C++:红黑树

红黑树性质: 1.每个结点不是红色就是黑色。 2.根节点是黑色 3.如果一个节点是红色,它的两个孩子必须是黑色 4.对于每个节点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点 5.每个叶结点都是黑色的&#xff08…

主机ping不通虚拟机,虚拟机可以ping同主机

问题:主机ping不通虚拟机 虚拟机可以ping通主机(192.168.43.140)和外网(www.baidu.com) 解决方法: 1.打开【控制面板】-->【网络和Internet】-->【网络连接】 2.选择VMnet8 右键【属性】 3.修改 IP地址(I)和 子…

1、内核加载模块

一、静态加载 1、新功能源码与内核源码一起编译进uImage文件内 新功能源码与Linux内核源码在同一目录结构下在linux-3.14/drivers/char/目录下编写hello.c文件&#xff0c;内容如下 #include <linux/module.h> #include <linux/kernel.h>int __init myhello_ini…

oracle OCP OCM MySQL OCP认证难吗?

好多人在初次考OCP时&#xff0c;不知道如何选择&#xff0c;本文让姚远ACE老师为大家总结一下吧&#xff01; 选择OCP认证时要注意的问题&#xff1a; 1&#xff0c;授课老师师资经验&#xff08;非常重要&#xff09; 2&#xff0c;课程大纲 3&#xff0c;试听课程 4&am…

零食食品经营小程序商城的作用是什么

零食几乎可以涵盖每个年龄阶段&#xff0c;同时又是市场中常见的零售批发商品&#xff0c;在多个场景中都有销售/购买属性&#xff0c;对消费者来说&#xff0c;购买零食的渠道多种多样&#xff0c;无论线下还是线上&#xff0c;都可随心而购。 庞大市场升级促进下&#xff0c…

医学影像归档与通讯系统(PACS)系统源码 PACS三维图像后处理技术

医学影像归档与通讯系统&#xff08;PACS&#xff09;系统源码 PACS三维图像处理 医学影像归档与通讯系统&#xff08;PACS&#xff09;系统&#xff0c;是一套适用于从单一影像设备到放射科室、到全院级别等各种应用规模的医学影像归档与通讯系统。PACS集患者登记、图像采集、…

国庆特别篇:中秋与国庆同日相迎

国庆特别篇&#xff1a;中秋与国庆同日相迎 国庆特别篇&#xff1a;中秋与国庆同日相迎 &#x1f389;摘要引言旅途风景分享 &#x1f5fa;️中秋团圆&#xff0c;返乡之路风景宜人的旅游胜地 技术探讨&#xff1a;Java中的可变参数 &#x1f680;什么是可变参数&#xff1f;使…

RabbitMQ集群搭建详细介绍以及解决搭建过程中的各种问题——实操型

RabbitMQ集群搭建详细介绍以及解决搭建过程中的各种问题——实操型 1. 准备工作1.1 安装RabbitMQ1.2 简单部署搭建设计1.3 参考官网 2. RabbitMQ 形成集群的方法3. 搭建RabbitMQ集群3.1 部署架构3.2 rabbitmq集群基础知识3.2.1 关于节点名称&#xff08;标识符&#xff09;3.2.…

《操作系统真象还原》 第 01 章 部署工作环境 学习笔记

0. 内容说明 本内容依据《操作系统真象还原》进行学习&#xff0c;在学习过程中&#xff0c;由于新版本和旧版本bochs存在参数差异&#xff0c;故此会出现一些调试错误。也记录对应的解决方案。 1. 需要的编译器 对于现代OS来说&#xff0c;主要使用 C语言 和 汇编语言 两种…

剑指offer——JZ26 树的子结构 解题思路与具体代码【C++】

一、题目描述与要求 树的子结构_牛客题霸_牛客网 (nowcoder.com) 题目描述 输入两棵二叉树A&#xff0c;B&#xff0c;判断B是不是A的子结构。&#xff08;我们约定空树不是任意一个树的子结构&#xff09; 假如给定A为{8,8,7,9,2,#,#,#,#,4,7}&#xff0c;B为{8,9,2}&…

【智能家居项目】裸机版本——字体子系统 | 显示子系统

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《智能家居项目》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 今天实现上图整个项目系统中的字体子系统和显示子系统。 目录 &#x1f004;设计思路&#x1…

无法启动此程序,因为计算机中“找不到msvcp140.dll”的解决方法

msvcp140.dll是Microsoft Visual C 2015 Redistributable的一个动态链接库文件&#xff0c;它是许多基于Visual Studio开发的应用程序和游戏的必要组件。当计算机上缺失msvcp140.dll文件时&#xff0c;可能会导致以下问题&#xff1a; 1. 程序无法启动&#xff0c;提示“找不到…

【多线程安全】死锁 锁竞争总结

下面有两段代码&#xff1a; public class test {private static int count 0;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(() -> {for (int i 0; i < 10000; i) {count;}});Thread t2 new Thread(() -> {for (i…

速通Redis基础(一):掌握Redis的字符串类型和命令

目录 字符串&#xff08;String&#xff09; 常见命令 SET GET MSET&MGET SETNX INCR INCRBY DECR DECRBY INCRBYFLOAT APPEND GETRANGE SETRANGE STRLEN Redis字符串类型命令总结 Redis&#xff08;Remote Dictionary Server&#xff09;是一个高性能的…