From Fedora Project Wiki
No edit summary
No edit summary
 
(12 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{lang|en|zh-cn|page=Architectures/RISC-V/64ILP32}}
{{lang|en|zh-cn|page=Architectures/RISC-V/64ILP32}}


== 为什么使用32位Linux?==
== 什么是rv64ilp32? ==
AIoT技术进步推动了对微控制器(MCU)和应用处理器(AP)更高计算能力的需求,凸显了32位架构的局限。内存访问和原子操作指令难以满足现代系统要求,催生了向64位架构的转型。此转型面临挑战:32位软件在64位硬件上运行时,指针与寄存器宽度不匹配影响性能。为应对这一问题,阿里巴巴-达摩院-玄铁团队提出了松弛扩展寻址模式(Relaxed-Addressing Mode),并与中科院软件所-PLCT实验室联合发布了业界首款RISC-V新32位产品级开源工具链(rv64ilp32 toolchain),专为固件、RTOS 和 Linux内核等设计,优化了性能与成本。新32位Linux内核在性能上大幅超越传统方案,ebpf性能提升300%,iperf-tcp提升17%。
Fedora 社区针对 RISC-V 拥有丰富的软件生态,与传统的64位方案相比,新32位构建能够节省39%的内存。这一优势使 Fedora RISC-V 能在嵌入式领域有更广泛的应用。正因为看到了新32位的潜力,在PLCT实验室的协助下,我们尝试了新32位 Fedora Remix移植,目前已可以运行在嘉楠 k230 开发板上:


使用32位Linux内核的目的是为了减少内存占用并满足小容量DDR和缓存的要求(例如,64/128MB SIP SoC)。
[[File:K230.jpg|thumb]]


ilp32的long和指针大小仅为lp64的一半(rv64默认的abi - long和指针都是64位)。
== 快速开始 ==
这种数据类型上的显著差异导致了不同的内存和缓存占用成本。 在相同的128MB qemu系统环境中,这里是s32ilp32、s64ilp32和s64lp64之间的比较测量:
CanMV-K230 Fedora 固件下载地址


