深度解析openeuler/libummu:用户空间内存管理单元的革命性解决方案
深度解析openeuler/libummu:用户空间内存管理单元的革命性解决方案
【免费下载链接】libummuAn UMMU driver on user space, provide UMMU device registration,initialization,configuration table management,address translation table management, and permission table management.项目地址: https://gitcode.com/openeuler/libummu
前往项目官网免费下载:https://ar.openeuler.org/ar/
openeuler/libummu是一款运行在用户空间的UMMU驱动,提供UMMU设备注册、初始化、配置表管理、地址转换表管理和权限表管理等核心功能,为开发者打造高效、安全的内存管理体验。
🌟 UMMU驱动:重新定义用户空间内存管理
🔍 什么是UMMU?
UMMU(User-Mode Memory Management Unit)是一种创新的用户空间内存管理单元,它打破了传统内存管理的限制,允许用户空间进程直接管理内存资源,无需频繁切换到内核态,从而显著提升系统性能。
🚀 UMMU的核心优势
- 高效性能:减少内核态与用户态切换,降低系统开销
- 灵活管理:支持多种内存地址段管理模式
- 细粒度权限控制:提供丰富的访问权限选项,保障内存安全
- 简化开发:提供直观易用的API接口,降低开发门槛
📊 UMMU架构设计与核心组件
🏗️ 整体架构
UMMU系统采用分层架构设计,主要由用户态进程、UMMU库和UMMU内核驱动组成:
-------------------- | user-mode process| -------------------- | -------------------------------------------------- | UMMU library | | -------- ---------- --------- | | | main | | segmng | | queue | | | -------- ---------- --------- | | -------- ------------ ---------------- | | | mapt | | resource | | common utils | | | -------- ------------ ---------------- | -------------------------------------------------- | | -------------------- | | UMMU-CORE driver |-------- | -------------------- | | | | | --------------- ------- | UMMU driver | | DDR | --------------- -------🧩 核心模块解析
main模块:初始化UMMU上下文并打开/dev/ummu/tid设备,是UMMU库的入口点。
segmng模块:管理每个TID的内存段,包括添加或移除内存段,确保内存资源的有序分配。
queue模块:管理UMMU用户态队列的创建和销毁,并提供向这些队列发送命令的接口。
mapt模块:管理每个TID的内存地址权限表(MAPT),支持插入、更新和清除操作,实现细粒度的内存访问控制。
resource模块:与UMMU驱动交互,包括分配/释放TID、初始化/取消初始化用户态队列、分配/释放MAPT块等核心资源管理功能。
common utils模块:提供日志记录、内存映射、位操作等通用辅助功能,为其他模块提供基础支持。
🛠️ UMMU核心功能与API详解
🔑 关键资源管理
UMMU库管理三类关键资源,通过UMMU-CORE驱动提供的ioctl接口,用户态进程可以通过设备文件/dev/ummu/tid进行资源分配和管理:
- TID(Token ID):由UMMU-CORE驱动在特定范围内分配的唯一标识,用于标识用户态进程和I/O设备。
- MAPT(Memory Address Permission Table):存储在DDR中,UMMU-CORE驱动分配物理内存并将其虚拟地址返回给用户态进程,用户态进程通过特定偏移访问虚拟地址来管理MAPT条目。
- 用户态队列:在固定硬件寄存器中实现,UMMU-CORE驱动将队列的物理地址映射为虚拟地址并返回给用户态进程,用户态进程通过写入映射的虚拟地址发送命令。
📚 核心API接口
1. 分配TID:ummu_allocate_tid
ummu_allocate_tid(struct ummu_tid_attr *tid_attr, uint32_t *tid)该函数为用户态进程和I/O设备分配唯一ID。支持两种内存地址权限表模式:
MAPT_MODE_ENTRY:仅支持一个TID管理一个内存地址段MAPT_MODE_TABLE:支持一个TID管理多个内存地址段
2. 授予内存访问权限:ummu_grant
ummu_grant(uint32_t tid, void *data, size_t data_size, enum ummu_mapt_perm perm, struct ummu_seg_attr *seg_attr)为内存段添加访问权限,并将该内存段与TID绑定。支持多种访问权限:
- 基本权限:读(MAPT_PERM_R)、写(MAPT_PERM_W)、读写(MAPT_PERM_RW)
- 原子操作权限:原子读(MAPT_PERM_ATOMIC_R)、原子写(MAPT_PERM_ATOMIC_W)、原子读写(MAPT_PERM_ATOMIC_RW)
3. 撤销内存访问权限:ummu_ungrant
ummu_ungrant(uint32_t tid, void *data, size_t size)移除内存段的访问权限,并解除内存段与TID的绑定。
4. 释放TID:ummu_free_tid
ummu_free_tid(uint32_t tid)释放与目标TID绑定的所有内存段资源。
💻 快速上手:UMM使用示例
以下是一个简单的C语言示例,展示用户态进程如何分配内存并与I/O设备共享:
struct ummu_tid_attr tid_attr = {.mode = MAPT_MODE_TABLE}; struct dev_dma_info info = { 0 }; struct ummu_token_info token = { .tokenVal = 0xbeaf, }; struct ummu_seg_attr seg_attr = {.token = &token, .e_bit = UMMU_EBIT_OFF}; info.token_info.tokenVal = token.tokenVal; info.mode = MAPT_MODE_TABLE; info.with_token = 1; info.size = 0x1000; info->va = (uint32_t *)mmap(NULL, info.size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (!info->va) { printf("mmap memory %d bytes failed.\n", info->size); return -1; } ummu_allocate_tid(&tid_addr, &info.tid); ummu_grant(info.tid, info.va, info.size, MAPT_PERM_R, &seg_attr); // 使用共享内存... ummu_ungrant(info.tid, info.va, info.size); ummu_free_tid(info.tid); munmap(info.va, info.size);⚠️ 使用限制与注意事项
在使用UMMU时,需要注意以下限制:
当以MAPT_MODE_TABLE模式分配TID时,起始虚拟地址必须4K对齐。
不支持内存段的部分撤销,必须整体撤销。
在单个TID内,内存段不得重叠,重叠是严格禁止的。
由于UMMU不支持IOPF,用户态进程在共享内存之前必须手动固定分配的内存页。内存固定函数(如pin_user_pages_fast)只能在内核空间调用,因此通常使用专用的内核驱动来管理内存分配和固定。
📚 进一步学习与资源
- API文档:详细的API说明请参考doc/API.md
- 设计文档:UMMU的架构设计细节请参考doc/Design.md
- 源代码:核心实现文件包括ummu_main.c、ummu_map.c、ummu_seg_mng.c等
🚀 开始使用openeuler/libummu
要开始使用openeuler/libummu,首先克隆仓库:
git clone https://gitcode.com/openeuler/libummu然后参考文档进行编译和安装,即可体验这款革命性的用户空间内存管理解决方案。
openeuler/libummu为用户态内存管理带来了新的可能,无论是系统开发者还是应用程序员,都能从中获得更高效、更灵活的内存管理体验。立即尝试,开启你的内存管理新篇章!
【免费下载链接】libummuAn UMMU driver on user space, provide UMMU device registration,initialization,configuration table management,address translation table management, and permission table management.项目地址: https://gitcode.com/openeuler/libummu
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
