CNRV

为推广RISC-V尽些薄力

View the Project on GitHub

RISC-V 双周简报 (2018-09-30)

要点新闻:

RV新闻

国内RISC-V上下游厂商在沪成立产业联盟

在上海市政府的积极推动和Verisilicon的牵头下,众多国内RISC-V的上下游厂商在上海成立发起了中国RISC-V产业联盟(China RISC-V Industry Consorium),简称CRVIC。与此同时,上海市集成电路行业下属的RISC-V专家委员会也同时成立。

点评:上海市是国内首个公开支持RISC-V发展的地方政府,目前正在多个层面积极的推动国内RISC-V生态的发展。CRVIC希望能够联合相关半导体企业及其上下游企业,共同推进RISC-V生态在国内的发展。而专家委员为也将作为政府和企业沟通的桥梁,共同推进整个上下游产业链的发展。

技术讨论

RISC-V如何加载一个立即数

这个看似不起眼的问题实际上有些复杂。lui指令可以将20位的立即数加载到目标寄存器的高20位,通过与其他的I型指令或S型指令组合可以加载一个32位的立即数或读写某地址上的内容。

但是在riscv-elf-psabi-doc中的Absolute Addresses一小节中有这样的一段描述:

32-bit absolute addresses in position dependent code are loaded with a pair of instructions which have an associated pair of relocations: R_RISCV_HI20 plus R_RISCV_LO12_I or R_RISCV_LO12_S.

The R_RISCV_HI20 refers to an LUI instruction containing the high 20-bits to be relocated to an absolute symbol address. The LUI instruction is followed by an I-Type instruction (add immediate or load) with an R_RISCV_LO12_I relocation or an S-Type instruction (store) and an R_RISCV_LO12_S relocation. The addresses for pair of relocations are calculated like this:

  • hi20 = ((symbol_address + 0x800) >> 12);
  • lo12 = symbol_address - (hi20 << 12);

The following assembly and relocations show loading an absolute address:

lui  a0,%hi(symbol)     # R_RISCV_HI20 (symbol)
addi a0,a0,%lo(symbol)  # R_RISCV_LO12 (symbol)

注意到hi20在计算中加上了0x800。按照一般的思路,lui加载高20位,addi正好可以补充低12位。然而addi进行的有符号加法,如果imm的最高位为1,那么addi将会认为它是一个负数。

+0x800的目的是如果立即数的第11位(最低位为第0位)是1,那么就对高20位+1进行补偿,这样计算得到的lo12正好是带符号的。为了更好地理解这一过程,有如下推导:

设32位的立即数由hilo拼接组成,分别为20位和12位,即imm=hi·lo

如果lo的最高位为0,则hi20=(imm+0x800)>>12=hilo12=imm-(hi20<<12)=imm-(hi<<12)=lo

此时加载的指令序列即为

lui  a0,hi
addi a0,a0,lo

如果lo的最高位为1,则hi20=(imm+0x800)>>12=hi+1

lo12=imm-(hi20<<12)=imm-((hi+1)<<12)=hi·lo-((hi+1)·{12'b0})={20'b1}·lo

此时加载的指令序列为

lui  a0,hi+1
addi a0,a0,lo

由于lo的最高位为1,因此此时lo被视作一个负数,即{20'b1}·lo,而高20位在原来的基础上增加了1,正好可以将lo12的高20位{20'b1}抵消。

作者:John Wang

如何创建 RISCV Linux 内核 BBL 镜像

Pintu Kumar 用 riscv-64 linux 工具链构建 riscv-linux 只能得到 vmlinux 镜像,没有 ZImage/Image 等等。但使用 qemu 启动 linux 内核需要 BBL 内核镜像。那如何自己创建一个内核 BBL 镜像而不是用 riscv-pk 工具呢?

Jim Wilson 解释道,linux 内核运行在 supervisor 模式,BBL 运行在 machine 模式,为 linux 内核提供服务,因此运行 linux 内核不能没有 BBL。还有一个单独分开对待的问题,就是启动(booting)。目前大多数的 boot loaders 只能加载一个镜像,因此 bbl 和 内核必须链接在一起。Qemu 对分开加载 BBL 和 内核有一些支持。

Pintu Kumar 还有疑惑,1)只有 riscv-qemu 需要 BBL 呢?还是真实的硬件也需要?2)对于 RISCV,为什么不能像 arm/arm64 一样有 zImage 或 Image ?3)创建 BBL 的方法,首先创建 vmlinux-stripped ,作为 riscv-pk 的输入创建 BBL 镜像。因此,必须依赖 riscv-pk 才能构建最终的内核镜像。怎么样才能摆脱这个依赖呢?

