1 Star 1 Fork 1

华中科技大学操作系统团队 / myriscv-fesvr

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

RISC-V Frontend Server

About

This repository contains the front-end server library, which facilitates communication between a host machine and a RISC-V target machine. It is usually not meant to be used as a standalone package.

Build Steps

Execute the following commands to install the library, assuming you've declared the RISCV environment variable to point to the RISC-V install path:

$ mkdir build
$ cd build
$ ../configure --prefix=$RISCV
$ make install

以上是原版README。

修改内容

ioctl、mmap、munmap三个系统调用函数是原版的riscv-fesvr不支持的,所以我们对riscv-fesvr的系统调用模块进行了修改。修改的代码集中在fesvr/syscall.cc,共添加了4个函数:

  • reg_t syscall_t::sys_ioctl(reg_t fd, reg_t request, reg_t data),参数和返回值的意义和Linux的ioctl一样。
  • reg_t syscall_t::sys_mmap(reg_t addr, reg_t length, reg_t prot, reg_t flags, reg_t fd, reg_t offset),参数的意义和Linux的mmap一样,但是只实现了addr是NULL的情况。因为ARM端通过mmap映射的是ARM端的内存,RISCV端无法访问。所以本函数将ARM端用mmap映射的所有映射地址用数组存起来,返回值是数组索引,PKE可以用索引作参数调用另一个函数readmmap读取ARM端被映射的内存。
  • reg_t syscall_t::sys_munmap(reg_t num, reg_t length),参数num的意义是之前调用mmap返回的索引,本函数会将数组中对应索引储存的地址解映射。length是解映射的长度,本函数要求这个长度和当时映射的长度相同,否则解映射失败。返回值表示解映射是否成功,小于零为失败。
  • reg_t syscall_t::sys_readmmap(reg_t num, reg_t offset, reg_t length, reg_t addr,如前所述,本函数用来读取ARM端被映射的内存。参数num的意义是之前调用mmap返回的索引,offset是读取位置和之前调用mmap映射的区域相比的偏移量,length为读取的长度,addr是指向RISCV端内存的物理地址;返回值表示读取是否成功,小于零为失败。

另外,我们对syscall_t::sys_openat也进行了少量修改,具体是在函数中判断当参数dirfd等于常量RISCV_AT_FDCWD时使用宿主机的open系统调用而不是原来的openat系统调用打开文件。这样做是因为alsa-oss这个库只支持通过open函数访问音频文件。根据linux帮助文档(man openat),当参数dirfd等于常量AT_FDCWD时openat函数和open函数是等价的,所以理论上该修改对程序的运行结果没有影响。

在PYNQ-Z2开发板上使用

直接下载二进制文件

如果PYNQ-Z2上ARM端运行的系统是PYNQ官网获得的PYNQ v2.6启动镜像没有升级过glibc,建议直接下载本仓库build文件夹下的两个文件:libfesvr.so和riscv-fesvr。将libfesvr.so动态库放在开发板上的/usr/local/lib文件夹下,riscv-fesvr程序放在开发板上的/home/xilinx(~)文件夹下。在开发板上运行pke:

$ sudo riscv-fesvr riscv-pke 用户程序

编译

如果你在开发板上使用的是其他操作系统或者升级过glibc,又或者你喜欢编译,可以自己编译这两个文件。因为本仓库实际编译出来的只有libfesvr.so这个库,riscv-fesvr程序还需要其他的源代码,所以具体的编译步骤是:

  1. 下载安装vivado,如果PYNQ-Z2上ARM端运行的系统是PYNQ官网获得的PYNQ v2.6启动镜像没有升级过glibc,需要下载的vivado是2016.2版本的,其他系统或标准库版本请自行尝试,安装vivado时注意选对安装选项使得arm交叉编译器正确安装。

  2. 克隆并进入本仓库,执行下列命令(host后面的arm-linux-gneabihf是交叉编译器的前缀,有的版本下是arm-xilinx-linux-gneabihf。你可以试试arm-linux-gneabihf-g++arm-xilinx-linux-gnueabihf-g++哪个能正常运行):

    $ mkdir build
    $ cd build
    $ ../configure --host=arm-linux-gnueabihf
    $ make libfesvr.so
  3. 克隆并进入fpga-pynq仓库的usb-device-pynq分支,如果仅需编译riscv-fesvr可以只递归克隆testchipip这一个子仓库,然后创建编译目录:

    $ git clone https://gitee.com/hustos/fpga-pynq -b usb-device-pynq
    $ cd fpga-pynq
    $ git submodule update --init testchipip
    $ mkdir -p common/build

    然后把刚才编译得到的libfesvr.so(在仓库的build文件夹)放入common文件夹build子文件夹中。

  4. 修改一些编译配置。编辑common文件夹下的Makefrag文件,第219行指定交叉编译器,和上面一样,改成你有的交叉编译器版本:

    CXX_FPGA      = arm-linux-gnueabihf-g++

    第223行指定riscv-fesvr的源码路径,这里改成你克隆下来的myriscv-fesvr仓库的路径,如:

    		-I /home/xxx/myriscv-fesvr/ \
  5. 进入pynq-z2文件夹,运行

    make fesvr-zynq
  6. 编译结束后,在common文件夹build子文件夹中找到libfesvr.so和fesvr-zynq。将libfesvr.so动态库放在开发板上的/usr/local/lib文件夹下,fesvr-zynq程序放在开发板上的/home/xilinx(~)文件夹下并改名为riscv-fesvr。在开发板上运行pke:

    sudo riscv-fesvr riscv-pke 用户程序
  7. 另外一种自己编译的方法是直接使用开发板上的编译器编译,流程和上面基本一致,需要克隆myriscv-fesvr和fpga-pynq。不同之处在于第2步执行configure程序时不需要加--host参数,第4步CXX_FPGA变量指定为g++就行。以及Makefrag文件第234行的末尾需要加上额外的编译参数-lfesvr,似乎是因为开发板上的g++链接器比较笨,必须把对libfesvr.so的引用放在最后链接器才能找到依赖的函数符号。

空文件

简介

华中科技大学系统能力综合培养课程(蓝牙小车)配套内容。修改版riscv-fesvr(https://github.com/riscvarchive/riscv-fesvr),支持ioctl调用以及mmap和munmap。 展开 收起
C 等 5 种语言
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/hustos/myriscv-fesvr.git
git@gitee.com:hustos/myriscv-fesvr.git
hustos
myriscv-fesvr
myriscv-fesvr
modify

搜索帮助