制作一个RISC-V的操作系统八-内存管理(内存管理分类 链接脚本 ld 脚本语法 从ld 脚本获取符号值 基于page级别实现动态分配 管理heap区域各个page的状态 动态分配(页级别) 代码)

内存管理分类

在这里插入图片描述

链接脚本

通过链接脚本将各个目标文件链接起来
最终多了个program table
在这里插入图片描述
在这里插入图片描述

ld 脚本语法

在这里插入图片描述
在这里插入图片描述
memory就是规定一片区域
其中rx表明该段内存是只读区域
origin起始位置 length是长度
在这里插入图片描述
.代表当前位置指针,.=0x10000就是代表当前指针为0x10000.>ram代表将这些section布局加载到名为ram的内存区域里去

在这里插入图片描述
赋值给一个符号
在这里插入图片描述

从ld 脚本获取符号值

在这里插入图片描述

基于page级别实现动态分配

page级别就是4k大小
就是在heap中动态分配page级别的大小
在这里插入图片描述

管理heap区域各个page的状态

链表方式:将heap区域所有没有分配的page通过链表链接起来,所有分配的区域也通过一个链表链接起来
数组方式:即通过一个数组表示heap区域的所有page,通过设定某些标志位表示该数组对应的page是否被分配
在这里插入图片描述

动态分配(页级别)

在这里插入图片描述
在这里插入图片描述

代码

总体来说实现两部分,内存布局和动态分配内存

链接脚本和汇编memory.S实现内存布局
动态分配页通过page.c实现

  • word:代表四个字节

  • 汇编中可以使用链接脚本中的符号来赋值,只不过要当链接后才会生效,即生成目标文件时并不会赋值成功(该符号会被识别为未定义符号(Undefined symbol)表示该符号在当前目标文件中没有定义,在链接阶段会被解析为其他目标文件中定义的符号。在这种情况下,_heap_start 可能在其他目标文件中定义,并在链接阶段被解析。)

  • extern关键字不仅可以用于声明在其他C文件中定义的全局变量,还可以用于声明在汇编文件中定义的全局变量。这种情况通常发生在嵌入式开发或者底层系统编程中,需要与汇编代码进行交互。

  • data段里声明了一个变量, 这个变量的值会被包进ELF里,ELF文件里会包括这个变量的符号与值,但是如果比如编译器发现, 你有些变量一开始是0, 编译器就可以只存他们的符号, 不存值(反正都是0), 把他们都放到BSS段中(参考大佬 刘霁兰

  • la是"load address"的缩写,是一条伪指令,用于将某个符号的地址加载到寄存器中。

  • bgeu是"branch if greater or equal, unsigned"的缩写,是一条条件分支指令。

  • sw 是store word

  • addi是add immediate

  • bltu 是branch if less than unsigned

  • sll是Shift Left Logical

代码链接https://github.com/FULLK/risllkos

待完善(等总体完善后再补上去😄)

在这里插入图片描述

在这里插入图片描述

  • 30
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看星猩的柴狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值