
RISC-V
文章平均质量分 79
隋边边
这个作者很懒,什么都没留下…
展开
-
内存管理01——链接脚本
新年的第一篇博文,先祝我工作顺利,万事如意!祝福大家的话就不赘述了。在开始操作系统的内存管理相关内容前,首先来关注链接脚本,因为动态内存即堆区的地址是在链接脚本中分配的,知道了堆的起始地址和长度才能进行内存的分配和管理。1. 链接脚本的作用是什么?链接的作用就是把编译生成的多个目标文件(.o)合并起来,生成最后的可执行文件(.elf)。如上图中间的就是.o目标文件,最右的则是链接生成的.elf文件。除此之外,链接脚本还关注一个问题,就是生成的各个段被加载在内存的什么位置。举个例子很容易就明白,下面原创 2022-02-12 17:52:24 · 3168 阅读 · 0 评论 -
变量究竟是存在寄存器还是堆栈?
1. 变量是放在寄存器里还是堆栈里?堆栈对于处理器来说就是一块内存区域,而寄存器是处理器触手可及的存储,对于RISC 处理器而言,堆栈中的数据CPU并不能直接进行运算,还是要先加载到寄存器中才行。对于编译器而言,我猜测还是优先会选择将变量用寄存器保存。那什么时候需要用到堆栈呢?什么东西需要保存到堆栈呢?一种是需要切换上下文的地方,另一种是需要传参的地方。函数调用就是一种典型应用。2. 函数调用时的栈与寄存器一个典型的函数调用流程如上图所示,关键的涉及栈和寄存器的步骤如下:首先,在调用其他函数前,原创 2022-01-18 16:43:46 · 3074 阅读 · 0 评论 -
RISC-V汇编学习中的一些思考
1. 立即数立即操作数,immediate operand,是我觉得在汇编中比较难理解的概念之一了。立即数简单理解就是被编译在指令中的,能被处理器立即使用的常数。在CPU的算数逻辑计算单元 (ALU) 中,能接触到的值只能是来自寄存器的值或者是立即数,他没法儿直接去内存中获取值,内存中的数值必须先被取到寄存器中,然后才能被运算。比如下面这几句C代码:int a , b;a = 5;b = b + a;ALU要处理a和b的值,就必须先把他们的值取到寄存器中,因为a和b都是变量,他们在内存中都有自己原创 2022-01-11 15:56:28 · 1979 阅读 · 0 评论 -
为什么CPU需要不同的特权等级?
如下图是一个经典的x86的特权等级示意图,x86有0~3共4级特权等级,但一般只有0级和3级常用。操作系统/内核工作于特权等级0,用户则工作于最低的特权等级3。1. 特权等级是谁实现的?当我们描述特权等级的时候,一定要区分的一个概念是:特权等级是CPU实现的,还是操作系统实现的?答案是CPU实现的。操作系统的不同模式是在CPU实现的基础上进行对应的。2. 特权等级怎么实现的?这里举一个RISC-V处理器的例子如下,RISC-V处理器定义了三种不同的特权等级,M,S,U三种,其中M是最高的等级,可以原创 2022-01-04 15:10:34 · 1315 阅读 · 0 评论