QEMU模拟器下编译运行基于RISCV指令集的linux操作系统
程序员文章站
2022-06-28 18:22:06
...
一.准备工作
使用的软件
(1)Oracle VM VirtuaBox
(2)Ubuntu19.04
使用工程文件的路径
(1)/home/u/riscv_pro
所有软件均安装在这个目录下
$mkdir /home/u/riscv_pro
$cd /home/u/riscv_pro
1.下载交叉编译工具toolchain源码
$ git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
2.下载qemu源码
$wget https://download.qemu.org/qemu-4.2.0-rc2.tar.xz
3.下载busybox源码
$wget http://busybox.net/downloads/busybox-1.26.2.tar.bz2
4.下载linux内核源码
$wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.85.tar.xz
5.下载riscv-pk包源码
$ git clone https://github.com/riscv/riscv-pk
二.安装toolchain
1.安装运行库
$ sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev
2.配置安装路径
$ mkdir riscv-gnu-toolchain-build
$ cd riscv-gnu-toolchain-build
$ ../riscv-gnu-toolchain/configure --prefix=/opt/riscv
3.编译
$ make linux
参考:
/data/shenjx/work/riscv-tools/riscv-gnu-toolchain/riscv-gcc/configure --target=riscv64-unknown-linux-gnu --prefix=/data/shenjx/riscv-toolchain --with-sysroot=/data/shenjx/riscv-toolchain/sysroot --with-system-zlib --enable-shared --enable-tls --enable-languages=c,c++,fortran --disable-libmudflap --disable-libssp --disable-libquadmath --disable-nls --disable-bootstrap --src=.././riscv-gcc --enable-checking=yes --disable-multilib --with-abi=lp64d --with-arch=rv64imafd
三.安装qemu
1.安装运行库
$ sudo apt-get install gcc libc6-dev pkg-config bridge-utils uml-utilities zlib1g-dev libglib2.0-dev autoconf automake libtool libsdl1.2-dev
2.配置qemu
$ tar -xvf qemu-4.2.0-rc2.tar.xz
$ mkdir qemu-4.2.0-rc2-build
$ cd qemu-4.2.0-rc2-build
$ ../qemu-4.2.0-rc2/configure --target-list=riscv64-linux-user,riscv64-softmmu
3.编译
$ make
四.安装busybox
1.配置busybox
$ tar -xvjf busybox-1.26.2.tar.bz2
$ cd busybox-1.26.2
$ make allnoconfig
$ sudo apt-get install libncurses5-dev
$ make menuconfig
2.编译
$ make -j4
3.安装
$ make install
4.创建initramfs文件系统目录
$ mkdir initramfs
$mkdir -p bin etc dev lib proc sbin sys tmp usr usr/bin usr/lib usr/sbin
$cp _install/* ./initramfs/ -a
$cd ./initramfs
$rm -f linuxrc
$cd ./etc
$touch inittab
Inittab文件中写入:
::sysinit:/bin/busybox mount -t proc proc /proc
::sysinit:/bin/busybox mount -t tmpfs tmpfs /tmp
::sysinit:/bin/busybox mount -o remount,rw /dev/htifblk0 /
::sysinit:/bin/busybox --install -s
/dev/console::sysinit:-/bin/ash
5.制作initrd
$cd ..
$ find . | cpio -H newc --quiet -o | gzip -9 > /home/u/riscv_pro/busybox-1.26.2/initramfs/initrd.gz
五.编译linux内核
1.配置linux内核
$ tar -xvf linux-4.19.85.tar.xz
$ cd linux-4.19.85
$ make ARCH=riscv defconfig
$ make ARCH=riscv menuconfig ( O=../build/ O选项指定kernel的编译目录 )
"General setup -> Initial RAM Filesystem..." (CONFIG_BLK_DEV_INITRD=y)
"General setup -> Initramfs source files ="/home/u/riscv_pro/busybox-1.26.2/initramfs/initrd.gz"(CONFIG_INITRAMFS_SRC=initramfs.txt)
添加debug:
在 kernel hacking->compile-time checks and compiler options 选项页,勾选第一个Compile the kernel with debug info
2.编译
$ make -j4 ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- vmlinux
3.readelf -S vmlinux 查看vmlinux的section ,如果有.debug字段说明vmlinux中带有debug
六.安装riscv-pk包装vmlinux
1.配置
$ mkdir riscv-pk-build
$ cd riscv-pk-build
$../riscv-pk/configure --prefix=$RISCV --with-payload=/home/u/riscv_pro/linux-4.19.85/vmlinux --host=riscv64-unknown-linux-gnu
2.编译
$ make bbl
七.qemu模拟运行镜像bbl
$/home/u/riscv_pro/qemu-4.2.0-rc2-build/riscv64-softmmu/qemu-system-riscv64 -nographic -machine virt -kernel /home/u/riscv_pro/riscv-pk-build/bbl -append "root=/dev/vda ro console=ttyS0" -drive file=/home/u/riscv_pro/busybox-1.26.2/busybox,format=raw,id=hd0 -device virtio-blk-device,drive=hd0
$sudo riscv-qemu/riscv64-softmmu/qemu-system-riscv64 -machine virt -kernel riscv-pk/build/bbl -append "console=ttyS0" -nographic -m 1024M
八.扩展
使用objcopy切割二进制文件,去掉无用的文件头elf部分
$riscv64-unknown-linux-gnu-objcopy -O binary -S bbl bbl_cp
输出二进制文件内容到txt文件中查看使用vim
$hexdump bbl_cp > bbl_cp.txt
反汇编
$riscv64-unknown-linux-gnu-objdump -d bbl bbl_asm.txt