虚拟内存跟物理内存之间的映射mmap\munmap

#include <stdio.h>
#include <sys/mman.h>

int main(void) {
    /*
     * 创建虚拟内存的映射
     * void *mmap (void *__addr, size_t __len, int __prot,int __flags, int __fd, __off_t __offset)
     * __addr 需要映射的起始位置,如果传NULL则操作系统自动计算
     * __len 需要映射的字节数,自动按页圆整(不足一页按一页映射,不足两页超过一页按两页映射,页的大小跟据操作系统的不同而不同)
     * __prot 映射区域的权限
     *      PROT_READ  可读
     *      PROT_WRITE 可写
     *      PROT_EXEC  可执行
     *      PROT_NONE  不可访问
     * __flags 映射标志
     *      MAP_ANONYMOUS 匿名映射,将虚拟内存映射到物理内存而非文件,忽略fd和offset参数(传0)
     *      MAP_PRIVATE 表示该内存映射的内容仅在本进程可见,且不会被其他进程所访问。
     *      MAP_SHARED 对映射区的写操作直接反映到时文件中
     *      MAP_DENYWRITE 拒绝其它对文件的写操作
     *      MAP_FIXED 若在start上无法创建映射,则失败(无此标志系统会自动调整)
     *__fd 文件描述符
     *__offset 文件偏移量,自动按页(4k)对齐
     * 返回值:成功返回映射区的起始地址,失败返回MAP_FAILED(-1)
     * */
    // 映射4096个字节的可读可写的内存
    void *p1 = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_ANONYMOUS);

    /*
     * 解除虚拟内存的映射
     * int munmap (void *__addr, size_t __len)
     * __addr 要解除映射内存的起始地址
     * __len 要解除映射的大小(按页圆整)
     *返回值:成功返回0,失败返回1
     * munmap 必需按页操作
     * */
    munmap(p1, 4096);
    return 0;
}

posted on 2023-02-08 21:29  信奉上帝的小和尚  阅读(88)  评论(0编辑  收藏  举报

导航