Jim Wilson 回复了这些问题,1)都需要,linux 内核依赖 BBL 提供的服务;2)因为还没有人做这些支持, RISC-V 还很年轻,没有拥有成熟的那些特性;3)必须依赖 BBL,但不一定需要把它和内核链接在一起。可以写一个分开加载它们的 bootloader,或者使用足够新的 qemu 能够分别加载它们。把它们链接在一起是过去的方式,也是目前大多数人仍使用的方式。(编者注:riscv-pk 应该是把内核镜像和 BBL 链接在一起,所以 Pintku Kumar 误以为 rissv-pk 是需要内核镜像才能创建 BBL)。

Michael Clark 觉得仍需要 BBL。在逐步细化 启动(boot)标准的过程中,BBL 可以作为兼容的参考实现,也是 SBI 的参考实现。在添加新的特性也需要考虑方方面面,也需要公开讨论,小心行事。

可以考虑的解决方案有用启动服务 API 去加载文件(例如 UEFI,GPT 和 GUIDS),或者让 bootloader 有文件系统和驱动(u-boot,grub)。如果是自己做芯片可以随便替换固件,想怎么做都可以。理想情况是,不会像 ARM 启动方式那样混杂了每家厂商自己的 boot loader 和固件认证机制。概念上,UEFI 安全启动的方式更好,厂商可以自行扩展。

具体讨论见isa-dev邮件列表

代码更新

采用RISC-V等技术构建的自由的GPU项目

Luke Kenneth Casson Leighton是一名开源硬件工程师,而且是Crowdsupply上EOMA68项目的发起者。他发起了一个开源的GPU的项目,并且生成已经得到一笔25万美金的资金用于这个项目。这个项目最初将专注在软件方面,基于RISC-V用软件方法来构建一个GPU,同时基于LLVM和Rust在用户空间建立一个基于Vulkan API的driver。同时作者也提出了一套新的RISC-V指令扩展“Simple-V”用于这个项目。

long story, there’s a new project underway which is to create a 3D GPU (and associated complete processor) entirely as a libre project, using RISC-V as the basis. there’s a lot to get done: the roadmap is quite straightforward: http://libre-riscv.org/3d_gpu/roadmap/

it’ll be a vulkan3d software driver written in rust and using llvm. where and if absolutely strictly necessary intrinsic inline assembler will be placed into the rust code: for the rest it will be straight to llvm, and from there using a hardware-level parallelism API called “SimpleV” which will take care of, at the hardware level, a variable-length “vectorisation” aka variable-size SIMD (which is a really really misleading way to describe it but SIMD and vectorisation is what most people know).

for the most part this is a software project not a hardware one so if anyone has software engineering skills, documentation skills or anything else, do get in touch.

Links:

安全点评

内存、代码和指针的已有安全技术搜集

Arm的指针加密技术(PA, Pointer Authentication)随着苹果 iOS 12 进入了产品使用阶段, 加上最近ARM宣布 在其Armv8.5-A中使用内存标签技术和跳转目标限定(BTI, Branch Target Indicator)技术, 促使Michael Clark在isa-dev列表上总结关于内存、代码和指针的已有安全技术(prior art), 希望能在将来制定一个非商业保护的开放安全标准。 讨论中谈及了以下几个方向:

当然,以上几点只是在邮件列表中被提及的技术, 并不能完全囊括所有的相关安全技术。 其他常见的安全措施包括强制CFI、影子栈、边界检查、指令加密等等。

具体讨论见isa-dev邮件列表

市场相关

AndesTech发布了支持浮点和虚拟内存支持的RISC-V核

在发布了N25和NX25一年后,AndesTech最近宣称已经可以支持浮点计算和虚拟内存。

相比于Cortex-M7和Cortex-A7在Whetstone-MIPS/MHz测试基准下N25和NX25能够提供两倍与前者的性能。

The N25F and and NX25F have twice the performance of the Cortex-M7 and Cortex-A7, as measured in Whetstone-MIPS per MHz, said Charlie Su, CTO of Andes. In addition support has been brought in for misaligned memory accesses in hardware, which is good for porting existing software from ARM and x86. Without it more than 100 cycles can be needed in the exception handler.

而相比于其他RISC-V和,Charlie也声明了其自身优势。

Su also claimed that Andes has significant advantages over other RISC-V IP licensors. These include superior human-readable RTL code that is configurable by customers. This delivers 20 percent higher performance and 12 percent smaller code size than Rocket, the University of California Berkeley designed processor that is the base of Si-Five CPUs, Su said.

Links: Andes adds floating-point, virtual memory support to RISC-V cores

暴走事件

2018年10月

2018年12月

招聘简讯

CNRV提供为行业公司提供公益性质的一句话的招聘信息发布,若有任何体系结构、IC设计、软件开发的招聘信息,欢迎联系我们!


整理编集: 宋威、黄柏玮、汪平、林容威、傅炜、巍巍、郭雄飞、黄玮、李健

特别感谢: John Wang


欢迎关注微信公众号CNRV,接收最新最时尚的RISC-V讯息!

CNRV微信公众号


知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行许可。