鸿蒙轻内核A核源码分析系列五 虚实映射(7)虚实映射Flag属性 原创 精华
7、Flag标签属性
【#本文正在参与优质创作者激励#】
在学习函数LOS_ArchMmuMap()
代码时,我们已经了解了虚拟内存如何映射到物理内存,在映射的时候,可以通过UINT 32 flags
参数定一些标签属性信息。本节,我们具体了解下内存标签属性信息。先了解下MMU标签属性,然后看看映射内存区间时的映射虚实信息,最后了解下属性信息转换函数。
7.1 MMU标签属性
在映射的时候,对于内存页可以指定一些内存属性,比如权限、内存类型、缓存策略等等。更多信息参考ARM官网资料《ARM® Cortex™-A Series Version: 4.0 Programmer’s Guide》,我们只快速摘录些关键信息。L1页表项的格式如下图所示,其中Type extension (TEX)
, Shareable (S)
, Access Permission (AP, APX)
、 Cacheable (C)
、 Bufferable (B)
位表示内存属性信息。在arch\arm\arm\include\los_mmu_descriptor_v6.h
文件中定义了MMU L1页表内存属性相关的宏,如下。
L2页表项的格式如下图所示。在arch\arm\arm\include\los_mmu_descriptor_v6.h
文件中定义了MMU L2页表内存属性相关的宏,如下。
7.2 映射地址区间标签属性
kernel\base\include\los_vm_map.h
文件中定义地址区间映射标签属性信息。标签属性信息主要分为4类,如图所示。前2位用于标记释放缓存设备,2-5位用于标记权限信息,6-8位用于标记共享私有等信息,9-19位用于标记stack、heap、data、text、bss、vsdo、mmap、shm、fixed、fixed_noreplace等属性信息。20-23位暂未使用,高8位被共享内存SHM使用。
7.3 标签转换操作
7.3.1 OsCvtProtFlagsToRegionFlags函数
函数OsCvtProtFlagsToRegionFlags()
把保护属性转换为虚拟内存区间标签属性,该函数在系统调用、共享内存等模块会使用。参数unsigned long prot
中的保护标签属性如PROT_READ
、MAP_SHARED
等等,定义在文件third_party/musl/porting/liteos_a/kernel/include/sys/mman.h
。
7.3.2 OsCvtSecFlagsToAttrs函数和OsCvtSecAttsToFlags函数
OsCvtSecFlagsToAttrs
函数用于把内存区域映射标签属性转换为L1 Section类型页表项的MMU标签属性。该函数又分为2个函数,分别是⑴处的OsCvtSecCacheFlagsToMMUFlags()
函数和⑵处的OsCvtSecAccessFlagsToMMUFlags()
函数。OsCvtSecCacheFlagsToMMUFlags()
函数主要判断内存映射区域的低2位缓存标签属性的转换。OsCvtSecAccessFlagsToMMUFlags()
函数用于映射标签属性的2-4位访问权限部分的转换。代码比较简单不再赘述。
⑶处的函数OsCvtSecAttsToFlags()
是上述函数OsCvtSecFlagsToAttrs
的逆过程,用于把L1 Section类型页表项的MMU标签属性转换为内存区域映射标签属性。自行阅读代码,不再逐行分析。
7.3.3 OsCvtPte2FlagsToAttrs函数和OsCvtPte2AttsToFlags函数
和上一小节非常类似,上节是L1 Section类型页表项MMU属性和内存区域标签属性的相互转换,本节的2个函数是L2页表项MMU属性和内存区域标签属性的相互转换。函数OsCvtPte2FlagsToAttrs()
把内存区域映射标签属性转换为L2页表项MMU属性,又分为2个函数,分别是⑴处的函数OsCvtPte2CacheFlagsToMMUFlags()
和⑵处的OsCvtPte2AccessFlagsToMMUFlags()
。OsCvtPte2CacheFlagsToMMUFlags()
函数主要判断内存映射区域的低2位缓存标签属性的转换。OsCvtPte2AccessFlagsToMMUFlags()
函数用于映射标签属性的2-4位访问权限部分的转换。代码比较简单不再赘述。
⑶处的函数OsCvtPte2AttsToFlags()
是上述函数OsCvtPte2FlagsToAttrs
的逆过程,用于把L2页表项的MMU标签属性转换为内存区域映射标签属性。自行阅读代码,不再逐行分析。
小结
本文介绍了MMU虚实映射的基本概念,运行机制,分析了映射初始化、映射查询、映射虚拟内存和物理内存,解除虚实映射,更改映射属性,重新映射等常用接口的代码。由于水平有限,如果内容哪里有误,欢迎指正,不胜感激。感谢阅读,有什么问题,请留言。
【#本文正在参与优质创作者激励#】
very nice,特别是flag属性在哪个文件里,之前看了属性转换的函数,并没有明白这些函数还是有分类的
对社区小伙伴有价值,就很开心了