当前位置: 首页 > news >正文

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 (直接运行);

相关文章:

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

之前的篇幅中我们已经将 Linux 内核 bringup 起来了&#xff0c;不知道大家有没有去尝试将根文件系统运行起来&#xff0c;今天我就带领大家完成这个事情&#xff0c;可以跟着下面的步骤一步步来完成&#xff1a; 在这里我们使用 busybox 构建 rootfs&#xff1a; 下载 busyb…...

调用大模型api 批量处理图像 保存到excel

最近需要调用大模型&#xff0c;并将结果保存到excel中&#xff0c;效果如下&#xff1a; 代码&#xff1a; import base64 from zhipuai import ZhipuAI import os import pandas as pd from openpyxl import Workbook from openpyxl.drawing.image import Image from io i…...

使用 Flownex 模拟热环境对原油运输的影响

石油和天然气行业经常使用管道仿真来模拟原油的流动。为了准确估计管道容量&#xff0c;必须考虑环境对管道的热影响以及环境温度如何影响油品特性。本博客介绍了如何通过将传热元件集成到管道流网中&#xff0c;以及使用新的工作液材料 Flownex 来模拟各种传热机制。 使用 Fl…...

【WRF-Urban】WPS中有关Urban的变量设置

【WRF-Urban】WPS中有关Urban的变量设置 地理数据源的配置WRF-Urban所需静态地理数据1、LANDUSE:包含城市地表分类的土地利用数据。2、URB_PARAM:城市参数数据集。3、FRC_URB2D:城市覆盖度数据集WRF默认设置(美国)数据集1-National urban dataset in China NUDC(中国)数…...

Socket编程-tcp

1. 前言 在tcp套接字编程这里&#xff0c;我们将完成两份代码&#xff0c;一份是基于tcp实现普通的对话&#xff0c;另一份加上业务&#xff0c;client输入要执行的命令&#xff0c;server将执行结果返回给client 2. tcp_echo_server 与udp类似&#xff0c;前两步&#xff1…...

Redis 之持久化

目录 介绍 RDB RDB生成方式 自动触发 手动触发 AOF&#xff08;append-only file&#xff09; Redis 4.0 混合持久化 Redis主从工作原理 总结 介绍 Redis提供了两个持久化数据的能力&#xff0c;RDB Snapshot 和 AOF&#xff08;Append Only FIle&#xff09;…...

视频监控汇聚平台:Liveweb安防监控平台实现接入监控视频集中管理方案

随着各行业数字化转型的不断推进&#xff0c;视频监控技术在行业内的安防应用及管理支撑日益增多。然而&#xff0c;由于前期规划不清晰、管理不到位等问题&#xff0c;视频监管系统普遍存在以下问题&#xff1a; 1. 各部门单位在视频平台建设中以所属领域为单位&#xff0c;导…...

ABAP - 系统集成之SAP的数据同步到OA(泛微E9)服务器数据库

需求背景 项目经理说每次OA下单都需要调用一次SAP的接口获取数据&#xff0c;导致效率太慢了&#xff0c;能否把SAP的数据保存到OA的数据库表里&#xff0c;这样OA可以直接从数据库表里获取数据效率快很多。思来想去&#xff0c;提供了两个方案。 在集群SAP节点下增加一个SQL S…...

uniapp使用ucharts修改Y、X轴标题超出换行

找到ucharts里面的u-charts.js。 Y轴的话找到drawYAxis方法。然后找到方法里面绘制文字的context.fillText方法。先把这个代码注释掉&#xff0c;然后加上下面代码 let labelLines item.split(\n); let currentY pos yAxisFontSize / 2 - 3 * opts.pix; labelLines.forEac…...

三分钟详细解读什么是Ecovadis认证?

Ecovadis认证&#xff0c;这一源自法国的全球性企业可持续性评估体系&#xff0c;宛如一面明镜&#xff0c;映照出企业在环境、社会和治理&#xff08;ESG&#xff09;领域的真实面貌。它不仅仅是一项简单的认证&#xff0c;更是一个推动全球企业和供应链向更加绿色、公正、透明…...

