静态网页空间 静态空间图片


create_mapping函数结束后回到其最开始的调用位置paging_init函数 。执行dma_contiguous_remap函数 。开始处理虚拟地址空间的静态映射 。基本处理流程如下↓
1.从指定内存域取出需要映射的空间.
2.清洗相应的硬件MMU空间.
3.填充map.
4.建立映射表空间.
5.同时将其加入到静态映射空间链表管理 。

静态网页空间 静态空间图片

文章插图
dma_contiguous_remap函数
静态网页空间 静态空间图片

文章插图
dma_contiguous_remap实现(1)
  • 第32行:遍历dma_mmu_remap,将其中管理的内存域依次填充成map的结构来处理 。还记得dma_mmu_remap里面管理的是什么吗?请回顾

静态网页空间 静态空间图片

文章插图
dma_contiguous_remap实现(2)
  • 第59行:以PMD为步长,初始化pmd表项空间,并刷洗硬件MMU相应与之对应的TLB
  • 第61行:刷洗内核内start到end区间内的TLB,这个函数细节暂不分析 。
  • 第64行:初始化这一段表空间,实现↓

静态网页空间 静态空间图片

文章插图
iotable_init
  • 第12行:向memblock申请静态结构数据(svm)空间,1个map对应一个svm
  • 第14行:对map建立物理映射关系表
  • 16~21行:将建立的映射关系同步设置到对应的svm
  • 第22行:将svm添加到static_vmlist进行管理
dma_contiguous_remap函数结束,回到上级调用处,接下来是devicemaps_init函数 。
devicemaps_init函数
静态网页空间 静态空间图片

文章插图
devicemaps_init实现(1)
  • 第74行:向memblock申请了2页的空间
  • 第76行:CPU架构相关暂不分析
  • 第79行:填充从VMALLOC_START开始到最后的PMD表项空间,并清空硬件MMU相应的TLB

静态网页空间 静态空间图片

文章插图
devicemaps_init实现(2)
静态网页空间 静态空间图片

文章插图
【静态网页空间 静态空间图片】devicemaps_init实现(3)
  • 定义了XIP_KERNEL、FLUSH_BASE、FLUSH_BASE_MINCACHE则建立相应的物理内存映射关系

静态网页空间 静态空间图片

文章插图
devicemaps_init实现(4)
静态网页空间 静态空间图片

文章插图
devicemaps_init实现(5)
  • 第116~124行:将vector页框映射到起始地址为0xffff0000的位置 大小为1页
  • 第126~130行:如果存在low_vector则将vector页框同时映射到起始地址为0的位置,大小为2页
  • 第144行:内核提供给用户的创建外设IO资源静态映射到内核地址空间的接口
  • 第147行:在静态映射链表上因为每个PMD包含2个pmd_t,分别是PMD[0]和PMD[1].每个占用1M空间,实际使用过程中有的可能只使用了其中的一半,另一半未被初始化 。为了避免这个问题所以就有了这个函数 。一旦静态映射就绪,就使用插入假VM的形式避免另一半被ioremap或者其他拿去使用 。实现细节↓
  • 第150行:保留PCI设备的IO空间,与上面分析类似
fill_pmd_gaps函数
静态网页空间 静态空间图片

文章插图
fill_pmd_gaps实现(1)
静态网页空间 静态空间图片

文章插图
fill_pmd_gaps实现(2)
静态网页空间 静态空间图片

文章插图
fill_pmd_gaps实现(3)


特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。