采用gem5实现Full System Linux Boot

3 篇文章 0 订阅

采用gem5实现Full System Linux Boot

0. 前言

  • 运行环境问题

    我尝试过在虚拟机(VMware)和 WSL2 上运行本实验,但是总会出现各种各样的问题,最后还是选择重新安装了Ubuntu 22.04 LTS,再进行实验就顺利多了

  • 官网文档的问题

    官网文档Tutorial: Run Full System Linux Boot Tests

    地址:https://www.gem5.org/documentation/gem5art/tutorials/boot-tutorial

    期初在官网按照教程做,但是一直出现报错。经过分析,发现有几个问题:

    1. 步骤过于繁琐,但是有些细节内容又没有详细描述

    2. 部分内容存在错误,例如在boot-exit.json中存在一些错误,在仿真的时候会报错

      在这里插入图片描述

    3. 文档中的代码对最新版本的gem5好像不太支持?我这里运行的时候经常会报错

    因此,本仿真不采用官网文档一步步进行,采用最新的gem5-resource仓库进行,后面会细讲

  • 基本原理

    1. gem5支持全系统仿真(Full System),全系统仿真包含了整个计算机系统,例如处理器核心、外设、存储、网络连接、完整的软件栈(设备驱动、操作系统、应用程序)等。在在FS模式下,gem5仿真整从CPU到I/O的各个硬件系统,能够帮助gem5在不做修改的情况下执行二进制文件,也能够帮助我们去探索操作系统的影响
    2. 一般情况下,全系统仿真需要如下组件进行
      • gem5 binary:是编译gem5后得到的二进制文件
        • gem5/build/X86/gem5.opt
      • config file:配置文件,采用python写成,用来配置系统参数
        • x86-npb-benchmarks.py
      • kernel binary:用于仿真的linux kernel
        • core of an OS
      • disk image:操作系统镜像
      • workloads binaries:用于仿真的工作负载

1. 背景

  • 概述

    本仿真的基本思路是,采用gem5实现全系统仿真下,linux系统(Ubuntu 18.04)的启动过程

    可以这样理解:在Ubuntu的环境下,通过gem5模拟出一个硬件平台,之后再在这个模拟出来的硬件平台上运行一个Ubuntu

  • 资源

    1. gem5仓库

      https://github.com/gem5/gem5

    2. gem5-resource仓库

      https://github.com/gem5/gem5-resources

2. 按照默认模式运行

  • 下载gem5

    git clone https://github.com/gem5/gem5-resources.git
    
  • 在gem5文件夹下,进行编译

    scons build/X86/gem5.opt -j`nproc`
    cd ./util/m5
    scons build/x86/out/m5
    
  • 切换至gem5文件夹,运行configs/example/gem5_library/x86-ubuntu-run.py,会基于运行Timing CPU运行系统

    cd ../../
    ./build/X86/gem5.opt configs/example/gem5_library/x86-ubuntu-run.py
    

    若发现本地没有linux kernel和Ubuntu,则会进行自动下载

    在这里插入图片描述

    注意:这里运行时间会非常长,且注意监听端口是3456

    在这里插入图片描述

  • 采用gem5中的 m5 terminal 观察系统的启动过程,打开一个新的terminal,在gem5文件夹中运行

    cd ./util/term
    make
    m5term localhost 3456
    

    此时,会激活 m5 terminal,显示Ubuntu系统的启动过程

    在这里插入图片描述

    等待很长时间之后(在我笔记本上基本上需要两三小时),开始进入Ubuntu系统

    在这里插入图片描述

    成功启动后,将会exit,如下图所示

    在这里插入图片描述

    启动的过程中,会遇到两个错误,但是好像不影响最终结果?最终能够实现成功启动并退出

    [FAILED] Failed to start Accounts Service.
    See 'systemctl status accounts-daemon.service' for details.
    
    [FAILED] Failed to start Dispatcher daemon for systemd-networkd.
    See 'systemctl status networkd-dispatcher.service' for details.
    

3. 自己制作disk image

  • 注意,从这里开始是另外的内容了,和上文所述内容不是顺序关系

  • 首先将仓库clone下来,再进入x86-ubuntu文件夹后将gem5 clone下来

    git clone https://github.com/gem5/gem5-resources.git
    cd gem5-resources/src/x86-ubuntu/
    git clone https://github.com/gem5/gem5.git
    

    其文件目录如下

    x86-ubuntu/
      |___ gem5/                                   # gem5 源代码
      |
      |___ disk-image/
      |      |___ build.sh                         # 用于下载 packer 并且构建 disk image
      |      |___ shared/                          # 构建 disk image 的一些辅助文件
      |      |___ x86-ubuntu/
      |            |___ x86-ubuntu-image/          # disk image 创建时会自动创建
      |            |      |___ x86-ubuntu          # 所创建的 disk image 文件
      |            |___ x86-ubuntu.json            # Packer 所采用的脚本文件
      |            |___ exit.sh                    # 用于成功 boot 后退出 Ubuntu 系统
      |            |___ post-installation.sh       # 安装后的辅助文件
      |
      |___ linux                                   # Linux kernel
      |
      |___ README.md                               # README 文件
    
  • 编译gem5:进入gem5文件夹,运行

    scons build/X86/gem5.opt -j`nproc`
    

    在这里插入图片描述

    编译 m5:

    cd ./util/m5
    scons build/x86/out/m5
    

    在这里插入图片描述

  • 进入disk-image,首先会下载 packer 用于构建disk image

    cd disk-image
    ./build.sh
    

    在这里插入图片描述

    而后开始disk image的构建

    在这里插入图片描述

    在这里,可以将vnc地址复制,利用 vnc-viewer观察构建过程,这个过程时间比较长(没有vnc-viewer的需要自己安装)

    教程为 vnc-viewer安装教程

    在这里插入图片描述

    在这里插入图片描述

    完成后如下图所示

    在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gem5是一个开源的计算机系统模拟器,它可以模拟并运行不同类型的处理器架构。gem5中的事件调度机制是实现并管理模拟系统中不同组件之间事件的触发和调度的关键机制。 gem5中的事件调度采用了事件驱动的方式。它通过时间戳以及事件的优先级来决定事件的顺序执行。在gem5中,每个模拟组件都可以产生和接收事件,并将其加入到全局的事件队列中,然后按照优先级和时间戳的顺序进行调度。 gem5中的事件调度采用了离散事件模拟(Discrete Event Simulation)的思想。当一个事件在某个时刻被触发时,gem5会将该事件加入事件队列中,并在之后的某个时刻执行该事件。执行事件的顺序是根据事件的时间戳和优先级进行调度的,时间戳较早且优先级较高的事件将被优先执行。 在事件调度的过程中,gem5会根据事件所属的组件类型,并按照一定的策略将事件派发给对应的模拟组件进行处理。每个模拟组件都有一个事件处理函数,当该组件需要处理事件时,gem5会调用该组件的事件处理函数,并根据事件的类型和参数进行相应的处理。 总的来说,gem5的事件调度机制是通过事件队列、时间戳和优先级来实现的。它能够确保模拟系统中的事件按照一定的顺序被触发和执行,从而保证模拟系统的正确性和准确性。通过合理的事件调度机制,gem5能够模拟出真实系统中的各种行为和交互,提供一个高度可靠的计算机系统模拟环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值