在做操作系统课程设计的时候, 遇到了和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”等错误。
发表评论