RISC-V

启动第一个应用进程

start_kernel ...... arch_call_rest_init() rest_init(); pid = kernel_thread(kernel_init, NULL, CLONE_FS); static int __ref kernel_init(void *unused) { int ret; …

◷ 2024-07-07 📁 RISC-V 👤 laumy 🔥 384 热度 💬 0 评论

挂载根文件系统

根文件系统是控制权从linux内核转移到用户空间的一个桥梁,文件系统的挂载需要提供挂载点,linux内核在初始化时汇初始化一个虚拟的“/”目录用于根文件系统的挂载。 start_kernel vfs_caches_init() mnt_init() init_rootfs() init_mount_tree() …

◷ 2024-07-07 📁 RISC-V 👤 laumy 🔥 1183 热度 💬 0 评论

异常初始化

异常处理概述 略 异常入口 start_kernel trap_init(); void __init trap_init(void) { /* * Set sup0 scratch register to 0, indicating to exception vector * that we are presently executing in the …

◷ 2024-07-07 📁 RISC-V 👤 laumy 🔥 311 热度 💬 0 评论

虚拟地址空间与物理地址空间完整映射

setup bootmem 物理内存都添加到系统之后,会调用setup_bootmem对整个物理内存进行整理,主要的工作就是remove掉一些no-map区域(不归内核管理),同时保留一些关键区域,如内核

◷ 2024-07-07 📁 RISC-V 👤 laumy 🔥 448 热度 💬 0 评论

使能MMU

① 多核情况使能MMU .Lsecondary_start: #ifdef CONFIG_SMP /* Set trap vector to spin forever to help debug */ la a3, .Lsecondary_park csrw CSR_STVEC, a3 slli a3, a0, LGREG la a1, …

◷ 2024-07-07 📁 RISC-V 👤 laumy 🔥 338 热度 💬 0 评论

临时虚拟地址空间映射

概述 为什么要做临时虚拟地址空间映射? 一旦开启MMU,PC的下一条指令地址会经过MMU转化,未开启MMU之前地址的翻译是不需要经过MMU转化直接访问。对应开启MMU之后,应该要使用虚

◷ 2024-07-07 📁 RISC-V 👤 laumy 🔥 655 热度 💬 0 评论

虚拟地址与物理地址概念

地址空间 虚拟地址:程序使用的内存地址;物理地址:硬件的地址空间。虚拟地址通过MMU转化为物理地址,虚拟地址的长度与实际的物理内存容量没有关系,从系统中每个进程的角度看,地址空间的进

◷ 2024-07-07 📁 RISC-V 👤 laumy 🔥 2176 热度 💬 0 评论

arch初始化

_start_kernel: /* Mask all interrupts */ csrw CSR_SIE, zero csrw CSR_SIP, zero ① 将sie,sip寄存器设置为0,关闭所有中断和清除中断的pending(不是异常)。 /* Load the global pointer */ .option push .option …

◷ 2024-07-07 📁 RISC-V 👤 laumy 🔥 328 热度 💬 0 评论

Linux系统RISC-V架构启动流程分析之概述

典型的linux系统启动流程如上,但本文主要探讨的是OS的启动流程,opensbi,uboot暂不涉及。主要围绕arch/riscv/kernel/head.S进行分析。 _start j _start_kernel _start_kernel arch

◷ 2024-07-07 📁 RISC-V 👤 laumy 🔥 1065 热度 💬 0 评论

Linux risc-v head.S调试记录

调试准备 gdb调试 0x0000000080200000为opensbi跳转执行的物理地址,linux内核的img会加载到这个地址运行,如果要在这个地方断点,就b *(0x000000

◷ 2024-06-13 📁 RISC-V 👤 laumy 🔥 964 热度 💬 0 评论

RISC-V backtrace实现原理

start_kernel addi sp,sp,-16 ---① 分配栈帧sp=sp-16,sp指向栈顶 sw ra,12(sp) ---② 将ra存储到sp+12的位置 sw s0,8(sp) xxxxxx jal ra, 6000dba2 <backtrace> xxxxxx lw s0,8(sp) lw ra,12(sp) addi sp,sp,16 …

◷ 2024-05-21 📁 RISC-V 👤 laumy 🔥 483 热度 💬 0 评论

RISC-V动态链接实验

准备 实验环境 qemu linux启动环境: http://www.laumy.tech/1186.html 代码 动态库 cat swap.c #include <stdio.h> int shared = 1; int z; void swap(int *a, int *b) { …

◷ 2024-05-18 📁 RISC-V 👤 laumy 🔥 451 热度 💬 0 评论

opensbi分析(一)

引导Hart启动 _start: /* Find preferred boot HART id */ MOV_3R s0, a0, s1, a1, s2, a2 # 将a0,a1,a2的参数分别赋值为s0,s1,s2,这3个参数是前一阶段传入的参数。 # a0: hart id # a1: device tree # a2: struct …

◷ 2024-05-16 📁 RISC-V 👤 laumy 🔥 1463 热度 💬 0 评论

RISC-V架构与FreeRTOS任务栈变化

栈的基本概念 在FreeRTOS中,每个任务有一个全局的tskTCB实例,pxCurrentTCB指针指向的是正在运行的任务实例,有三个和栈相关的变量pxTopOfStack和pxS

◷ 2024-05-10 📁 RISC-V 👤 laumy 🔥 911 热度 💬 0 评论

平头哥E90X中断处理汇编部分

任务上下文保存 addi sp, sp, -portCONTEXT_SIZE store_x x1, 1 * portWORD_SIZE( sp ) store_x x5, 2 * portWORD_SIZE( sp ) store_x x6, 3 * portWORD_SIZE( sp ) store_x x7, 4 * portWORD_SIZE( sp …

◷ 2024-05-09 📁 RISC-V 👤 laumy 🔥 208 热度 💬 0 评论

平头哥E90X异常处理

上下文入栈保存 addi sp, sp, -portCONTEXT_SIZE ----开辟一段栈空间,这里的sp可能是主栈或任务栈 store_x x1, 1 * portWORD_SIZE( sp ) ----依次存储相关寄存器 store_x x5, 2 * portWORD_SIZE( sp ) store_x x6, 3 * …

◷ 2024-05-09 📁 RISC-V 👤 laumy 🔥 271 热度 💬 0 评论

平头哥E90X的head.S分析

关闭中断 /* disable interrupt */ li t0, MR_MIE --- t0=0x08 csrc mstatus, t0 --- mstatus = mstatus | ~t0 csrw mie, zero --- mie = zero mstatus第4bit清0,mie清0。 设置异常处理入口 /* setup the …

◷ 2024-05-09 📁 RISC-V 👤 laumy 🔥 345 热度 💬 0 评论

RISC-V指令集架构

简介 RISC-V是一个通用的指令集架构(ISA),ISA是底层硬件电路面向上层软件程序提供的一层接口规范,ISA定义了: 基本数据类型,BYTE/HALFWORD/WORD 寄存器 指令

◷ 2024-04-27 📁 RISC-V 👤 laumy 🔥 1309 热度 💬 0 评论

qemu-system-riscv64 virt平台ROM代码启动分析

为什么下面qemu启动elf时,text地址要从0x80000000开始? qemu-system-riscv64 -machine virt -cpu c910v -nographic -smp 1 -bios none -kernel xxx.elf 从memory mapping角度 下面是qemu virt平台的memory mapping …

◷ 2024-04-12 📁 RISC-V 👤 laumy 🔥 812 热度 💬 0 评论

RISC-V汇编指令

C源代码 unsigned int arithmetic(unsigned int a, unsigned int b) { unsigned int sum, diff, upper; sum = a + b; sum = sum + 2; diff = a - b; diff = diff -1; upper = 8192; return sum + …

◷ 2024-04-11 📁 RISC-V 👤 laumy 🔥 721 热度 💬 0 评论

环境搭建

risc-v32入门 https://github.com/plctlab/riscv-operating-system-mooc/blob/main/README_zh.md 按照上面的进行搭建,工具链和qemu都不用编译,直接解压设置环境变量后可使用,需要注意的是ubuntu使用20.04以上版本。 对于asm下面的code编译方式

◷ 2024-03-09 📁 RISC-V 👤 laumy 🔥 988 热度 💬 0 评论