Let up bring up a linux.part2 [十一]

之前的篇幅中我们已经将 Linux 内核 bringup 起来了,不知道大家有没有去尝试将根文件系统运行起来,今天我就带领大家完成这个事情,可以跟着下面的步骤一步步来完成:

在这里我们使用 busybox 构建 rootfs:

  1. 下载 busybox:
wget https://github.com/mirror/busybox/archive/refs/tags/1_35_0.tar.gz
  1. 解压并配置:
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig

这里需要使用静态编译获取 busybox,这样一来我们就不需要拷贝各种动态库了:

Busybox Settings ---> Build Options ---> Build BusyBox as a static binary (no shared libs) ---> yes  
  1. 编译 busybox:
make
make install
  1. 添加 init 和其他文件夹:
mkdir dev proc mnt sys tmp root
mkdir etc && mkdir etc/init.d

在rootfs下,新建init,添加:
#!/bin/sh
# devtmpfs does not get automounted for initramfs
echo "------>  I am a VM on X-Hyper <------"
/bin/mount -t devtmpfs devtmpfs /dev
exec 0</dev/console
exec 1>/dev/console
exec 2>/dev/console
exec /sbin/init "$@"
然后执行:chmod +x init
  1. 创建/etc/init.d/rcS:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH runlevel
/bin/hostname megvii
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
然后:chmod +x etc/init.d/rcS
  1. 创建/etc/fstab:
proc    /proc   proc    defaults 0 0
tmpfs   /tmp    tmpfs   defaults 0 0
sysfs   /sys    sysfs   defaults 0 0
tmpfs   /dev    tmpfs   defaults 0 0
  1. 创建/etc/inittab:
#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
  1. 创建/etc/profile:
USER="`id -un`"                                                                
LOGNAME=$USER
HOSTNAME=`/bin/hostname`
HOME=/root
PS1="[$USER@$HOSTNAME \W]\# "
PATH=$PATH
export USER LOGNAME HOSTNAME HOME PS1 PATH PATH LD_LIBRARY_PATH
  1. 打包:
find ./* | cpio -H newc -o > rootfs.cpio
gzip rootfs.cpio
  1. 将 rootfs.cpio.gz 转换为.o,为了后续使用 ld 将其打包进 X-Hyper.elf 做准备:
aarch64-linux-gnu-ld -r -b binary rootfs.cpio -o rootfs.cpio.o

上述过程我们已经将 rootfs 准备好了,那么 Linux 如何加载这个 rootfs 呢,我们使用设备树 Chosen 来指定 initrd 的起始地址和结束地址:

由于 Linux 的启动需要足够的内存,所以我们在 X-Hyper 中我们已经将物理内存扩展到 256M,然后在 chosen 中指定 initrd 的信息:

    chosen {
        stdout-path = "/pl011@9000000";
        linux,initrd-start = <0x0 0x84000000>;
        linux,initrd-end = <0x0 0x85000000>;
    };

同时在 X-Hyper 中我们需要将 rootfs 的内容拷贝到上述指定的 IPA 对应的物理内存中(注意这里是 IPA 哦):

  1. 我们首先在 vm_config 中指定 rootfs 的地址,这里的地址要和设备树中的信息一致:
    vm_config_t guest_vm_cfg = {
        .guest_image  = &guest_vm_image,
        .guest_dtb    = &guest_virt_dtb,
        .guest_initrd = &guest_rootfs,
        .entry_addr   = 0x80600000,
        .dtb_addr     = 0x80000000,  /* virt dtb ipa */
        .rootfs_addr  = 0x84000000,  /* rootfs ipa */
        .ram_size     = 0x8000000,   /* 128M */
        .ncpu         = 2,
    };
  1. 然后我们把 rootfs 的内容拷贝到这段 IPA 对应的物理内存中,由于这段 IPA 之前已经被映射了,所以直接拷贝就可以:
copy_to_ipa(pgt, vm_config->rootfs_addr, (char *)vm_config->guest_initrd->start_addr, vm_config->guest_initrd->image_size);