=== 根文件系统: ===
[Release 2024.03.03-128m · ruyisdk/mkimg-k230-rv64ilp32](https://github.com/ruyisdk/mkimg-k230-rv64ilp32/releases/tag/2024.03.03-128m)
* u32ilp32 - 使用相同的32位用户空间rootfs.ext2(UXL=32)二进制文件,来自buildroot 2023.02-rc3,qemu_riscv32_virt_defconfig。
 
其中


=== Linux: ===
* s32ilp32 - Linux version 6.3.0-rc1 (124MB) rv32_defconfig:
<pre>
<pre>
          $(Q)$(MAKE) -f $(srctree)/Makefile defconfig 32-bit.config
- rv64-canmv-rv64 (s64lp64+u64lp64)
- rv32-canmv-rv64 (s64lp64+u32ilp32)
- rv32-canmv-rv64ilp32 (s64ilp64 + u32ilp32)
</pre>
</pre>


* s64lp64 - Linux version 6.3.0-rc1 (126MB) defconfig:  
以下是各个版本的内存开销对比 (相比传统64位 k230,新32位Linux避免39%的内存开销):
s64lp64 + u64lp64:
<pre>
- free -h
-      total used free shared buff/cache available
- Mem: 107Mi 39Mi 15Mi 1.0Mi  52Mi      53Mi
</pre>
s64lp64 + u32ilp32:
<pre>
<pre>
          $(Q)$(MAKE) -f $(srctree)/Makefile defconfig
free -h
    total used free shared buff/cache available
Mem: 107Mi 33Mi 31Mi 1.0Mi  41Mi      67Mi
</pre>
</pre>
s64ilp32 + u32ilp32:
<pre>
free -h
    total used free shared buff/cache available
Mem: 108Mi 28Mi 41Mi 1.0Mi  38Mi      73Mi
</pre>
(used: 39MB -> 33MB -> 28MB, Prevent 39% memory waste in s64ilp32 + u32ilp32


* s64ilp32 - Linux version 6.3.0-rc1 (126MB)  rv64ilp32_defconfig:
== 固件烧录 ==
首先解压zst文件
<pre>
zstd -d k230-sdcard-fedora_rv32-canmv-rv64ilp32.img.zst
</pre>
使用 lsblk 查看TF卡设备路径,假设为/dev/sdb,执行以下指令烧录(谨慎)
<pre>
<pre>
          $(Q)$(MAKE) -f $(srctree)/Makefile defconfig 64ilp32.config
wipefs -a /dev/sdb
dd if=k230-sdcard-fedora_rv32-canmv-rv64ilp32.img of=/dev/sdb bs=1M status=progress
sync
eject
</pre>
</pre>


=== Opensbi: ===
== Linux 内核编译 ==
访问 https://github.com/ruyisdk/riscv-gnu-toolchain-rv64ilp32 获取工具链。


* m64lp64  - (2MB) OpenSBI v1.2-80-g4b28afc98bbe
获取 Linux 内核:
* m32ilp32 - (4MB) OpenSBI v1.2-80-g4b28afc98bbe
<pre>
git clone https://github.com/ruyisdk/k230-rv64ilp32-linux-kernel.git -b k230-6.6-ilp32-128M --depth=1
cd k230-rv64ilp32-linux-kernel
</pre>


 
构建传统 s64lp64 Linux 内核:
[[File:64ilp32.png|center|1024px]]
<pre>
make ARCH=riscv CROSS_COMPILE=<YOUR PATH>/riscv/bin/riscv64-unknown-elf- k230_evb_linux_enable_vector_defconfig all
</pre>
构建新32位Linux 内核,只需在以上命令附上 64ilp64.config 配置即可,示例如下:
<pre>
make ARCH=riscv CROSS_COMPILE=<YOUR PATH>/riscv/bin/riscv64-unknown-elf- k230_evb_linux_enable_vector_defconfig 64ilp32.config all
</pre>

Latest revision as of 17:45, 5 March 2024

什么是rv64ilp32?

AIoT技术进步推动了对微控制器(MCU)和应用处理器(AP)更高计算能力的需求,凸显了32位架构的局限。内存访问和原子操作指令难以满足现代系统要求,催生了向64位架构的转型。此转型面临挑战:32位软件在64位硬件上运行时,指针与寄存器宽度不匹配影响性能。为应对这一问题,阿里巴巴-达摩院-玄铁团队提出了松弛扩展寻址模式(Relaxed-Addressing Mode),并与中科院软件所-PLCT实验室联合发布了业界首款RISC-V新32位产品级开源工具链(rv64ilp32 toolchain),专为固件、RTOS 和 Linux内核等设计,优化了性能与成本。新32位Linux内核在性能上大幅超越传统方案,ebpf性能提升300%,iperf-tcp提升17%。 Fedora 社区针对 RISC-V 拥有丰富的软件生态,与传统的64位方案相比,新32位构建能够节省39%的内存。这一优势使 Fedora RISC-V 能在嵌入式领域有更广泛的应用。正因为看到了新32位的潜力,在PLCT实验室的协助下,我们尝试了新32位 Fedora Remix移植,目前已可以运行在嘉楠 k230 开发板上:

K230.jpg

快速开始

CanMV-K230 Fedora 固件下载地址

[Release 2024.03.03-128m · ruyisdk/mkimg-k230-rv64ilp32](https://github.com/ruyisdk/mkimg-k230-rv64ilp32/releases/tag/2024.03.03-128m)

其中

- rv64-canmv-rv64 (s64lp64+u64lp64)
- rv32-canmv-rv64 (s64lp64+u32ilp32)
- rv32-canmv-rv64ilp32 (s64ilp64 + u32ilp32)

以下是各个版本的内存开销对比 (相比传统64位 k230,新32位Linux避免39%的内存开销): s64lp64 + u64lp64:

- free -h
-      total used free shared buff/cache available
- Mem: 107Mi 39Mi 15Mi 1.0Mi  52Mi       53Mi

s64lp64 + u32ilp32:

free -h
     total used free shared buff/cache available
Mem: 107Mi 33Mi 31Mi 1.0Mi  41Mi       67Mi

s64ilp32 + u32ilp32:

free -h
     total used free shared buff/cache available
Mem: 108Mi 28Mi 41Mi 1.0Mi  38Mi       73Mi

(used: 39MB -> 33MB -> 28MB, Prevent 39% memory waste in s64ilp32 + u32ilp32

固件烧录

首先解压zst文件

zstd -d k230-sdcard-fedora_rv32-canmv-rv64ilp32.img.zst

使用 lsblk 查看TF卡设备路径,假设为/dev/sdb,执行以下指令烧录(谨慎)

wipefs -a /dev/sdb
dd if=k230-sdcard-fedora_rv32-canmv-rv64ilp32.img of=/dev/sdb bs=1M status=progress
sync
eject

Linux 内核编译

访问 https://github.com/ruyisdk/riscv-gnu-toolchain-rv64ilp32 获取工具链。

获取 Linux 内核:

git clone https://github.com/ruyisdk/k230-rv64ilp32-linux-kernel.git -b k230-6.6-ilp32-128M --depth=1
cd k230-rv64ilp32-linux-kernel

构建传统 s64lp64 Linux 内核:

make ARCH=riscv CROSS_COMPILE=<YOUR PATH>/riscv/bin/riscv64-unknown-elf- k230_evb_linux_enable_vector_defconfig all

构建新32位Linux 内核,只需在以上命令附上 64ilp64.config 配置即可,示例如下:

make ARCH=riscv CROSS_COMPILE=<YOUR PATH>/riscv/bin/riscv64-unknown-elf- k230_evb_linux_enable_vector_defconfig 64ilp32.config all