基本原理:
在物理服務器Ubuntu14.04上安裝qemu模擬器,模擬器中運行基於riscv指令集編譯的linux鏡像文件。
用到的工具包括:
riscv-qemu(模擬器,可以模擬運行riscv指令集的程序或鏡像)
riscv-tools(基於riscv指令集的交叉編譯工具)
riscv-pk(用於包裝內核文件vmlinux)
busybox(用於給linux鏡像安裝基本命令,如ls,cat,mv等等)
以上工具安裝路徑在我們的物理服務器里分別為:


一、安裝toolchain
1.下載交叉編譯工具:
$ git clone --recursive https://github.com/riscv/riscv-gnu-toolchain


2.安裝運行庫
$ 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
3.配置安裝路徑
$ ./configure --prefix=/opt/riscv
4.編譯(linux版本)
$ make linux
5.驗證交叉編譯工具:
編譯hello.c到hello 注:要加上-static 靜態編譯選項
riscv64-unknown-linux-gnu-gcc -static hello.c -o hello

在x86環境下執行hello(x86下的gcc無法執行hello,因為格式為riscv)
./hello


無法執行不要緊,因為還沒有安裝qemu模擬器,我們繼續操作
二、安裝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.下載master分支的qemu
$ git clone https://github.com/riscv/riscv-qemu


$ cd riscv-qemu $ git submodule update --init pixman
3.配置qemu,riscv-64-linux-user為用戶模式,可以運行基於riscv指令集編譯的程序文件,softmmu為鏡像模擬器,可以運行基於riscv指令集編譯的linux鏡像,為了測試方便,這兩個我都安裝了
$ ./configure --target-list=riscv64-linux-user,riscv64-softmmu [--prefix=INSTALL_LOCATION]
4.編譯qemu
$ make
5.安裝qemu
$ [make install] # if you supplied prefix above
6.測試qemu用戶模式:
6.1使用交叉編譯器編譯一個helloword程序
$ riscv64-unknown-linux-gnu-gcc hello.c -o hello
6.2使用qemu的用戶模式運行riscv指令集的hello二進制文件
$ ./riscv64-linux-user/qemu-riscv64 -L $RISCV/sysroot hello


7.測試qemu鏡像模式:
啟動qemu,載入bbl示例鏡像文件,下載地址:bblvmlinuxinitramfs_dynamic
$ riscv-qemu/riscv64-softmmu/qemu-system-riscv64 -kernel /home/tank/bblvmlinuxinitramfs_dynamic -nographic
出現riscv圖案並且可以使用鏡像,代表qemu鏡像模擬器安裝正常。
三、安裝riscv-pk
1.下載對應分支的riscv-pk工具
$ git clone -b bigbuf https://github.com/riscv/riscv-pk


2.創建build目錄,用於存放鏡像bbl
$ cd riscv-pk
$ mkdir build $ cd build
3.配置交叉編譯工具路徑,$RICSV代表交叉工具的路徑 第一步中設置為了/opt/riscv
$ ../configure --prefix=$RISCV --host=riscv64-unknown-linux-gcc
4.編譯
$ make
5.安裝pk
$ make install
注:耗時較長,驗證pk工具的方法是用pk包裝鏡像文件vmlinux成bbl,qemu啟動bbl的時候出現如下圖案,代表pk工具沒有問題


四、安裝busybox
1.下載對應版本的busybox
$ curl -L http://busybox.net/downloads/busybox-1.26.2.tar.bz2 > busybox-1.26.2.tar.bz2
2.解壓縮文件
$ tar xvjf busybox-1.26.2.tar.bz2
$ cd busybox-1.26.2
3.清空其它所以配置(這樣可以自己添加需要的命令組件)
$ make allnoconfig
4.進入菜單頁面配置
$ sudo apt-get install libncurses5-dev
$ make menuconfig
下圖中這幾項為核心項,配置完成后只能使用ash init等幾個命令


如果想使用ls,cat等命令,參考配置鏈接https://wenku.baidu.com/view/5d25420602020740be1e9b0b.html
5.采用16線程的速度進行編譯
$ make -j16
編譯完成后會在busybox-1.26.2目錄下生成busybox二進制執行文件


6.測試busybox,使用qemu的鏡像模式載入busybox文件,啟動模擬器
$ ./riscv64-linux-user/qemu-riscv64 -L $RISCV/sysroot busybox ash
如果出現以下界面代表busybox安裝成功(即可以使用busybox的一些命令)


五、編譯linux內核
1.下載對應分支的內核
$ git clone -b fix-gcc-flags https://github.com/riscv/riscv-linux.git


$ cd linux-4.6.2
2.配置內核信息
$ make ARCH=riscv defconfig
3.在內核目錄下新建initramfs.txt文件,並保存以下內容
$ vi initramfs.txt


4.在內核目錄下新建inittab文件,並保存以下內容
$ vi inittab


5.進入菜單頁面配置
$ make ARCH=riscv menuconfig
注:更改下面兩個選項
"General setup -> Initial RAM Filesystem..." (CONFIG_BLK_DEV_INITRD=y)
"General setup -> Initramfs source files = initramfs.txt" (CONFIG_INITRAMFS_SRC=initramfs.txt)
6.編譯內核,生成vmlinux文件
$ make -j4 ARCH=riscv vmlinux
注:編譯完成在linux4-6.2文件夾下出現vmlinux


六、使用pk包裝vmlinux
1.進入pk工具的build目錄
$ cd /path/to/risv-tools/riscv-pk/build
$ rm -rf *
2.配置要編譯的內核文件以及使用的指令集路徑及名稱
$ ../configure --prefix=$RISCV --with-payload=/path/to/linux-4.6.2/vmlinux --host=riscv64-unknown-linux-gnu
3.包裝生成bbl鏡像文件
$ make bbl


七、qemu模擬運行鏡像bbl
$ riscv-qemu/riscv64-softmmu/qemu-system-riscv64 -kernel /home/tank/old3/riscv-pk/build/bbl -m 1024M -nographic
可以使用ls cat等命令,代表運行成功