spring6:4、原理-手写IoC

目录 4、原理-手写IoC4.1、回顾Java反射4.2、实现Spring的IoC 4、原理-手写IoC 我们都知道&#xff0c;Spring框架的IOC是基于Java反射机制实现的&#xff0c;下面我们先回顾一下java反射。 4.1、回顾Java反射 Java反射机制是在运行状态中&#xff0c;对于任意一个类&#x…...

爬取的数据能实时更新吗?

在当今数字化时代&#xff0c;实时数据更新对于企业和个人都至关重要。无论是市场分析、商品类目监控还是其他需要实时数据的应用场景&#xff0c;爬虫技术都能提供有效的解决方案。本文将探讨如何利用PHP爬虫实现数据的实时更新&#xff0c;并提供相应的代码示例。 1. 实时数…...

Linux 下使用飞鸽传书实现与Windows飞秋的通信

最近把单位的办公电脑换成Linux系统&#xff0c;但是其他同事们都使用飞秋2013进行局域网通信和文件传输&#xff0c;经过一番尝试&#xff0c;发现飞鸽传书For Linux 2014能够实现两者的互相通信。 飞鸽传书ForLINUXLinux版下载_飞鸽传书ForLINUX免费下载_飞鸽传书ForLINUX1.2…...

MongoDB分片集群搭建及扩容

分片集群搭建及扩容 整体架构 环境准备 3台Linux虚拟机&#xff0c;准备MongoDB环境&#xff0c;配置环境变量。一定要版本一致&#xff08;重点&#xff09;&#xff0c;当前使用 version4.4.9 配置域名解析 在3台虚拟机上执行以下命令&#xff0c;注意替换实际 IP 地址 e…...

qt QSettings详解

1、概述 QSettings是Qt框架中用于应用程序配置和持久化数据的一个类。它提供了一种便捷的方式来存储和读取应用程序的设置&#xff0c;如窗口大小、位置、用户偏好等。QSettings支持多种存储格式&#xff0c;包括INI文件、Windows注册表&#xff08;仅限Windows平台&#xff0…...

【Linux】ubuntu下一键配置vim

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;Linux &#x1f339;往期回顾&#x1f339;&#xff1a;Linux权限&#xff08;超详细彻底搞懂Linux的权限&#xff09; &#x1f516;流水不争&#xff0c;争的是滔滔…...

【NLP 9、实践 ① 五维随机向量交叉熵多分类】

目录 五维向量交叉熵多分类 规律&#xff1a; 实现&#xff1a; 1.设计模型 2.生成数据集 3.模型测试 4.模型训练 5.对训练的模型进行验证 调用模型 你的平静&#xff0c;是你最强的力量 —— 24.12.6 五维向量交叉熵多分类 规律&#xff1a; x是一个五维(索引)向量&#xff…...

信息系统安全防护攻防对抗式实验教学解决方案

一、引言 在网络和信息技术迅猛发展的今天&#xff0c;信息系统已成为社会各领域的关键基础设施&#xff0c;它支撑着电子政务、电子商务、科学研究、能源、交通和社会保障等多个方面。然而&#xff0c;信息系统也面临着日益严峻的网络安全威胁&#xff0c;网络攻击手段层出不…...

【笔记2-4】ESP32:freertos任务创建

主要参考b站宸芯IOT老师的视频&#xff0c;记录自己的笔记&#xff0c;老师讲的主要是linux环境&#xff0c;但配置过程实在太多问题&#xff0c;就直接用windows环境了&#xff0c;老师也有讲一些windows的操作&#xff0c;只要代码会写&#xff0c;操作都还好&#xff0c;开发…...

2024年12月6日Github流行趋势

