RISC-V 64 Code Model

在做操作系统课程设计的时候, 遇到了和RV64 Code Model相关的问题, 现记录如下。

RISC-V 64的Code Model有两种: medlow以及medany。

选择medlow, 会让编译器生成lui+12位立即数作为偏移的指令来进行寻址。其中, lui加载20位立即数到指定寄存器的高20位。总计可以寻址的范围为32位, 为0~4G。因此, 程序只能放在低4G的空间内。

选择medany, 则会让编译器生成auipc+12位立即数作为偏移的指令来进行寻址。其中, auipc指令也含有20位立即数, 它左移12位再和当前PC相加, 存入指定寄存器。这个模式可以寻址的范围同样为32位, 但是这是相对于PC而言的, 为PC-2G~PC+2G。只要偏移量绝对值不超过2G, 则程序放在内存的任何位置都可以正常寻址。例如, 在操作系统中, 内核代码一般会放在高地址区域, 比如0xffffffc000000000, 这个时候操作系统的代码、用到的库等所有程序, 都必须要用medany编译。否则由于lui+12位立即数作为偏移的指令无法表示大地址, 在链接的时候会出现”relocation truncated to fit: R_RISCV_HI20 against symbol”等错误。

发表评论

注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)

本文链接:https://twd2.me/archives/10617QrCode