透过 QEMU 初步体验龙架构
Posted donaldsebleung
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了透过 QEMU 初步体验龙架构相关的知识,希望对你有一定的参考价值。
透过 QEMU 初步体验龙架构
发布日期:2022-09-17
QEMU、GCC 上游最近正式宣布支持龙架构,它是龙芯中科基于 MIPS 国产自主研发的指令集,也在某程度上受到 RISC-V 启发:
- QEMU 7.1.0+
- GCC 12.1.0+
据说上游 Linux 内核至 5.19 起也初步支持龙架构(源:LoongArch CPU Support Merged For Linux 5.19 - But It Won’t Work For A Booting System Yet - Phoronix),可是很遗憾,这初步支持并不足以在龙架构上启动一个完整的 Linux 系统。
这代表着您即便没有购买龙芯 SoC 也可以透过 QEMU 用户空间模拟器 有限度地体验龙架构,这也正是本文章的焦点。
先决条件
您必须熟悉 Linux 操作。本文章中的说明及命令适用于 Ubuntu 22.04。这并不代表您不能使用别的 Linux 发行版完成该文章所描述的操作,但您极有可能需要因应您的发行版调整您所输入的命令。本文章的作者将不会对您因误操作损坏系统承担任何责任。
为免对您日常使用的系统造成破坏,建议您在新建的 Ubuntu 22.04 虚拟机内进行相关操作。当然,如果您的操作系统不是 Linux(如 Windows、macOS)或您使用的 UOS 系统禁用了开发者模式,这或许是您唯一可行的选项。
事前准备
因为 QEMU、GCC 也是最近才正式支持龙架构,所以您并不能透过 Ubuntu 默认的仓库直接下载安装相应的软件包。因此,我们需要获取并自行编译最新稳定版本 QEMU、GCC 的源代码。
下载 QEMU、GCC 前,我们先建好一些目录:
$ mkdir -p $HOME/opt/qemu $HOME/opt/cross $HOME/src
把工作目录设置为 $HOME/src
:
$ pushd $HOME/src
我们将把 QEMU 安装在 $HOME/opt/qemu
下,GCC 在 $HOME/opt/cross
下,把源代码存放在 $HOME/src
下。当然,您也可以选择别的目录。
QEMU
参考文章:Hosts/Linux - QEMU、GCC Cross-Compiler - OSDev Wiki
截至 2022-09-17,最新的 QEMU 版本是 7.1.0,因此我们以 QEMU 7.1.0 为准。
更新仓库元数据:
$ sudo apt update
下载编译 QEMU 所需的依赖包:
$ sudo apt install -y build-essential \\
git \\
libglib2.0-dev \\
libfdt-dev \\
libpixman-1-dev \\
zlib1g-dev \\
ninja-build
从 QEMU 官方网站下载 7.1.0 版本源代码:
$ wget https://download.qemu.org/qemu-7.1.0.tar.xz
解压缩:
$ tar xvf qemu-7.1.0.tar.xz
创建一个编译用的新目录 build-qemu
:
$ mkdir build-qemu/
进去:
$ pushd build-qemu/
出口环境变量:
$ export PREFIX="$HOME/opt/qemu"
$ export TARGET_LIST="loongarch64-linux-user"
$ export PATH="$PREFIX/bin:$PATH"
配置 QEMU:
$ ../qemu-7.1.0/configure --prefix="$PREFIX" \\
--target-list="$TARGET_LIST" \\
--static
编译 QEMU:
$ make -j$(nproc)
安装 QEMU:
$ make install
现在来验证以下我们的安装:
$ which -- qemu-loongarch64 || \\
echo qemu-loongarch64 is not in the PATH
看到类似 /home/dsleung/opt/qemu/bin/qemu-loongarch64
的输出为成功。倘若看到 qemu-loongarch64 is not in the PATH
,那代表失败了,请自行修正、重新编译安装 QEMU 哦 ~
倘若以后需要再编译 QEMU,大可留下源代码,但需要清理 build 文档:
$ make clean
离开 build 目录:
$ popd
为了以后能直接调用 qemu-loongarch64
,把 PATH
写进 profile 内:
$ echo "export PATH=\\"\\$HOME/opt/qemu/bin:\\$PATH\\"" >> ~/.profile
$ source ~/.profile
GCC
参考文章:GCC Cross-Compiler - OSDev Wiki、How to Build a GCC Cross-Compiler
更新仓库元数据:
$ sudo apt update
下载编译 GCC、Binutils、Glibc、Linux 所需的依赖包:
$ sudo apt install -y build-essential \\
bison \\
flex \\
libgmp3-dev \\
libmpc-dev \\
libmpfr-dev \\
texinfo
从官方网站下载 GCC、Binutils、Glibc、Linux 最新版本源代码 - 截至 2022-09-17,最新 GCC 版本为 12.2.0、Binutils 版本为 2.39、Glibc 版本为 2.36、Linux 版本为 6.0-rc5:
$ wget https://ftp.gnu.org/gnu/gcc/gcc-12.2.0/gcc-12.2.0.tar.xz
$ wget https://ftp.gnu.org/gnu/binutils/binutils-2.39.tar.xz
$ wget https://ftp.gnu.org/gnu/libc/glibc-2.36.tar.xz
$ wget https://git.kernel.org/torvalds/t/linux-6.0-rc5.tar.gz
解压缩:
$ tar xvf gcc-12.2.0.tar.xz
$ tar xvf binutils-2.39.tar.xz
$ tar xvf glibc-2.36.tar.xz
$ tar xvf linux-6.0-rc5.tar.gz
出口环境变量:
$ export PREFIX="$HOME/opt/cross"
$ export TARGET="loongarch64-linux-gnu"
$ export PATH="$PREFIX/bin:$PATH"
1. 编译 Binutils
$ mkdir build-binutils/
$ pushd build-binutils/
$ ../binutils-2.39/configure --prefix="$PREFIX" \\
--target="$TARGET" \\
--disable-multilib
$ make -j$(nproc)
$ make install
$ make clean
$ popd
2. 编译 Linux 内核标头档
$ pushd linux-6.0-rc5/
$ make mrproper
$ make ARCH=loongarch INSTALL_HDR_PATH="$PREFIX/$TARGET" headers_install
$ popd
在安装 Linux 内核标头档前执行 make mrproper
能确保我们的 build 不会受遗留的 build 文档影响,相当于其他 Make 项目的 make clean
。
3. 编译 C/C++ 交叉编译器
$ mkdir -p build-gcc/
$ pushd build-gcc/
$ ../gcc-12.2.0/configure --prefix="$PREFIX" \\
--target="$TARGET" \\
--enable-languages=c,c++ \\
--disable-multilib
$ make -j$(nproc) all-gcc
$ make install-gcc
$ make clean
$ popd
4. 编译 Glibc 标头档及启动文档
$ mkdir -p build-glibc
$ pushd build-glibc/
$ ../glibc-2.36/configure --prefix="$PREFIX/$TARGET" \\
--build=$MACHTYPE \\
--host="$TARGET" \\
--target="$TARGET" \\
--with-headers="$PREFIX/$TARGET/include" \\
--disable-multilib \\
libc_cv_forced_unwind=yes
$ make install-bootstrap-headers=yes install-headers
$ make -j$(nproc) csu/subdir_lib
$ install csu/crt1.o csu/crti.o csu/crtn.o "$PREFIX/$TARGET/lib"
$ $TARGET-gcc -nostdlib \\
-nostartfiles \\
-shared \\
-x c /dev/null \\
-o "$PREFIX/$TARGET/lib/libc.so"
$ touch "$PREFIX/$TARGET/include/gnu/stubs.h"
$ popd
5. 编译支持函式库
$ pushd build-gcc/
$ make -j$(nproc) all-target-libgcc
$ make install-target-libgcc
$ make clean
$ popd
6. 编译 C 标准函式库
$ pushd build-glibc/
$ make -j$(nproc)
$ make install
$ popd
7. 编译 C++ 标准函式库
$ pushd build-gcc/
$ make -j$(nproc)
$ make install
$ make clean
$ popd
验证 GCC 安装
$ which -- $TARGET-gcc || \\
echo $TARGET-gcc is not in the PATH
把 $HOME/opt/cross/bin
加到 profile 的 PATH
:
$ echo "export PATH=\\"\\$HOME/opt/cross/bin:\\$PATH\\"" >> ~/.profile
$ source ~/.profile
要编译的都编译好了,可以离开 $HOME/src
:
$ popd
Hello LoongArch World!
打开您最喜爱的文字编辑器(本人的为 Vim),写个 C 程序,并保存为 hello.c
:
#include <stdio.h>
int main(void)
printf("Hello LoongArch World!\\n");
return 0;
使用交叉编译器编译:
$ loongarch64-linux-gnu-gcc -O2 --static hello.c -o hello
查看可执行文档 hello
的属性:
$ file hello
输出为:hello: ELF 64-bit LSB executable, LoongArch, version 1 (SYSV), statically linked, for GNU/Linux 5.19.0, with debug_info, not stripped
除非您电脑 CPU 架构为龙架构(当前绝大部分民用计算机为 x86_64
、ARM 架构),不然您不能直接运行该文档。幸好,我们能透过 qemu-loongarch64
间接运行该文档:
$ qemu-loongarch64 ./hello
输出为 Hello LoongArch World!
结语
上游 QEMU、GCC 对龙架构的支持尚处于早期阶段,龙架构本身也如此。当龙架构及它的生态逐渐成熟,安装龙架构模拟器及交叉编译器将会大为简化,如 sudo apt install -y qemu-user-loongarch64 loongarch64-linux-gnu-binutils loongarch64-linux-gnu-gcc
。
或许在不太久的将来,随着龙架构向民用计算机普及化,我们或许不用再透过交叉编译及模拟器体验龙架构,而是在日常使用的台式机及笔记本电脑上直接体验龙架构。但在这一天的到来之前,我们还是有许多的办法探索龙架构,即便因为各种原因无法直接购买相关硬件。
其实我这篇文章原本打算编译上游的 Linux 6.0-rc5 内核及 BusyBox 1.35.0,并运行在 QEMU 龙架构系统模拟器 上,但上游 Linux 内核对龙架构的支持似乎还不够成熟,不能直接运行在龙架构上。
本文章到此为止吧,下次希望能透过 QEMU 龙架构系统模拟器继续探索龙架构并分享一些龙架构入门内核编程的心得。
龙架构(LoongArch)平台已初步支持OpenHarmony操作系统
日前,在龙芯中科与润和软件共同努力下,OpenHarmony操作系统与龙芯2K0500开发板完成适配验证,龙架构(LoongArch)平台对于OpenHarmony已形成初步支持,万物互联的生态体系与龙芯平台即将全面连接。
OpenHarmony 是全球开发者共建的开源分布式操作系统,由开放原子开源基金会孵化及运营,国内众多厂商已基于其形成多个跨终端全领域的发行版操作系统。为推动龙架构芯片适配OpenHarmony系统,2022年4月,龙芯中科与润和软件、慧睿思通、龙芯俱乐部等发起成立OpenHarmony LoongArch SIG。
长期以来,润和软件作为OpenHarmony生态的核心共建单位和头部企业,在OpenHarmony南向生态构建中发挥了关键作用。其全场景智能物联操作系统HiHopeOS,已面向金融、教育、智慧城市等领域推出行业发行版,均通过OpenHarmony兼容性测评,助推多行业产品落地。
龙芯2K0500开发板
龙芯2K0500是一款基于64位LA264处理器核设计的高集成度处理器芯片,主要面向工控互联网应用、打印终端、BMC等应用场景,可实现ACPI、DVFS/DPM动态电源功耗管理等低功耗技术,支持多种电源级别和唤醒方式,并可根据具体应用场景对芯片部分功能和高速接口进行裁剪。
下一步,龙芯中科将与润和软件携手继续完成更多龙架构芯片与OpenHarmony的适配,共建基于龙架构平台的OpenHarmony国产自主生态及全栈式解决方案,推进产品化工作以及相关方案落地。同时,双方将就OpenHarmony产业人才教培展开深入合作,并会逐步将代码开源到OpenHarmony社区,为开源生态持续贡献力量。
当前,基于龙芯2K0500平台,多个龙芯生态伙伴已形成面向工业物联网关、国产化BMC、教育开发板、IDE编程工具、自主打印机等一系列解决方案。相信在OpenHarmony的支持下,龙芯中科与更多合作伙伴将进一步扩大国产自主生态丛林,形成信息产业命运共同体,推动万物智联领域创新发展。
以上是关于透过 QEMU 初步体验龙架构的主要内容,如果未能解决你的问题,请参考以下文章
龙架构(LoongArch)平台已初步支持OpenHarmony操作系统
龙架构(LoongArch)平台已初步支持OpenHarmony操作系统
重磅 | Linux内核5.19初步支持LoongArch架构
泰山OFFICE适配龙芯新架构(loongarch64)UOS初步完成