ARM ubuntu配置OS实验环境

为什么要写此blog

SYSU-OS Lab本来是面向x86架构的,arm64架构的电脑会在配环境时遇到一系列架构兼容问题,譬如说我使用M1芯片的MacBook Pro,这里想提供一种解决方案,希望有所帮助

概述

首先我们要明白实验的目的:就是要在本地64位ubuntu系统上写一个32位x86的操作系统,然而在架构不同的机器上开发,需要交叉编译相关工具。教程中提供了从64位x86架构交叉编译到32位x86的一套工具,而用arm64ubuntu的同学可能会发现无法安装教程中所述工具,需要另外寻找一套arm64交叉编译到32位x86的工具

操作环境

内容 详细信息
PC MacBook Pro M1
VM Parallels Desktop破解版
OS ubuntu22.04 arm64

废话不多说,以下分别列举几个lab的一些配置解决方案,由于教程比较详细,这里只列出arm64下区分于原教程的操作,相同的操作就不赘述了。其他的问题,同学肯定能自己解决,在下才疏学浅不在此卖弄了

lab1

命令行复制粘贴快捷键不同于本地:command + shift + c/v
首先换源要换带ports的,在这,其实也可以不换,网络选共享模式跟主机一起,没什么网络问题

发现libc6-dev-i386、gcc-multilib、g++-multilib三项(交叉编译器和库)无法安装
下面这个指令可以寻找当前ubuntu系统能下载什么

apt search libc6-dev-i386

或者直接访问 官网
可以找到对应版本

$ sudo apt install libc6-dev-i386-cross   
$ sudo apt install gcc-multilib-i686-linux-gnu   
$ sudo apt install g++-multilib-i686-linux-gnu  

make i386_defconfig指令无法正常运行
在~/.bashrc里加入两句修改环境变量,且置于此文件中每次打开新的终端自动执行,具体指令如下

$ sudo gedit ~/.bashrc  
$ source ~/.bashrc  

用gedit编辑器打开文件后键入以下内容并保存

export ARCH=x86  
export CROSS_COMPILE=i686-linux-gnu-  

不过有种更优雅一点就是,直接在makefile里加这两个宏
另外,上面虽然装了qemu,但是没有qemu-system-i386,可以运行 sudo apt install qemu-system-x86

gdb这个debug工具也要安装对应版本

$ sudo apt install gdb-multiarch

指令变化

至此我们初步完成了lab1软件安装,我们安装的版本不同,指令也稍有变化
如原指令为

$ gcc -o helloworld -m32 -static helloworld.c

改为

$ i686-linux-gnu-gcc -o helloworld -m32 -static helloworld.c

其他以此类推,这在后期主要反映在makefile的修改中,因为makefile的作用就是:让一个指令能执行一堆指定的指令,这个后面还会再说
另外,其实这个编译linux内核和busybox这一步不弄也不怎么影响后面其它的实验

lab2

生成符号表时用到ld,这个也需要对应交叉编译版本

$ sudo apt install binutils-i686-linux-gnu

这里面有链接器(ld)、汇编器(as)、反汇编器(objdump)等

于是可以运行指令做符号表相关操作

$ /usr/bin/i686-linux-gnu-ld -o mbr.symbol -melf_i386 -N mbr.o -Ttext 0x7c00

指令过于冗长可以设置,以后在用到ld的地方用i686-ld替代即可(也可以不搞)

$ sudo ln -s /usr/bin/i686-linux-gnu-ld /usr/bin/i686-ld

关于makefile如lab1所说,相关指令都要修改,包括build的ld和debug最后一句的gdb

在/assignment这个任务,他不是在qemu-system-i386创建虚拟机运行的,而是直接运行一个可执行文件,故需要一些配置,不然编译完无法运行
而用qumu-static可以运行,以下展示详细操作

如果按照教程直接来的话发现就算空着不写,都执行不了,正常来说应该可以输出test fail
uname -mpio看本机架构
objdump -a ./test看可执行文件架构
发现二者架构不兼容

在之前各种交叉编译器下好的前提下
下载qemu-i386-static

$ sudo apt install qemu-user-static

在/usr/bin应该可以看到qemu-i386-static
qemu-i386-static ./test运行可执行文件
出现报错说找不到lib/ld-linux的动态库

qemu-i386-static --help

看到默认寻找动态库路径是QEMU_LD_PREFIX = /etc/qemu-binfmt/i386
然而我们的动态库因为下载的是i686相关的所以在/usr/i686-linux-gnu下,因此通过如下指令建立二者的联系
sudo ln -nsf /usr/i686-linux-gnu /etc/qemu-binfmt/i386
如果没有相关文件夹就创建 sudo mkdir -p /etc/qemu-binfmt/i386
qemu-i386-static ./test应该就能跑出test fail
后来我再试貌似有点问题,这样操作变成/etc/qemu-binfmt/i386/i686-linux-gnu里有lib了,路径还是不对,如果有这种情况就

$ cd /etc/qemu-binfmt/i386  
$ sudo cp -r /usr/i686-linux-gnu/* .

丑陋解决hhh

展示一份assignment的makefile,后面实验用到的makefile修改思路相同

TARTGET = test

AS = nasm
CXX = g++

ASM_FILE = $(wildcard *.asm)
CXX_FILE = $(wildcard *.cpp)

ALL_OBJ += $(ASM_FILE:%.asm=%.o)
ALL_OBJ += $(CXX_FILE:%.cpp=%.o)

run:
 @rm -rf *.o
 @nasm -f elf32 $(ASM_FILE)
 @i686-linux-gnu-g++ -m32 -g -c $(CXX_FILE)
 @i686-linux-gnu-g++ -m32 -o $(TARTGET) $(ALL_OBJ)
 @qemu-i386-static ./$(TARTGET)
clean:
 @rm -rf *.o

lab3就顺着以上思路即可

lab4

makefile出现了新的指令objcopy这个其实从属于gcc-multilib工具包已经安装过
故把objcopy改成i686-linux-gnu-objcopy即可

后面的实验思路相同,不做赘述了

其它

VSCode安装与配置
或者本机VScode用ssh插件链接到虚拟机,开发比较高效

总结

用到的软件

1.操作系统Ubuntu(64位);
2.Windows主机虚拟化软件Virtualbox;
3.代码编辑环境:Vscode+nasm+C/C++插件;
4.汇编编译器:nasm (32位汇编);
5. C/C++编译器:gcc/g++ (64位);
6.装载工具ld(64位);
7. ELF分析工具:readelf;
8. 反汇编:objdump;
9. 调试工具:gdb;
10. 写磁盘文件工具:dd
11. Make工具:cmake;
12. 运行工具:qemu(32位)

这些基本上都找到了对应交叉版本,同学可以畅享OS的实验,无需被配环境烦扰了

posted on 2024-06-03 14:39  foreeest  阅读(130)  评论(0)    收藏  举报