欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

QEMU模拟器下编译运行基于RISCV指令集的linux操作系统

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