mmap

内核空间与用户空间共享内存(mmap)

好多次遇见mmap,但都没有实际实验过,最近终于抽出时间做了个mmap的小实验。这篇博文中的代码是在其他人的基础上修改而成,并非个人原创。

一、mmap实现方法:
将内核的物理内存通过mmap映射到用户空间,直接在用户空间对内核数据进行存取。
1、在内核中分配一片内存(kzalloc/__get_free_pages),将这片内存的虚拟地址转换成物理地址;
2、在内核的mmap函数中通过remap_pfn_range实现内核物理内存空间映射到用户虚拟地址空间转换的功能;
3、在应用程序中可以调用用户态的mmap函数,完成内核物理内存向用户空间的映射;
4、可直接利用这片被映射了的用户空间对内核空间进行存取操作。

二、程序实现功能:
1、创建mmap_dev字符设备,实现该设备的mmap函数;
2、在/proc中创建获取内核中分配的物理内存信息(起始地址和大小)的接口;
3、通过/proc读取内核中分配的物理内存信息(起始地址和大小);
4、通过读取的这些内存信息调用mmap函数,完成用户空间到内核空间的映射;
5、向这片映射过的用户空间写入数据。

Continue reading “内核空间与用户空间共享内存(mmap)” »