Sv39是RV64 Linux内核的一种虚拟内存布局方式,由satp 寄存器指定。Sv39中使用三层页表查询,每个页表长度为512,其中VPN (Virtual Page Number)为虚拟内存地址索引,PPN为物理内存页号(即物理地址在内存数组中的索引/下标,具体为物理地址右移 12 位)。 satp 寄存器 satp(Supervisor Address Translation and Protection...
一、SV39 图1.1 sv39虚拟地址 SV39 支持39位虚拟内存空间。每一页占用4KB内存,页内使用虚拟地址低12位寻址(2^12)。虚拟地址的高二十七位划分为三级页号,每一级都有512个可用的页号。 图1.2 sv39物理地址 图1.3 sv39页表项(PTE) SV39 的页表对应一个内存的物理页,每一个页表项占用64bit内存,512个页表项...
本篇提到了setup_vm()会检查kernel入口地址是否2M对齐,如果不对齐kernel无法启动,但其实我们可以解除这个2M对齐限制,将这部分空间利用起来,下篇教大家优化这部分内存。 原文作者:嵌入式Linux充电站
risc-v--sv39汇编实现 在Sv39 模式下,虚拟地址是 39 位,分为三级页表来管理: 第一级页表(页目录):负责最高的 9 位虚拟地址。 第二级页表(页中间目录):负责中间的 9 位虚拟地址。 第三级页表(页表):负责最低的 9 位虚拟地址。 9 位虚拟地址可以表示2的9次方=512个条目。 512条目×8字节/条目=4096字...
在RISC-V架构中,无论是Sv32、Sv39还是Sv48模式,页表条目(PTE)的格式都是固定的,都是64位。这种设计提供了一致性和灵活性,使得操作系统和硬件可以更容易地管理和转换地址。 知道一个地址怎么设置,就能知道一堆地址怎么设置。这个过程不能剩下!!! 我们需要设置一个页表条目,将虚拟地址 0x0000003F_FFFF_FFFF 映射...
RISC-V Linux启动时的页表创建相对来说还是比较容易理解的,都是C语言创建的,代码也比较少。主要就是setup_vm()和setup_vm_final()两个页表创建函数。理解了sv39的一些地址格式后,再去分析源码就比较容易。不过不同kernel版本代码都不一样,需要具体情况具体分析。
/* Compute satp for kernel page tables, but don't load it yet */srl a2,a0,PAGE_SHIFTli a1,SATP_MODE//sv39 mmuor a2,a2,a1 第一次开启MMU,使用trampoline_pg_dir页表 值的计算和上述是一样的。开启之前,通过命令先刷新。此时开启,就会进入下面的标号为的汇编段 ...
RISC-V Linux的汇编启动部分比较简单,不算复杂。有两个部分比较核心:页表创建和重定向。页表创建是用C语言写的,今天先分析汇编部分,先带大家分析整体汇编启动流程,然后分析重定向。 注意:本文基于linux5.10.111内核 汇编启动流程 先从整体分析汇编做的事情,有个大体框架。 路径:arch/riscv/kernel/head.S,入口是...
{KERNEL_VADDR_START, KERNEL_VADDR_START + 0x10000000 - 1, KERNEL_VADDR_START + PV_OFFSET, NORMAL_MEM}, }; void rt_hw_mmu_setup(rt_mmu_info *mmu_info, struct mem_desc *mdesc, int desc_nr) { void *err; for (size_t i = 0; i < desc_nr; i++) ...
修复vlenb csrr 频繁清空流水线的性能 bug,并采用 gcc15 编译,自动向量化 hmmer 由 gcc14 的 15.3/GHz 提升至 19.7/GHz,libquantum checkpoint 为 43.08/GHz(标量分别为 13.1/GHz、41.84/GHz) 功能 RTL 和 NEMU 成功启动 Sv48 的 Linux kernel、{sv39, sv48} × {sv39x4, sv48x4} 的 gos 测试组合 ...