前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DragonOS的MMIO地址空间自动分配

DragonOS的MMIO地址空间自动分配

作者头像
灯珑LoGin
发布2022-10-31 15:35:15
8330
发布2022-10-31 15:35:15
举报
文章被收录于专栏:龙进的专栏

代码

本文涉及到的代码,可查看对应的版本的链接:https://github.com/fslongjin/DragonOS/tree/1e8e6523dfde96cf359c5f329123f7cc0ca62d67

为什么需要MMIO地址空间自动分配?

由于计算机上的很多设备都需要MMIO的地址空间,而每台计算机上所连接的各种设备的对MMIO地址空间的需求是不一样的。如果我们为每个类型的设备都手动指定一个MMIO地址,会使得虚拟地址空间被大大浪费,也会增加系统的复杂性。并且,我们在将来还需要为不同的虚拟内存区域做异常处理函数。因此,我们需要一套能够自动分配MMIO地址空间的机制。

这套机制提供了什么功能?

  • 为驱动程序分配4K到1GB的MMIO虚拟地址空间
  • 对于这些虚拟地址空间,添加到VMA中进行统一管理
  • 可以批量释放这些地址空间

这套机制是如何实现的?

这套机制本质上是使用了伙伴系统来对MMIO虚拟地址空间进行维护。在mm/mm.h中指定了MMIO的地址空间范围,这个范围是0xffffa10000000000开始的1TB的空间。也就是说,这个伙伴系统为MMIO维护了这1TB的虚拟地址空间。

地址空间分配过程

  1. 初始化MMIO-mapping模块,在buddy中创建512个1GB的__mmio_buddy_addr_region
  2. 驱动程序使用mmio_create请求分配地址空间。
  3. mmio_create对申请的地址空间大小按照2的n次幂进行对齐,然后从buddy中申请内存地址空间
  4. 创建VMA,并将VMA标记为VM_IO|VM_DONTCOPY。MMIO的vma只绑定在initial_mm下,且不会被拷贝。
  5. 分配完成

一旦MMIO地址空间分配完成,它就像普通的vma一样,可以使用mmap系列函数进行操作。

MMIO的映射过程

在得到了虚拟地址空间之后,当我们尝试往这块地址空间内映射内存时,我们可以调用mm_map函数,对这块区域进行映射。

该函数会对MMIO的VMA的映射做出特殊处理。即:创建Page结构体以及对应的anon_vma

然后,会将对应的物理地址,填写到页表之中。

MMIO虚拟地址空间的释放

当设备被卸载时,驱动程序可以调用mmio_release函数对指定的mmio地址空间进行释放。

释放的过程中,mmio_release将执行以下流程:

  1. 取消mmio区域在页表中的映射。
  2. 将释放MMIO区域的VMA
  3. 将地址空间归还给mmio的伙伴系统。

转载请注明来源:https://longjin666.cn/?p=1528

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年8月20日2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码
  • 为什么需要MMIO地址空间自动分配?
  • 这套机制提供了什么功能?
  • 这套机制是如何实现的?
    • 地址空间分配过程
      • MMIO的映射过程
        • MMIO虚拟地址空间的释放
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档