Matrix653 虚拟内存管理

更新时间:
2023-12-14
下载文档

Matrix653 虚拟内存管理

本节将介绍 Matrix653 VMM 虚拟内存管理相关的使用。用户可通过 VMM 提供的 API 进行对应的虚拟内存和物理内存建立映射等各种用法。 本节详细定义在 mx_vmm.h 头文件中。

虚拟内存管理相关 API

下表展示了虚拟内存管理相关的 API:

API描述
_mx_vmm_context_query查询虚拟内存地址对应的物理地址
_mx_vmm_context_map建立映射关系
_mx_vmm_context_unmap解除映射关系

_mx_vmm_context_query()

  • 描述 查询虚拟内存地址对应的物理地址

  • 函数原型

extern RETURN_CODE_TYPE _mx_vmm_context_query (
        /*in  */ MX_VMM_CONTEXT_TYPE    *vmm_context,
        /*in  */ MX_VIRT_ADDR_TYPE      virt_addr,
        /*out */ MX_PHYS_ADDR_TYPE      *phys_addr,
        /*out */ MX_VMM_ATTR_TYPE       *map_attr);
  • 参数
输入/输出参数描述
[in]vmm_contextVMM 上下文
[in]virt_addr要查询的虚拟内存地址
[out]phys_addr输出物理内存地址
[out]map_attr此虚拟内存页面对应的映射属性
  • 返回值 Matrix653 内核错误码

  • 注意事项

  • 示例

RETURN_CODE_TYPE     ret;
MX_PHYS_ADDR_TYPE    phy_addr;
MX_VMM_ATTR_TYPE     map_attr;
MX_VMM_CONTEXT_TYPE  *vmm_context;

vmm_context = &(MX_PSEUDO_PARTITION()->vmm_context);

ret = _mx_vmm_context_query(vmm_context, __mx_board_config.kdata_section.start_address, &phy_addr, &map_attr);
mx_put_string_unsigned_dec_new_line("_mx_vmm_context_query() return: ", ret);
mx_put_string_hex_new_line("map_attr = ", map_attr);
mx_put_string_hex_new_line("phy_addr = ", phy_addr);

_mx_vmm_context_map()

  • 描述 建立映射关系

  • 函数原型

extern RETURN_CODE_TYPE _mx_vmm_context_map (
        /*in  */ MX_VMM_CONTEXT_TYPE    *vmm_context,
        /*in  */ MX_VIRT_ADDR_TYPE      virt_addr,
        /*in  */ MX_PHYS_ADDR_TYPE      phys_addr,
        /*in  */ MX_VIRT_SIZE_TYPE      size,
        /*in  */ MX_VMM_ATTR_TYPE       map_attr,
        /*in  */ MX_CPU_BITMAP_TYPE     tlb_inv_cpus_bitmap);
  • 参数
输入/输出参数描述
[in]vmm_contextVMM 上下文
[in]virt_addr虚拟地址
[in]phys_addr物理地址
[in]size映射大小
[in]map_attr映射属性
[in]tlb_inv_cpus_bitmapTLB 无效 CPU 位图
  • 返回值 Matrix653 内核错误码

  • 注意事项

  • 示例

RETURN_CODE_TYPE     ret;
MX_VIRT_ADDR_TYPE    virt_addr = 0xc0000000;
MX_PHYS_ADDR_TYPE    phys_addr = 0x4000000;
MX_VIRT_SIZE_TYPE    map_size  = 0x1000;
MX_VMM_ATTR_TYPE     map_attr  = MX_VMM_ATTR_RWX | MX_VMM_ATTR_CACHE_WRITE_THROUGH;
MX_CPU_BITMAP_TYPE   cpubitmap = (1 << 0);
MX_VMM_CONTEXT_TYPE  *vmm_context;

vmm_context = &(MX_PSEUDO_PARTITION()->vmm_context);

ret = _mx_vmm_context_map(vmm_context, virt_addr, phys_addr, map_size, map_attr, cpubitmap);
mx_put_string_unsigned_dec_new_line("_mx_vmm_context_map() return: ", ret);

_mx_vmm_context_unmap()

  • 描述 解除映射关系

  • 函数原型

extern RETURN_CODE_TYPE _mx_vmm_context_unmap (
        /*in  */ MX_VMM_CONTEXT_TYPE    *vmm_context,
        /*in  */ MX_VIRT_ADDR_TYPE      virt_addr,
        /*in  */ MX_VIRT_SIZE_TYPE      size,
        /*in  */ MX_CPU_BITMAP_TYPE     tlb_inv_cpus_bitmap);
  • 参数
输入/输出参数描述
[in]vmm_contextVMM 上下文
[in]virt_addr虚拟地址
[in]size映射大小
[in]tlb_inv_cpus_bitmapTLB 无效 CPU 位图
  • 返回值 Matrix653 内核错误码

  • 注意事项

  • 示例

RETURN_CODE_TYPE     ret;
MX_VIRT_ADDR_TYPE    virt_addr = 0xc0000000;
MX_VIRT_SIZE_TYPE    map_size  = 0x1000;
MX_CPU_BITMAP_TYPE   cpubitmap = (1 << 0);
MX_VMM_CONTEXT_TYPE  *vmm_context;

vmm_context = &(MX_PSEUDO_PARTITION()->vmm_context);

ret = _mx_vmm_context_unmap(vmm_context, virt_addr, map_size, cpubitmap);
mx_put_string_unsigned_dec_new_line("_mx_vmm_context_unmap() return: ", ret);
文档内容是否对您有所帮助?
有帮助
没帮助