当前位置: 首页 > news >正文

HNU计院操作系统实验8

本次实验,需要使用arm提供的寄存器实现页表,地址转换功能。

使用字典树的思想逐级建立3级页表,VA达到48位,使用TTBR_EL0、TTBR_EL1寄存器将UART串口设备的虚拟地址和进程的虚拟地址分开映射,使得低异常级别的程序在硬件上无法越权访问高异常级别的系统地址空间

大家在做这个实验的时候记得调试的时候看一下自己的TTBR_EL0、TTBR_EL1是否真的有一个的值是高地址,之前很多同学都没有注意调试。

注意,每一个叶子节点的大小是4kb,虽然每个节点定义的是512entry但是512*9bit是4096b,注意考虑每个条目本身存储所占用的大小,每一级9位是arm的官方手册定的,不能乱改呀

推荐完成时间 60分钟 理解比较困难,可以借助ai理解一下

目录

1 实验项目一... 3

1.1 项目名称... 3

1.2 实验目的... 3

1.3 实验资源... 4

2 实验任务... 5

2.1 Armv8的地址转换... 5

2.2 前置知识... 5

2.2.1 粒度granule. 6

2.2.2 Gathering Reordering EarlyWriteAcknowledgement 7

2.3 Mmu管理... 9

2.3.1 src/bsp/mmu.c. 9

2.3.2 src/bsp/mmu.h. 10

2.3.3 src/bsp/cache_asm.S. 11

2.4 启用MMU.. 12

2.5 成品展示... 13

2.6 拆解代码原理... 14

2.6.1 定义映射区域... 15

2.6.2 设置映射的地址和页表大小... 16

2.6.3 设置粒度... 16

2.6.4 新建页表... 17

2.6.5 查找页表... 18

2.6.6 清除cache和buffer的数据... 19

2.6.7 重新置位... 20

2.7 Lab8作业... 20

3 总结... 23

3.1 实验中出现的问题... 23

3.2 真实感受... 23

  1. 实验项目一
    1. 项目名称

分页内存管理

    1. 实验目的

实现分页Page

    1. 实验资源

  1. 实验任务
    1. Armv8的地址转换

TTBR0指向整个虚拟空间下半部分通常用于应用程序的空间,TTBR1指向虚拟空间的上半部分通常用于内核的空间。其中TTBR0除了在EL1中存在外,也在EL2 and EL3中存在,但TTBR1只在EL1中存在。

这个分隔意味着OS不必为每个任务重新分配转换表了。

先选择基址寄存器,再进入每个条目,翻译成对应的PTE

    1. 前置知识

EL0是应用层,EL1是OS层

      1. 粒度granule

其实就是偏移offset范围,一页的大小

      1. Gathering Reordering EarlyWriteAcknowledgement

可以看出4kb粒度,启用写回写分配缓存机制

这里启用了之前已经算好的东西,那么重要的东西就有table,tcr,attr

    1. Mmu管理
      1. src/bsp/mmu.c

      1. src/bsp/mmu.h

      1. src/bsp/cache_asm.S

    1. 启用MMU

    1. 成品展示

可以看到确实在启用MMU

    1. 拆解代码原理

整个代码运作机制如图所示,我们整个程序的主要目的就是在主存内生成完整的页表给TTBR0用,然后做好粒度之类的设置(TCR)。

页表其实就像一棵树,只不过是按位来存储的,使用VPN查询页表的PTE,实际上VPN算是句柄,PTE算是一个节点,节点内存储了到达下一个节点的地址,也就是PFN。

现在我们的树是扁平化地存储在内存中的,DFS深度优先建树,从0级节点内的512个条目中的其中一个条目构建,然后再继续,直到最终指向物理空间的块(3级)。

      1. 定义映射区域

设备区域被定义的特别严格,根据这样的起始地址定义两个映射

      1. 设置映射的地址和页表大小

这里看链接文件的定义,以当前位置.分配了页表起始位置,然后长度就是以一个地址之间的差值定义的这个大小可以在链接文件里面修改。

      1. 设置粒度

