关注RISC-V和Chisel以及开源IC和EDA在中国的发展
要点新闻:
在上海市政府的积极推动和Verisilicon的牵头下,众多国内RISC-V的上下游厂商在上海成立发起了中国RISC-V产业联盟(China RISC-V Industry Consorium),简称CRVIC。与此同时,上海市集成电路行业下属的RISC-V专家委员会也同时成立。
点评:上海市是国内首个公开支持RISC-V发展的地方政府,目前正在多个层面积极的推动国内RISC-V生态的发展。CRVIC希望能够联合相关半导体企业及其上下游企业,共同推进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
plusR_RISCV_LO12_I
orR_RISCV_LO12_S
.The
R_RISCV_HI20
refers to anLUI
instruction containing the high 20-bits to be relocated to an absolute symbol address. TheLUI
instruction is followed by an I-Type instruction (add immediate or load) with anR_RISCV_LO12_I
relocation or an S-Type instruction (store) and anR_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位的立即数由hi
和lo
拼接组成,分别为20位和12位,即imm=hi·lo
如果lo
的最高位为0,则hi20=(imm+0x800)>>12=hi
,lo12=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
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邮件列表。
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), 希望能在将来制定一个非商业保护的开放安全标准。 讨论中谈及了以下几个方向:
二进制代码的安全转译: Crypto Binary Translation。 动态二级制转译(Dynamic binary translation)是虚拟技术的一种,通过动态翻译并执行二进制代码实现不同指令集编译的程序在其他架构上的执行, 运行时优化等等功能。 如果动态二级制转译工具可以在转译时随机化代码中的内存分布、代码块分布、寄存器分配、系统调用表分布等等, 则可以进一步加扰被执行的代码,从而给运行时攻击增加难度。 不过,也有研究认为,即使没有任何的静态分析支持,仅通过运行时的代码分析,也能够完成攻击,被称为盲攻击(Blind ROP Attack)。
二进制代码混淆: Binary Code Obfuscation。 和二进制转译时随机化类似,二进制代码混淆一般依赖于编译器,对二进制代码进行随机化。 可随机化的内容包括指令本身、代码分布、数据分布、堆结构等等。
指针加密: Cryptographically Enforced Control Flow Integrity 控制流劫持攻击往往需要修改代码指针或者和代码指针相关的数据指针。 通过对这些关键指针进行加密,然后在使用指针(dereference)时检查指针是否能正确解密,来防止攻击者篡改指针,从而阻止攻击。
宽指针: Embedding Metadata within Pointer 很多安全措施都需要标注与安全相关的指针。 在64位机器中,指针往往只占用39位或48位的低位空间,剩下来的16到25位的高位空间往往不是全0就是全1。 通过将安全所需的附加数据存放于这些没有使用的高位中,则可以在不增加存储的情况下扩展安全措施。 不过,RISC-V现在并没有计划将类似方案加入到指令集中(见2016年9月的相关讨论)。 主要的顾虑来自于该方案的可扩展性。 即使现在普遍认为48位寻址已经足够大(256TB),将来还是会有更大的寻址要求,比如说内存和存储统一寻址的计算机集群或者稀疏寻址(sparse address)。 如果将48位寻址的高16位定义为安全metadata数据,在将来支持56位寻址的时候,地址位则和安全metadata重叠,产生不兼容问题。
当然,以上几点只是在邮件列表中被提及的技术, 并不能完全囊括所有的相关安全技术。 其他常见的安全措施包括强制CFI、影子栈、边界检查、指令加密等等。
具体讨论见isa-dev邮件列表。
在发布了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
CNRV提供为行业公司提供公益性质的一句话的招聘信息发布,若有任何体系结构、IC设计、软件开发的招聘信息,欢迎联系我们!
整理编集: 宋威、黄柏玮、汪平、林容威、傅炜、巍巍、郭雄飞、黄玮、李健
特别感谢: John Wang
欢迎关注微信公众号CNRV,接收最新最时尚的RISC-V讯息!
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行许可。