mmap内存映射
mmap
将一个文件或者其它对象映射进内存
mmap操作提供了一种机制,让用户程序直接访问设备内存,这种机制,相比较在用户空间和内核空间互相拷贝数据,效率更高
mmap映射内存必须是页面大小的整数倍,面向流的设备不能进行mmap
void* mmap ( void * addr, size_t len, int prot, int flags, int fd, off_t offset )
fd:即将映射到进程空间的文件描述字,一般由open()返回
len:映射到调用进程地址空间的字节数
offset:被映射文件开头offset个字节开始。一般设为0,表示从文件头开始映射
prot :指定共享内存的访问权限
- PROT_READ(可读)
- PROT_WRITE (可写)
- PROT_EXEC (可执行)
- PROT_NONE(不可访问)
flags:MAP_SHARED , MAP_PRIVATE必选其一,而MAP_FIXED则不推荐使用
addr:指定文件应被映射到进程空间的起始地址,一般被指定一个空指针,此时选择起始地址的任务留给内核来完成
返回值:文件映射到进程空间的地址
munmap
删除特定地址区域的对象映射
int munmap( void * addr, size_t len )
内核与用户空间通讯
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/mm.h>
static int __init init(void)
{
//分配共享内存(一个页面)
p = __get_free_pages(GFP_KERNEL, 0);
//#define virt_to_page(kaddr) (mem_map + (__pa(kaddr) >> PAGE_SHIFT))
SetPageReserved(virt_to_page(p));
printk("<1> p = 0x%08x\n", p);
//在共享内存中写上一个字符串
strcpy(p, "Hello world!\n");
return 0;
}
static void __exit exit(void)
{
ClearPageReserved(virt_to_page(p));
free_pages(p, 0);
}
module_init(init);
module_exit(exit);
内核空间申请内存
kmalloc和__get_free_pages:< 896M 且虚拟地址和PA都连续。返回的是虚拟地址
vmalloc():高端内存分配 > 896M 虚拟地址是连续,PA不一定连续
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!