MMU的粒度

      1. 新建页表

这里有512个条目,然后全部初始化为0

      1. 查找页表

这里和书上写的差不多

      1. 清除cache和buffer的数据

这里让这些东西无效化是害怕有未定义数据被写回内存里面,所以每次启动都要无效化一次

      1. 重新置位

这里重新置位了CMI位

    1. Lab8作业

第一次运行造成错误。

溢出了,需要把U32换成U64

Ld位置定义了这个符号表
ttbr1_el1没有被启用

  1. 总结
    1. 实验中出现的问题
  1. 几乎做完之前要崩溃了,有种思考乏力的感觉,像是缺乏休息,没有力气,这种状态,很难走出来
  2. 多出去走走吧,拓宽思路
  3. 找不到英文文档的重点,之前对页表的理解有偏差
    1. 真实感受
  1. 感谢某同学在北辰三角洲陪我走了一段路,我才能回过神来,不再踌躇
  2. 这实验弄懂了简单,没弄懂就难
  3. 数据结构真的很重要
  4. 头一次看到扁平化建512叉树,上一次看DFS深度优先建树,深度为3层还是在设备树那里
http://www.jsqmd.com/news/891281/

相关文章:

  • 游戏素材提取终极指南:开源资源库如何解决二次元素材获取难题
  • Android GPU Inspector状态跟踪和内存观察机制:如何深度分析GPU性能问题 [特殊字符]
  • Hima Z6018 999601802 印刷电路板
  • 构建企业级实时通信平台:Rocket.Chat Android原生客户端架构深度解析
  • 【AIGC内容创作黄金标准】:基于217篇获奖文案数据验证的ChatGPT创意输出评估矩阵
  • AI产品界面设计:从控制到协作,应对非确定性输出的设计策略
  • WzComparerR2:5分钟快速上手的冒险岛游戏数据提取神器
  • 高斯混合嵌套因子VAE:破解多元空气污染时序预测难题
  • 【企业级文档智能中枢构建指南】:用Claude实现合同/财报/专利长文档端到端推理闭环,含RAG增强+分块策略+证据溯源三重加固
  • 【收藏】2026年版:AI Coding崛起仅3年,程序员职场格局彻底改写!
  • 基于跨模态语义嵌入的对抗样本检测:原理、实现与实战分析
  • 企业级AI中台接入规范V2.3(含Swagger AI扩展协议、语义化错误码表、可观测性埋点标准)
  • 开发者完整指南:如何为CSS Ratiocinator贡献代码与测试
  • 茉莉花插件:5分钟掌握Zotero中文文献管理终极解决方案
  • 地图API费用5万?这些低成本替代方案让你轻松实现逆地址编码功能
  • 网络层协议深度解析:TCP与UDP的工作原理、报文格式与应用实践
  • AI热潮后PC组件价格将改善!阵亡将士纪念日,SSD等存储产品大折扣来袭
  • TVA硬件触发实现多模态数据精准同步
  • Outfit字体:免费开源的终极品牌字体解决方案,轻松打造专业视觉体验
  • 第十六章:企业Agent应用案例
  • 【ChatGPT学术引用黄金标准】:2024年全球主流期刊/高校认可的7种AI引用格式权威指南
  • 为内部知识库问答系统集成Taotoken多模型增强能力
  • 基于改进群延迟与自监督学习的合成语音检测:从信号本质到轻量部署
  • 协调CNN-LSTM-Attention模型:情感分类中的并行融合与注意力机制
  • 3PEAK思瑞浦 TPA6582Q-SO1R-S SOP8 运算放大器
  • 键盘打字总出“鬼影字符“?这个开源神器让你1分钟告别按键连击烦恼![特殊字符]
  • 燃气管网在线监测自动告警系统方案
  • Tiptap无头编辑器:现代Web内容创作的技术革命
  • HIMA Z6013 999601102电源模块
  • AI生成内容学术化重构全流程,从Prompt设计到语义熵压缩——教育部科技查新站认证的3级降重范式