基本原理:
在物理服务器Ubuntu14.04上安装qemu模拟器,模拟器中运行基于riscv指令集编译的linux镜像文件。
用到的工具包括:
riscv-qemu(模拟器,可以模拟运行riscv指令集的程序或镜像)
riscv-tools(基于riscv指令集的交叉编译工具)
riscv-pk(用于包装内核文件vmlinux)
busybox(用于给linux镜像安装基本命令,如ls,cat,mv等等)
以上工具安装路径在我们的物理服务器里分别为:

一、安装toolchain

1.下载交叉编译工具:
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等命令,代表运行成功

qemu模拟器下编译运行基于riscv指令集的Linux操作系统的更多相关文章

  1. linux下编译运行驱动

    linux下编译运行驱动 嵌入式linux下设备驱动的运行和linux x86 pc下运行设备驱动是类似的,由于手头没有嵌入式linux设备,先在vmware上的linux上学习驱动开发. 按照如下方 ...

  2. linux下编译运行TIGL Viewer步骤

    linux下编译运行TIGL Viewer步骤(仅为了正确编译安装的话直接跳到步骤3) 1. linux发行版选择:由于linux发行版众多,不同版本包含的库版本可能存在差别,因此需要选择正确的版本. ...

  3. Linux程序在Windows下编译运行_MinGW和Cygwin

    linux要在windows下编译运行,需要win下的gcc编译器,一般有两种:MinGW和Cygwin. 但某些函数在windows没有,即使使用两种工具也编译不过,需要查询windows函数并使用 ...

  4. 在linux环境下编译运行OpenCV程序的两种方法

    原来以为在Ubuntu下安装好了OpenCV之后,自己写个简单的程序应该很容易吧,但是呢,就是为了编译一个简单的显示图片的程序我都快被弄崩溃了. 在谷歌和上StackOverFlow查看相关问题解答之 ...

  5. 如何在命令提示符下编译运行含有Package的java文件

    这篇是大二自学Java的时候记下的笔记,中午回顾印象笔记的时候意外看到了这篇.看到多年前写下的文字,我想起那时候我对Java的懵懵懂懂,每天晚上在图书馆照着书写书上的示例代码,为一个中文分号绞尽脑汁, ...

  6. fedora下编译运行java傻瓜入门级教程

    操作步骤: 编译运行环境的搭建 fedora下默认安装为GNU公司的JDK,如下所示 $java -version java version "1.7.0_25" OpenJDK ...

  7. CMD下编译运行Java程序

    准备1:JDK下好了 准备2:环境变量配置好了 准备3:本次测试用的是JDK8,用JDK10的在Eclipse里面好像用不了 满足上面三个条件,那可以继续看下去了 Test_1:带包编译运行 代码: ...

  8. linux下编译运行C程序

    GCC是Linux操作系统下一个非常重要的源代码编译工具,有着许多重要的选项,支持许多不同语言的编译,如C.C++.Ada.Fortran.Objective.Perl.Python.Ruby以及Ja ...

  9. xv6 + Qemu 在Ubuntu下编译运行教程【转】

    转自:https://blog.csdn.net/yinglang19941010/article/details/49310111 如果想要离线看教程,可以下载该 文档 一.使用工具说明 1.    ...

随机推荐

  1. 启动tornado项目,hello world

    新建一个env虚拟环境 mkvirtualenv toenv 在虚拟环境中安装tornado workon toenv pip install tornado 在D盘中新建tornado项目文件夹,就 ...

  2. Redis3.0集群

    Redis集群介绍 Redis 集群是一个提供在多个Redis间节点间共享数据的程序集. Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性 ...

  3. 1028:Ignatius and the Princess III

    本题应该有两种方法: 1.母函数法 2.递推法 母函数不了解,待充分了解之后,再进行补充! 这里为递推实现的方法: 思路: 定义:n为要拆分的整数: k为拆分的项数: f[n][k]代表 n的整数拆分 ...

  4. centOS上安装MySQL5.7

    在centos上安装mysql,前提得有sudo的权限.没有的话先去跟管理员申请一个. STEP 1 - 安装MySQL 首先打开浏览器访问下 https://dev.mysql.com/downlo ...

  5. PHP连接不上MySQL解决方案总结

    1. 获取当前 mysql.default_socket.mysqli.default_socket.pdo_mysql.default_socket 配置信息 建立一个 PHP 文件, 显示 php ...

  6. bzoj 4570: [Scoi2016]妖怪 凸包

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4570 题解 我们知道如果一个怪物要取到攻击力的最大值,那么一定是把防御力都转化了 所以我 ...

  7. LOJ 6485 LJJ 学二项式定理——单位根反演

    题目:https://loj.ac/problem/6485 \( \sum\limits_{k=0}^{3}\sum\limits_{i=0}^{n}C_{n}^{i}s^{i}a_{k}[4|(i ...

  8. oracle undo表空间大小修改

    redhat:清空回收站 rm -rf  /home/登录用户名/.Trash 例子:rm -rf /home/.Trash-root df命令可以显示目前所有文件系统的可用空间及使用情形: 例子:d ...

  9. ExtJs 扩展类CheckColumn的使用(事件触发)

    [javascript] view plain copy print? 使用 Extjs 在进行数据库编程经常会遇到 checkbox 的问题(奇怪网上却没有此类文章不知道其他人是怎么解决的,在此贴上 ...

  10. cassandra多数据中心的配置

    cassandra默认建keyspace的时候,是需要制定拓扑策略的,小数据就直接用单数据中心的simpleStrategy了,网上资料都没具体提如何配置多数据中心,这里简单贴一下 cassandra ...