完成上述操作后,整个 IPA 地址空间如下所示(当然 IPA 还包括设备的地址,这里没有显示出来):

其实在 bringup 整个 Linux 和 rootfs 的过程中会遇到各种问题,我觉得大家可以不看上述内容,自己先去尝试一下,完成上述所有操作后,我们就可以将 Linux 虚拟机运行起来了:

我已经将 Image/image.o/rootfs.cpio/rootfs.cpio.o/virt.dts/virt.dtb 放到 linux 的文件夹下了。

项目构建:

  • clone 源代码到本地:git clone GitCode - 全球开发者的开源社区,开源代码托管平台;
  • 编译生成 u-boot 的 bin 文件:sh build_uboot.sh;
  • 编译虚拟机 Guest OS 镜像:cd ./guest; sh build_vm.sh;
  • 编译虚拟机管理器代码,生成虚拟机管理器镜像:sh run_build.sh;
  • 运行 qemu 并加载镜像:sh run_qemu.sh (直接运行);

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

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

相关文章

WEB开发: Node.js路由之由浅入深(一) - 全栈工程师入门

作为一个使用Node.js多年的开发者&#xff0c;我已经习惯于用Node.js写一些web应用来为工作服务&#xff0c;因为实现快速、部署简单、自定义强。今天我们一起来学习一个全栈工程师必备技能&#xff1a;web路由。&#xff08;观看此文的前提是默认你已经装好nonde.js了&#xf…

新书速览|循序渐进Node.js企业级开发实践

《循序渐进Node.js企业级开发实践》 1 本书内容 《循序渐进Node.js企业级开发实践》结合作者多年一线开发实践&#xff0c;系统地介绍了Node.js技术栈及其在企业级开发中的应用。全书共分5部分&#xff0c;第1部分基础知识&#xff08;第1&#xff5e;3章&#xff09;&#xf…

二代证信息读写器安卓身份证手持终端pda

HT530是一款可满足不同应用需求的多功能身份证核验手持机。Android 10操作系统&#xff0c;搭载高性能8核心2.0G主频处理器&#xff0c;5.5寸高清大屏&#xff0c;1300万摄像头&#xff1b;内存2G16G,4G64G可选。条码扫描&#xff08;扫描头可选&#xff09;、可离线采集、读取…

Redis的高可用之哨兵模式

Redis哨兵主要是解决Redis主从同步时主数据库宕机问题,使其能够自动进行故障恢复&#xff0c;提高Redis系统的高可用性。 1. 哨兵的作用&#xff1a; 监控&#xff1a;哨兵通过心跳机制监控主库和从库的存活性。 选主&#xff1a;当主库宕机时&#xff0c;哨兵会选举出一个领…

2024最新版python+pycharm安装与配置(mac和window都有讲)

PS&#xff1a;这篇是对于初学者的pythonpycharm配置教程 &#xff0c;配置完成后可以直接看我的python学习笔记来进行python全套学习目前正在持续更新。 目录 python以及pycharm的安装配置一、下载安装Python1、python环境检查2、系统环境检查3、python下载4、开始安装5、检查…

【css】基础(二)

本专栏内容为&#xff1a;前端专栏 记录学习前端&#xff0c;分为若干个子专栏&#xff0c;html js css vue等 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;css专栏 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &a…

OceanBase 的探索与实践

作者&#xff1a;来自 vivo 互联网数据库团队- Xu Shaohui 本文总结了目前我们遇到的痛点问题并通过 OceanBase 的技术方案解决了这些痛点问题&#xff0c;完整的描述了 OceanBase 的实施落地&#xff0c;通过迁移到 OceanBase 实践案例中遇到的问题与解决方案让大家能更好的了…

【开源免费】基于Vue和SpringBoot的服装生产管理系统(附论文)

博主说明&#xff1a;本文项目编号 T 066 &#xff0c;文末自助获取源码 \color{red}{T066&#xff0c;文末自助获取源码} T066&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

租赁小程序的优势与应用场景解析

