dictionary - mmap 支持截面图吗?
问题描述
我希望在用户空间中映射一个内存块来读/写,用一个文件映射。内存块大小超过12M。为了提高性能,我想要map with section,但我跟踪linux内核(4.19),似乎只支持页面映射。调用栈是remap_pfn_range-->remap_p4d_range->remap_p4d_range->remap_pmd_range。在remap_pmd_range函数中,为什么不支持section map呢?
static inline int remap_pmd_range(struct mm_struct *mm, pud_t *pud,
unsigned long addr, unsigned long end,
unsigned long pfn, pgprot_t prot)
{
pmd_t *pmd;
unsigned long next;
int err;
pfn -= addr >> PAGE_SHIFT;
pmd = pmd_alloc(mm, pud, addr);
if (!pmd)
return -ENOMEM;
VM_BUG_ON(pmd_trans_huge(*pmd));
do {
next = pmd_addr_end(addr, end);
err = remap_pte_range(mm, pmd, addr, next,
pfn + (addr >> PAGE_SHIFT), prot);
if (err)
return err;
} while (pmd++, addr = next, addr != end);
return 0;
}
不过还有一个类似的功能,支持剖面图,代码如下:
static inline int ioremap_pmd_range(pud_t *pud, unsigned long addr,
unsigned long end, phys_addr_t phys_addr, pgprot_t prot)
{
pmd_t *pmd;
unsigned long next;
phys_addr -= addr;
pmd = pmd_alloc(&init_mm, pud, addr);
if (!pmd)
return -ENOMEM;
do {
next = pmd_addr_end(addr, end);
if (ioremap_pmd_enabled() &&
((next - addr) == PMD_SIZE) &&
IS_ALIGNED(phys_addr + addr, PMD_SIZE) &&
pmd_free_pte_page(pmd, addr)) {
if (pmd_set_huge(pmd, phys_addr + addr, prot)) /* support section map*/
continue;
}
if (ioremap_pte_range(pmd, addr, next, phys_addr + addr, prot))
return -ENOMEM;
} while (pmd++, addr = next, addr != end);
return 0;
}
我不知道为什么ioremap_pmd_range 支持section map,但是remap_pmd_range 不支持,谁能帮忙解释一下为什么?有什么办法让mmap map with section?
解决方案
推荐阅读
- elasticsearch - Elasticsearch 中具有单个字段的子聚合
- amazon-web-services - 如何通过 SSH 连接到 Redhat EC2 实例?
- angular - 带有分页和行跨度的材料表不起作用
- javascript - 如何使用键/值对Javascript将数组转换为对象
- selenium - 我正在使用 selenium 远程驱动程序 3.141.59.jar 和 guava-25.0-jre.jar 但我收到如下所述的错误
- tinymce - TinyMCE 编辑器是否支持 webp 类型的图片上传?
- joomla - 即使在完成安装后,Joomla 4.0.3 也会重新启动安装程序
- swiftui - SwiftUI NavigationLink 控制台错误(SwiftUI 在推送导航链接时遇到问题。请提交错误。)
- echarts - 连接除y轴缩放以外的echarts
- xslt - For-Each 标签不基于 XSLT 1.0 中的两个单独的详细信息部分标签打印