基本原理:
在物理服务器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镜像模式:
$ riscv-qemu/riscv64-softmmu/qemu-system-riscv64 -kernel /home/tank/bblvmlinuxinitramfs_dynamic -nographic
出现riscv图案并且可以使用镜像,代表qemu镜像模拟器安装正常。
三、安装riscv-pk
1.下载对应分支的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等几个命令
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.下载对应分支的内核
$ 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等命令,代表运行成功

- linux下编译运行驱动
linux下编译运行驱动 嵌入式linux下设备驱动的运行和linux x86 pc下运行设备驱动是类似的,由于手头没有嵌入式linux设备,先在vmware上的linux上学习驱动开发. 按照如下方 ...
- linux下编译运行TIGL Viewer步骤
linux下编译运行TIGL Viewer步骤(仅为了正确编译安装的话直接跳到步骤3) 1. linux发行版选择:由于linux发行版众多,不同版本包含的库版本可能存在差别,因此需要选择正确的版本. ...
- Linux程序在Windows下编译运行_MinGW和Cygwin
linux要在windows下编译运行,需要win下的gcc编译器,一般有两种:MinGW和Cygwin. 但某些函数在windows没有,即使使用两种工具也编译不过,需要查询windows函数并使用 ...
- 在linux环境下编译运行OpenCV程序的两种方法
原来以为在Ubuntu下安装好了OpenCV之后,自己写个简单的程序应该很容易吧,但是呢,就是为了编译一个简单的显示图片的程序我都快被弄崩溃了. 在谷歌和上StackOverFlow查看相关问题解答之 ...
- 如何在命令提示符下编译运行含有Package的java文件
这篇是大二自学Java的时候记下的笔记,中午回顾印象笔记的时候意外看到了这篇.看到多年前写下的文字,我想起那时候我对Java的懵懵懂懂,每天晚上在图书馆照着书写书上的示例代码,为一个中文分号绞尽脑汁, ...
- fedora下编译运行java傻瓜入门级教程
操作步骤: 编译运行环境的搭建 fedora下默认安装为GNU公司的JDK,如下所示 $java -version java version "1.7.0_25" OpenJDK ...
- CMD下编译运行Java程序
准备1:JDK下好了 准备2:环境变量配置好了 准备3:本次测试用的是JDK8,用JDK10的在Eclipse里面好像用不了 满足上面三个条件,那可以继续看下去了 Test_1:带包编译运行 代码: ...
- linux下编译运行C程序
GCC是Linux操作系统下一个非常重要的源代码编译工具,有着许多重要的选项,支持许多不同语言的编译,如C.C++.Ada.Fortran.Objective.Perl.Python.Ruby以及Ja ...
- xv6 + Qemu 在Ubuntu下编译运行教程【转】
转自:https://blog.csdn.net/yinglang19941010/article/details/49310111 如果想要离线看教程,可以下载该 文档 一.使用工具说明 1. ...
随机推荐
- Alpha阶段第1周Scrum立会报告+燃尽图 01
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2246 一.小组介绍 组长:刘莹莹 组员:朱珅莹 孙韦男 祝玮琦 王玉潘 ...
- web 开发 css 默认值列表
css默认值列表 HTML标签CSS属性默认值汇总 这个东西,在你需要还原默认值的时候,比较有用. 开始的时候 *{margin:0;padding:0;},当需要使用边距的时候,就需要还原HTML默 ...
- C#读写 AB PLC 直接通过节点来读写数据 读写 AllenBradley PLC
本文将使用一个Github开源的组件库技术来读写AB PLC,使用的是基于以太网的实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 官网:http:/ ...
- MDI窗体及涉及到的相关问题
MDI窗体是个什么东东尼?多文档窗体唠,相对的还有个SDI,就是单文档窗体.一般情况下我们会将软件的主窗体设置为MDI窗体.那么在主窗体的菜单部分调出来的其他窗体就是主窗体的子窗体了. (1)在主窗体 ...
- 一行能装逼的JavaScript代码的延伸
前段就是坑,入坑水真深. 先看看一个黑科技, 纳尼,这是什么东西. (!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+ ...
- Documentation/filesystems/sysfs.txt 文档翻译--sysfs
sysfs - 用于导出内核对象的文件系统. 1.sysfs是一个基于ram的文件系统,最初基于ramfs. 它提供了一种方法,可以将内核数据结构,它们的属性以及它们之间的链接导出到用户空间.sysf ...
- js中caller和callee属性详解
一.caller属性返回一个对函数的引用,该函数调用了当前函数.functionName.callerfunctionName 对象是所执行函数的名称.说明对于函数来说,caller 属性只有在函数执 ...
- VirtualBox的vdi映像导入遇到的uuid冲突问题 (转)
virtualbox导入vdi文件时出现下面的问题: 打开hard disk D:\software\GT5.0.0.vdi 失败 Cannot register the hard disk 'D ...
- Android wm指令用法详解
wm 是查看和设置显示信息的指令,此指令只能临时调试使用. wm:查看 wm 指令信息 $ adb shell root@rk3288:/ # wm wm usage: wm [subcommand] ...
- linux 使用中括号进行条件判断
格式 “#”代表空格,不可缺少 [# param1#op# param2 #] 这种带比较操作符的形式,op左右必须使用空格隔开. 如 [# “3”==”2” #] 这种缺少空格的写法会得到结 ...