从零(并不是)开始的ARMv8操作系统内核实践 1(环境配置)

首先,我们需要一个Linux环境(在这里是Ubuntu 20.04),一个编译器,一个模拟器QEMU(毕竟直接调试芯片运行非常困难不是),一个支持ARMv8架构的GDB调试器.

我们会使用一个Docker配置环境,我会贴出来一个Dockerfile,但是还是希望有兴趣的同学可以听我唠叨一下环境配置过程.因为Docker内部默认就是root账户,所以如果你还是想在普通Ubuntu系统上配置的话,有的命令可能提示权限不足,用sudo就好,比如我这里是 apt install <软件名> ,你就要输入sudo apt install <软件名>

配置包管理环境,将软件源替换为国内的源

首先是配置包管理环境,我们要设置代理,将ubuntu的代码源切换为清华源(当然淘宝,中科大源等等都可以),虽然我有代理,但是尽量还是不给GFW添乱是吧 😛

cp /etc/apt/sources.list /etc/apt/sources.list.bak #备份原有sources.list文件
sed -i "s/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g" /etc/apt/sources.list
apt update
apt upgrade -y

这条命令会将/etc/apt/soures.list中的"archive.ubuntu.com"字样全部替换为"mirrors.tuna.tsinghua.edu.cn"

注意:在Docker环境中,如果直接将换源,会导致apt update时报告证书错误,要在换源前运行命令"apt-get update && apt-get install -y ca-certificates"安装根证书才可以.

安装gcc/g++编译器

我们需要安装普通的gcc编译环境,用来编译我们一会需要的gdb和qemu,以及一个交叉编译器,用来编译运行在ARMv8上代码

apt install -y autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev \
              gawk build-essential bison flex texinfo gperf libtool patchutils bc \
              zlib1g-dev libexpat-dev pkg-config  libglib2.0-dev libpixman-1-dev git tmux python3 \
              wget curl vim strace python3-dev ninja-build
apt install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

另外多说一句,如果不太清楚自己想装的软件的具体名字,可以使用 apt search <软件名>命令

编译安装QEMU以及GDB

首先,我希望使用pwndbg,通过这个在调试汇编的时候会很方便,但这就存在一些问题. 如果使用apt install qemu,那么装上的qemu的版本是4.2.0,它不兼容pwndbg,需要一个更新版本的qemu,所以索性自己编译就好.

其次,我需要一个支持ARMv8的gdb,并且最好不要是gdb-multiarch.比如如果我突然想用rust-gdb,这个软件是默认加载gdb的,不会主动使用gdb-multiarch,那么,当你使用rust-gdb时,还是没办法调试arm架构

那么,我们先来搞定qemu

sed -Ei 's/^# deb-src /deb-src /' /etc/apt/sources.list # 启用sources.list中的源代码源,方便安装编译依赖
apt-get build-dep -y qemu # 自动安装编译Qemu需要的依赖
wget https://download.qemu.org/qemu-6.0.1.tar.xz #下载源代码
tar xf qemu-6.0.1.tar.xz 
cd qemu-6.0.1
mkdir build 
cd build
# 配置编译选项,要求支持aarch64以及riscv64架构,支持调试
../configure --target-list=aarch64-softmmu,riscv64-softmmu,aarch64-linux-user,riscv64-linux-user --enable-debug
make -j$(nproc) #使用所有CPU核心并行编译,提高速度
make install

然后是GDB

apt install python3-dev # 如果希望gdb有python3的支持(pwndbg需要),那么就需要这个包
wget https://ftp.gnu.org/gnu/gdb/gdb-10.2.tar.xz
tar xf gdb-10.2.tar.xz
cd gdb-10.2
mkdir build
cd build
../configure --enable-targets=all --with-python=/usr/bin/python3
make -j$(nproc)
make install
# 接下来安装pwndbg
cd ~
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
./setup.sh

在gdb的编译选项中,如果设置"--enable-targets=all",那么编译出来的gdb就会支持所有架构,也就相当于在apt安装的gdb-multiarch,或者如果配置选项"--target=<架构>",这样支持不同平台的gdb的名字会不一样,比如打开支持risc-v平台的gdb,就需要输入riscv64-unknown-elf-gdb,怪麻烦的,所以让gdb默认支持所有平台就好

最后的Dockefile

FROM ubuntu:20.04
# LABEL maintainer = "RiversJin"
# 设置代理 这个按自己需要改
# ENV http_proxy=http://host.docker.internal:10100 
# ENV https_proxy=http://host.docker.internal:10100
ENV TZ=Asia/Shanghai DEBIAN_FRONTEND=noninteractive
WORKDIR /root
RUN apt-get update && apt-get install -y ca-certificates
RUN sed -i "s/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g" /etc/apt/sources.list 
RUN sed -Ei 's/^# deb-src /deb-src /' /etc/apt/sources.list
RUN apt-get update && apt-get upgrade -y && apt-get install -y git wget curl vim strace
RUN apt-get install -y autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev \
              gawk build-essential bison flex texinfo gperf libtool patchutils bc \
              zlib1g-dev libexpat-dev pkg-config  libglib2.0-dev libpixman-1-dev git tmux \
              python3 python3-dev ninja-build gcc-aarch64-linux-gnu gcc-riscv64-linux-gnu
RUN apt-get build-dep -y qemu
RUN wget https://download.qemu.org/qemu-6.0.1.tar.xz
RUN wget https://ftp.gnu.org/gnu/gdb/gdb-10.2.tar.xz
RUN tar xf qemu-6.0.1.tar.xz
RUN tar xf gdb-10.2.tar.xz
RUN cd qemu-6.0.1 && mkdir build && cd build \
    && ../configure --target-list=aarch64-softmmu,riscv64-softmmu,aarch64-linux-user,riscv64-linux-user --enable-debug\
    && make -j$(nproc) && make install
RUN cd gdb-10.2 && mkdir build && cd build \
    && ../configure --enable-targets=all --with-python=/usr/bin/python3 \
    && make -j$(nproc) && make install
RUN git clone https://github.com/pwndbg/pwndbg
RUN cd pwndbg && ./setup.sh
RUN rm -rf ~/qemu* ~/gdb* ~/pwndbg #清理一下文件,在编译安装后这些文件已经没用了

新建一个文件,命名为Dockefile,然后在这文件夹运行docker build -t my_develop_img .
等待一段时间,即可得到一个适合我们接下来开发的编译环境. 因为网络的问题或者一些奇奇怪怪的问题,这个Docker映像构建可能会失败,我稍后会上传一个构建好的镜像的

posted @ 2024-01-28 23:50  RiversJin  阅读(82)  评论(0)    收藏  举报