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不一定连续

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值