RVV概念与intrinsic入门
RISC-V的Vector扩展、架构介绍、intrinsic实战、开发环境配置 开发环境参考:https://www.cnblogs.com/sureZ-learning/p/18822215 环境配置 需要安装riscv-gnu-toolchain和qemu 123456789# riscv-gnu-toolchain的安装# step1:下载预编译好的包$ https://github.com/riscv-collab/riscv-gnu-toolchain选择 riscv64-glibc-ubuntu-22.04-gcc-nightly-2025.01.20-nightly.tar.xz# step2:解压并配置工具链路径$ tar -xvf riscv64-glibc-ubuntu-22.04-gcc-nightly-2025.01.20-nightly.tar.xzexport PATH=/xxx/:$PATH qemu没有预编译好的版本,需要自己手动编译,为了方便,这里我们选择qemu-user模式。 12345678910111213141516171819$...
xv6-lab-trap
6.s081 fa20 lab4:一个很有趣,码量不大但是烧脑的lab traps调试小技巧MIT 6.S081 xv6 调试指北_xv6 调试 exec-CSDN博客 调试用户程序,可以在exec打一个断点,原理是使用sh调试时,都是用exec执行二进制程序,所以可以在这里打断点 然后在sh里面输入用户程序,在gdb里面调试,但是我试图 file user/_alarmtest 显示can not access memory,待解决 测试方法 12345# 自动化测试:make grade 可以获得得分情况make grade# 或者可以使用 进行单个测试./grade-具体lab名字 part名字 backtrace此实验目的是panic时,通过backtrace打印出程序调用堆栈 最终效果如下,打印出了地址,但是还需要你手动转换 手动转换: addr2line是一个命令行工具,用于将地址转换成源码文件名和行号。它通常用于调试内核或其他程序时,根据地址查找对应的源代码位置。这个工具对于理解程序在运行时遇到的错误位置非常有用 1addr2line -e kernel...
算法笔记-杂乱版持续更新
算法模板:数学、二分、双指针、单调栈、单调队列、字典树、Z函数、dp、差分、堆、线段树 蓝桥杯省赛考点统计结果如下: 知识点 出现次数模拟 17贪心 16DP 14枚举 11数学 9二分 8数论 7DFS 5前缀和 5推公式 5快速幂 4差分 4双指针 4状态压缩DP 4思维题 4BFS 3树形DP 3递推 3字符串处理 3排序 2搜索 2剪枝 2递归 2动态规划 2分类讨论 2线性DP 2最大公约数 2二叉树 2背包问题 2找规律 2并查集 2哈希表 2分解质因数 2堆 2结论题 1树的直径 1斐波那契数列性质 1龟速乘 1树状数组 1归并排序 1矩阵乘法 1哈希 1区间DP 1辗转相减法 1图论 1环 1置换群 1完全背包问题 1扫描线 1线段树 1Flood Fill ...
xv6-locks
自旋锁,睡眠锁,死锁,锁排序,锁的粒度 Chapter 6 锁为什么需要锁? 多CPU内核:计算机的多个CPU之间独立执行,如xv6的RISC-V。多个处理器共享物理内存,这种共享增加了一种可能性,即一个CPU读取数据结构,而另一个CPU正在更新它 单CPU多线程内核:内核也可能在许多线程之间切换CPU,导致它们的执行交错 以上可能导致数据损坏,单词并发(concurrency)是指由于多处理器并行、线程切换或中断,多个指令流交错的情况。 锁作为并发控制的一种,广泛使用。锁提供了互斥,确保一次只有一个CPU可以持有锁。如果程序员将每个共享数据项关联一个锁,并且代码在使用一个数据项时总是持有相关联的锁,那么该项一次将只被一个CPU使用。在这种情况下,我们说锁保护数据项。 锁的缺点是它会扼杀性能,因为他会串行化并发操作 一个例子:xv6的kfree实现是把一个内存页面添加到空闲链表上,这涉及到一个push操作。考虑这样一个情况,两个CPU同时执行push,如果没有锁,你的push实现可能是这样的 1234567891011121314151617struct element &...
xv6-multithread-switch
xv6任务切换详细分析,可以说是我认为xv6中最难的几个点之一,涉及到很多跳转,锁的运用 chapter7 多线程 进程和线程在这里好像没有特别做区分?是吗 一个进程对应一个线程 Linux,允许在一个用户进程中包含多个线程,进程中的多个线程共享进程的地址空间 学生提问:我们这里一直在说线程,但是从我看来XV6的实现中,一个进程就只有一个线程,有没有可能一个进程有多个线程? Robert教授:我们这里的用词的确有点让人混淆。在XV6中,一个进程要么在用户空间执行指令,要么是在内核空间执行指令,要么它的状态被保存在context和trapframe中,并且没有执行任何指令。这里该怎么称呼它呢?你可以根据自己的喜好来称呼它,对于我来说,每个进程有两个线程,一个用户空间线程,一个内核空间线程,并且存在限制使得一个进程要么运行在用户空间线程,要么为了执行系统调用或者响应中断而运行在内核空间线程 ,但是永远也不会两者同时运行。 线程概述为什么需要线程 有可能计算机需要执行分时复用的任务,例如MIT的公共计算机系统Athena允许多个用户同时登陆一台计算机,并运行各自的进程。 多线程可...
latex in typora
在typora编辑器使用latex公式,基本的语法,用来当自用手册查询 参考Typora中利用LaTeX 插入数学公式_typora插入latex公式-CSDN博客 hexo开启latex渲染功能 安装Hexo-Math: Hexo-Math是Hexo的一个插件,它支持LaTeX数学公式,并且可以通过MathJax来渲染。 打开终端或命令提示符,进入您的Hexo项目目录,然后运行以下命令来安装Hexo-Math: 1npm install hexo-math --save 配置Hexo主配置文件: 打开您的Hexo配置文件(通常是_config.yml),然后添加或修改以下配置项: 12345math: enable: true engine: mathjax mathjax: cdn: //cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.9/MathJax.js?config=TeX-AMS-MML_HTMLorMML 这里enable: true表示启用数学公式支持,engine: mathjax指定使用MathJax引...
RVOS的trap
看 xv6 的代码有点迷惑了,对于需要看 qemu 手册和 RISC-V 手册的实现不太懂,来汪辰老师的 RVOS 课程补一补,讲的真好,很精妙的设计! 05 trap和中断mtvec 的 两种模式 dircet: vector:一张中断向量表,处理效率更高 分清什么是硬件自动执行的,什么是我们手动来实现的,才知道怎么code 处理 trap 的时候我们可以修改 mepc 的值达到改变 mret 返回地址的目的 mtval辅助 mcause来告诉我们异常或者中断更加详细的信息 mpp占两位,因为可能是 m,s,u 这三个特权级要用 2 bit表示 没有 upp (因为他只有一种可能:自己陷入自己) RISC-V Trap 处理流程 top half是不受我们控制的,硬件发生的过程 把 mstatus 的 MIE 值复制到 MPIE 中,清除 mstatus 中的 MIE 标 志位,效果是中断被禁止。 设置 mepc ,同时 PC 被设置为 mtvec。(需要注意的是,对于 exception, mepc 指向导致异常的指令;对于 interrupt,它指向被 ...
完全搞懂二分
看完了灵神 20 分钟的二分讲解,把以前看了好多遍都没看懂的二分彻底理解了,开心~ 主题:红蓝染色法理解二分,力扣152,163 二分红蓝染色法理解二分我们以寻找到 >= x 的第一个下标来举例: 你的条件可以灵活定义 用红色表示不满足条件的,蓝色表示满足条件的,白色表示不确定 核心: 你要维护的区间内的都是没有染色的,区间的定义是未染色的范围,而不是答案的范围!!! l 和 r 的初始值怎么定义?看你初始的不知道如何染色的区间范围(白色)是多少,以及你二分是使用闭区间 or 开区间 or 左闭右开 哪种策略编写的,据此定下来你的 l 和 r值 循环条件如何终止?当你的区间不为空的时候循环 中间判断了之后 l,r 与 m 的关系应该怎么变化:看你想要寻找什么 最后答案应该怎么return:在找第一个 >= x 的情况下你要return的应该是蓝色(true)的第一个 mid 表示正在询问的数 闭区间写法下我们如何取得答案? 有一个循环不变量保持着: L-1始终是红色 R+1始终是蓝色 那么答案其实就是 蓝色的第一个,也就是L或者R+1 多种写法三种写法...
xv6-trap
详细看看 xv6 trap:相关寄存器,trap流程,用户trap,内核trap 相关资料存档: 4.1 RISC-V陷入机制 · 6.S081 All-In-One (dgs.zone) 6.1 Trap机制 | MIT6.S081 (gitbook.io) riscv 特权级手册 限制vmem:Vmmem进程(WSL)占用CPU或内存资源过高的解决办法-CSDN博客 trap什么是 trap? 用户空间和内核空间的切换通常被称为trap special!!:第一次trap的时候在哪里设置的uservec!是在forkret forkret 调用了 usertrapret() 返回到了用户空间,在这里为第一次 trap 所需的东西,那么我认为冗余的部分,是不是就是因为这个地方没有设置呢 首先介绍一下 S mode 和 U mode 的小区别: supervisor mode可以控制什么/特权是什么? 读写控制寄存器:satp,stvec,sepc,sscratch 可以使用 PTE_U 标志位为 0 的 PTE。当 PTE_U 标志位为 1 的时候,表明用户代码可以...
xv6-in-openSBI
最近完成操作系统大赛,需要为 xv6 实现一个 SBI 来完成指定的引导 TODO:理一下 xv6 原本的引导过程 引导过程OpenSBIOpenSBI的主要功能就是在M态初始化硬件,然后以S态跳转到内核的位置,完成整个启动过程。此外,OpenSBI作为S态内核的执行环境(EEI),可以以 ecall 的方式为S态内核提供一些只有M态才能实现的功能 每个cpu启动时,都在M态。在将控制权交给操作系统时,转换为 S 态 qemu 自带一个 opensbi 指定 -bios default 这个选项 由于 opensbi 占据了 0x80000000 到 0x80200000 这段区域,因此我们需要把 xv6 原本这段区域(Kernel)迁移到 0x80200000 加入opensbi后的内存布局 12345678910111213141516171819202122232425PHYSICAL_MEMORY_TOP-> +----------------------------+---- | ...
