• 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
    ", p);
        //在共享内存中写上一个字符串
        strcpy(p, "Hello world!
    ");
        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不一定连续

  • 相关阅读:
    包介绍、日志模块及深浅拷贝
    一些常用模块
    RE模块(正则)
    软件开发规范
    模块及模块导入
    一些常用的内置函数总结
    迭代器、可迭代对象、迭代器对象
    多层装饰器例子
    闭包函数和装饰器
    递归、二分法、三元表达式及内置函数和匿名函数
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709842.html
Copyright © 2020-2023  润新知