内容概要 租赁小程序&#xff0c;听起来是不是很酷&#xff1f;其实&#xff0c;它就是一个让你可以方便地租借各种高成本但用得不频繁的商品的平台。想象一下&#xff0c;当你需要租一件派对用的华丽小礼服&#xff0c;或是想体验一下超酷的运动器材&#xff0c;租赁小程序就…

MySQL 权限管理分配详解

MySQL 权限管理分配详解 MySQL权限系统的工作原理权限表的存取用户通过权限认证、进行权限分配的流程账号管理我们常用的授权all privileges到底有哪些权限呢&#xff1f;以及带来的安全隐患有哪些&#xff1f;创建账户的时候最好分配指定的权限&#xff0c;这样子安全也高管理…

使用C#开发VTK笔记(一)-VTK开发环境搭建

一.使用C#开发VTK的背景 因为C#开发的友好性,一直都比较习惯于从C#开发程序。而长期以来,都希望有一个稳定可靠的三位工程数模的开发演示平台,经过多次对比之后,感觉VTK和OpenCasCade这两个开源项目是比较好的,但它们都是用C++编写的,我用C#形式开发,只能找到发布的C#组…

React 组件中 State 的定义、使用及正确更新方式

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容React 组件中 State 的定义、使用及正确更新方式 前言 在 React 应用开发中&#xff0c;state …

长沙市的科技查新机构有哪些

中南大学图书馆科技查新站&#xff1a; 中南大学图书馆科技查新站成立于2003年12月&#xff0c;中南大学图书馆科技查新站作为教育部首批批准的科技查新工作站之一&#xff0c;具备了在全国范围内开展科技查新工作的专业资质。 长沙理工大学科技查新工作站&#xff1a; 长沙理…

数组 - 八皇后 - 困难

************* C topic: 面试题 08.12. 八皇后 - 力扣&#xff08;LeetCode&#xff09; ************* Good morning, gays, Fridary angin and try the hard to celebrate. Inspect the topic: This topic I can understand it in a second. And I do rethink a movie, …

IDEA的service窗口中启动类是灰色且容易消失

大家在学习Spring Cloud的过程中,随着项目的深入,会分出很多个微服务,当我们的服务数量大于等于三个的时候,IDEA会给我们的服务整理起来,类似于这样 但是当我们的微服务数量达到5个以上的时候,再启动服务的时候,服务的启动类就会变成灰色,而且还容易丢失 解决方法 我们按住…

threejs相机辅助对象cameraHelper

为指定相机创建一个辅助对象&#xff0c;显示这个相机的视锥。 想要在场景里面显示相机的视锥&#xff0c;需要创建两个相机。 举个例子&#xff0c;场景中有个相机A&#xff0c;想要显示相机A的视锥&#xff0c;那么需要一个相机B&#xff0c;把B放在A的后面&#xff0c;两个…

应用层协议/传输层协议(UDP)

目录 应用层 如何自定义应用层协议&#xff1f; 序列化方式 1.基于行文本的方式来传输 2.基于xml的方式 3.基于json的方式 4.yml的形式 5.protobuffer(pb)形式 传输层 端口号 协议 UDP 校验和 CRC TCP TCP/IP五层协议 应用层 -- 传输层 -- 网络层 -- 数据链路层…

cocotb value cocotb—基础语法对照篇

cocotb—基础语法对照篇 import cocotb from cocotb.triggers import Timer from adder_model import adder_model from cocotb.clock import Clock from cocotb.triggers import RisingEdge import randomcocotb.test() async def adder_basic_test(dut):"""Te…

【NoSQL数据库】Hbase基本操作——数据库表的增删改查

目录 一、Hbase原理 二、HBase数据库操作 三、遇到的问题和解决方法 一、Hbase原理 HBase的数据模型&#xff1a; 行键 时间戳 列族&#xff1a;contents 列族&#xff1a;anchor 列族&#xff1a;mime “com.cnn.www” T9 Achor:cnnsi.com”CNN” T8 Achor:…