RISC-V Linux启动,经历了两次页表创建过程,第一次使用C函数setup_vm()创建临时页表,第二次使用C函数setup_vm_final()创建最终页表。 具体细节参考代码中的注释,下面的代码省略了一些不重要的部分。 setup_vm() asmlinkage void __init setup_vm(uintptr_t dtb_pa) { uintptr_t va, pa, end_va; uintptr...
RISC-V Linux启动,经历了两次页表创建过程,第一次使用C函数setup_vm()创建临时页表,第二次使用C函数setup_vm_final()创建最终页表。 具体细节参考代码中的注释,下面的代码省略了一些不重要的部分。 setup_vm() asmlinkage void __init setup_vm(uintptr_t dtb_pa) { uintptr_t va, pa, end_va; uintptr...
RISC-VLinux启动,经历了两次页表创建过程,第一次使用C函数setup_vm()创建临时页表,第二次使用C函数setup_vm_final()创建最终页表。 具体细节参考代码中的注释,下面的代码省略了一些不重要的部分。 setup_vm() asmlinkagevoid__initsetup_vm(uintptr_tdtb_pa){uintptr_tva, pa, end_va;uintptr_tload_pa = ...
call setup_vm// 跳转到C函数setup_vm,setup_vm会创建临时页表#ifdefCONFIG_MMUla a0,early_pg_dir call relocate//重定向,实际就是开启MMU#endif/* CONFIG_MMU */call setup_trap_vector/* 重载C环境 */la tp,init_task sw zero,TASK_TI_CPU(tp)la sp,init_thread_union+THREAD_SIZE#ifdefCONFIG_KASA...
RISC-V Linux启动时的页表创建相对来说还是比较容易理解的,都是C语言创建的,代码也比较少。主要就是setup_vm()和setup_vm_final()两个页表创建函数。理解了sv39的一些地址格式后,再去分析源码就比较容易。不过不同kernel版本代码都不一样,需要具体情况具体分析。
(a2) /* 初始化页表,然后重定向到虚拟地址 */ la sp, init_thread_union + THREAD_SIZE mv a0, s1 call setup_vm // 跳转到C函数setup_vm,setup_vm会创建临时页表 #ifdef CONFIG_MMU la a0, early_pg_dir call relocate //重定向,实际就是开启MMU #endif /* CONFIG_MMU */ call setup_trap_...
boot_jump_linux kernel--使用images->ep地址,以gd->arch.boot_hart和images->ft_addr作为第1-2参数。 RISC-V kernel启动时保存a0/a1寄存器到s0/s1: _start _start_kernel mv s0, a0 mv s1, a1 setup_vm--以DTB物理地址为参数,配置页表映射。
RISC-V Linux的页表创建 临时页表分析 MMU开启前,需要建立好kernel、dtb、trampoline等页表。以便MMU开启后,并且在内存管理模块运行之前,kernel可以正常初始化,dtb可以正常地被解析。这部分页表都是临时页表,最终的页表在setup_vm_final()建立。 临时页表创建顺序:...
在RISC-V 已经被移植支持的情况下,我们现在要做的是分析,Linux 内核是如何支持 RISC-V 架构的。 -configs/:支持系统的默认配置(i.e.*_defconfigfiles) -include/asm/:Linux源码内部使用的头文件 -include/uapi/asm:对于要导出到用户空间(例如libc)的头文件 ...
RISC-V是一种开源指令集架构(Instruction Set Architecture,ISA),它是基于精简指令集计算机(Reduced Instruction Set Computer,RISC)原则设计的。RISC-V的设计目标是简洁、灵活且可扩展,适用于各种应用场景。 Linux内核编译问题可能涉及到以下几个方面: 编译环境配置:在编译RISC-V Linux内核之前,需要配置相应的编译环境。