• spdk 建立的用户态页表


    基础

    spdk 建立了一套用户态的 3级页表,来方便在用户态进行虚拟地址到物理地址的转化。
    3级页表是:256TiB-> 1GiB -> 2MiB

    • 第三级页表:[30..47]
    • 第二级页表:[21..29]
    • 最小的页是2M,偏移范围是[0..20]

    二级页表容纳 1GB 的地址空间,那么需要占用 1G/2M = 2^9, 也就是 9 bits 的地址位。也就是 [21..29]。
    三级页表容纳 256TB 的地址空间,那么需要占用 256 T/1G = 2^18, 也就是 16 bits 的地址位。也就是[30..47]。

    dpdk 的内存,以及非dpdk 的内存,例如 vhost-user 来自 qemu的内存都需要经过 spdk_mem_register 来注册到 spdk 的用户态内存页表管理中。

    spdk 对于用户态内存页表的管理:

    1. g_mem_reg_map 管理256TB 的三级页表;
    2. 通过 spdk_mem_map_alloc 注册hook 回调,同时也会调用已经注册(spdk_mem_register)的回调;
    3. spdk_mem_register 注册新的虚拟内存到 g_mem_reg_map 上,并且触发所有的回调;
    4. 初始化的时候,dpdk 的内存需要调用 spdk_mem_register 注册到 g_mem_reg_map 上。

    内部实现

    首先来看 spdk_mem_register。
    下面的循环翻译虚拟地址对应的页表项是否已经设置(registered)。如果已经注册,那么就返回 EBUSY。

    1. 386 seg_vaddr = vaddr;
    2. 387 seg_len = len;
    3. 388 while (seg_len > 0) {
    4. 389 reg = spdk_mem_map_translate(g_mem_reg_map, (uint64_t)seg_vaddr, NULL);
    5. 390 if (reg & REG_MAP_REGISTERED) {
    6. 391 pthread_mutex_unlock(&g_spdk_mem_map_mutex);
    7. 392 return -EBUSY;
    8. 393 }
    9. 394 seg_vaddr += VALUE_2MB;
    10. 395 seg_len -= VALUE_2MB;
    11. 396 }
    12. 397

    下面的循环只是设置对应的页表项为 REG_MAP_REGISTERED,表明已经注册了此段虚拟地址空间。

    1. 398 seg_vaddr = vaddr;
    2. 399 seg_len = 0;
    3. 400 while (len > 0) {
    4. 401 spdk_mem_map_set_translation(g_mem_reg_map, (ui
  • 相关阅读:
    告别手机自带浏览器,分享2022年好用的手机浏览器
    k8s2-4控制器操作指令
    Mental Poker- Part 2
    Java-枚举
    nginx-proxy反向代理缓存
    隆云通管道温湿度传感器
    大咖说*每周推荐 | 云采销助力中小企业获客提升 300%
    ♥Redis教程 - Redis知识体系详解♥
    RabbitMQ复习笔记
    【ArcGIS Pro微课1000例】0033:ArcGIS Pro处理cad数据(格式转换、投影变换)
  • 原文地址:https://blog.csdn.net/lingshengxiyou/article/details/127774179