项目名称&#xff1a;lobe-chat 项目维护者&#xff1a;arvinxx, semantic-release-bot, canisminor1990, lobehubbot, renovate项目介绍&#xff1a;一个开源的现代化设计的人工智能聊天框架。支持多AI供应商&#xff08;OpenAI / Claude 3 / Gemini / Ollama / Qwen / DeepSe…...

mT5中文-base零样本增强模型效果展示:客服对话意图泛化与槽位值增强案例

mT5中文-base零样本增强模型效果展示&#xff1a;客服对话意图泛化与槽位值增强案例 1. 模型能力概览 mT5中文-base零样本增强模型是一个专门针对中文文本增强优化的AI模型。它在原有mT5模型基础上&#xff0c;使用了大量中文数据进行深度训练&#xff0c;并引入了创新的零样…...

OpenRocket实战手册:从零到精通的火箭设计与仿真完全攻略

OpenRocket实战手册&#xff1a;从零到精通的火箭设计与仿真完全攻略 【免费下载链接】openrocket Model-rocketry aerodynamics and trajectory simulation software 项目地址: https://gitcode.com/GitHub_Trending/op/openrocket 你是否曾经梦想过设计自己的火箭&…...

qmc-decoder:快速解锁QQ音乐加密文件的终极指南

qmc-decoder&#xff1a;快速解锁QQ音乐加密文件的终极指南 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾经从QQ音乐下载了心爱的歌曲&#xff0c;却发现只能在特…...

DLSS Swapper:轻松管理游戏超采样版本,释放显卡全部性能

DLSS Swapper&#xff1a;轻松管理游戏超采样版本&#xff0c;释放显卡全部性能 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 在追求极致游戏体验的今天&#xff0c;DLSS&#xff08;深度学习超采样&#xff09;技术…...

BERT 模型:自然语言处理的新篇章

BERT模型&#xff1a;自然语言处理的新篇章 在人工智能领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;一直是研究的热点之一。2018年&#xff0c;谷歌推出的BERT模型彻底改变了NLP的发展方向&#xff0c;成为该领域的重要里程碑。BERT&#xff08;Bidirectional En…...

Ryzen平台硬件调试终极指南:从问题诊断到系统优化的实战路径

Ryzen平台硬件调试终极指南&#xff1a;从问题诊断到系统优化的实战路径 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: http…...

PDF-Parser-1.0零售业应用:促销海报信息提取

PDF-Parser-1.0零售业应用&#xff1a;促销海报信息提取 1. 引言 零售行业的促销活动总是让人又爱又恨。爱的是能带来销量增长&#xff0c;恨的是每次活动都要处理海量的促销海报——设计、印刷、分发&#xff0c;最后还要手动录入成千上万的商品信息、价格数据和活动规则。一…...

数据救援3大维度全解析:开源工具TestDisk PhotoRec实战指南

数据救援3大维度全解析&#xff1a;开源工具TestDisk & PhotoRec实战指南 【免费下载链接】testdisk TestDisk & PhotoRec 项目地址: https://gitcode.com/gh_mirrors/te/testdisk 硬盘数据恢复是每个技术人员都可能面临的挑战&#xff0c;当遭遇分区损坏、文件…...

实战指南:用快马平台生成团队统一的homebrew环境配置脚本,保障协作无忧

最近在团队协作中遇到了一个头疼的问题&#xff1a;新成员加入时&#xff0c;光是搭建开发环境就要折腾一整天。不同成员的电脑上软件版本参差不齐&#xff0c;导致"在我机器上能跑"的经典问题频繁出现。经过一番摸索&#xff0c;我发现用homebrew配合bash脚本可以完…...

从nvidia-smi到npu-smi:给CUDA开发者的华为昇腾NPU监控指南

从nvidia-smi到npu-smi&#xff1a;CUDA开发者快速掌握昇腾NPU监控的实战手册 当你的技术栈从英伟达GPU扩展到华为昇腾NPU时&#xff0c;监控工具的使用体验就像从自动挡切换到手动挡——虽然最终目的地相同&#xff0c;但操作逻辑需要重新适应。作为曾经每天与nvidia-smi打交道…...