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的实验,无需被配环境烦扰了
浙公网安备 33010602011771号