RISC-V Linux启动时的页表创建相对来说还是比较容易理解的,都是C语言创建的,代码也比较少。主要就是setup_vm()和setup_vm_final()两个页表创建函数。理解了sv39的一些地址格式后,再去分析源码就比较容易。不过不同kernel版本代码都不一样,需要具体情况具体分析。 本篇提到了setup_vm()会检查kernel入口地址是否2M...
主要就是setup_vm()和setup_vm_final()两个页表创建函数。理解了sv39的一些地址格式后,再去分析源码就比较容易。不过不同kernel版本代码都不一样,需要具体情况具体分析。 本篇提到了setup_vm()会检查kernel入口地址是否2M对齐,如果不对齐kernel无法启动,但其实我们可以解除这个2M对齐限制,将这部分空间利用起来,下篇...
la sp, init_thread_union + THREAD_SIZE 上述工作完成,会开始临时页表的创建,跳转到C函数setup_vm建立临时页表 mv a0, s1 call setup_vm // 跳转到C函数setup_vm,setup_vm会创建临时页表 重定向 #ifdef CONFIG_MMU la a0, early_pg_dir call relocate //重定向,实际就是开启MMU #endif 设置异常向量地址...
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 = ...
临时页表分析 MMU开启前,需要建立好kernel、dtb、trampoline等页表。以便MMU开启后,并且在内存管理模块运行之前,kernel可以正常初始化,dtb可以正常地被解析。这部分页表都是临时页表,最终的页表在setup_vm_final()建立。 临时页表创建顺序: 首先为fixmap创建早期的PGD
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物理地址为参数,配置页表映射。
callsetup_vm 1. 2. 3. 4. 5. 6. 7. setup_initial_init_mm() 设备树解析完成后,进行了早期内存的初始化,给出了代码段的起始与结束位置,数据段的结束位置,堆地址结束位置。 [0.000000]OF:fdt:Ignoringmemoryrange0x80000000-0x80200000 [0.000000]Machinemodel:riscv-virtio,qemu ...
第一阶段主要负责节点的创建和部分文件系统的挂载(要求boot,system,vender,data等分区在开发板上已经按照分区表进行行了烧写,RVB-ICE开发板使用的是GPT),log系统的初始化,一些基础环境变量的设置;之后会调用selinux_setup加载预编译的规则和上下文文件,为各个文件节点配置安全属性,在调试时selinux进行修改通常会带来不...
1. setup_trap_vector 在主初始化流程中,调用了setup_trap_vector初始化中断向量表: setup ... RISCV Linux Kernel IC rocket 转载 mob604756f80175 2021-09-08 21:00:00 577阅读 2评论 riscv - kernel - locks https://mp.weixin.qq.com/s/27AS_0EiMKrAENb5w--Lzg 简单介绍Linux kernel中...
编译过程:使用交叉编译工具链对内核源代码进行编译。编译过程可能需要一定的时间和资源。编译完成后,会生成内核镜像文件(例如vmlinux)和相关的模块文件。 内核加载和启动:将编译生成的内核镜像文件和模块文件加载到目标设备上,并进行启动。具体的加载和启动过程可能因硬件平台而异,可以参考相关文档和资料。