蜗牛哒哒

LINUX教程-LINUX编程-mmap设备操作

作者: 蜗牛哒哒 发布时间: 2020-12-25 146 人阅读

Mmap系统调用(功能)
void* mmap ( void * addr , size_t len , int prot , int flags , int fd , off_t offset )
内存映射函数mmap, 负责把文件内容映射到进程的虚拟内存空间, 通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用read,write等操作。
Addr:
指定映射的起始地址, 通常设为NULL, 由系统指定。
Length:
映射到内存的文件长度。
Prot:
映射区的保护方式, 可以是:
PROT_EXEC: 映射区可被执行
PROT_READ: 映射区可被读取
PROT_WRITE: 映射区可被写入
PROT_NONE: 映射区不能存取
flags:
映射区的特性, 可以是:
MAP_SHARED:
写入映射区的数据会复制回文件, 且允许其他映射该文件的进程共享。
MAP_PRIVATE:
对映射区的写入操作会产生一个映射区的复制(copy-on-write), 对此区域所做的修改不会写回原文件。
fd:
由open返回的文件描述符, 代表要映射的文件。
offset:
以文件开始处的偏移量, 必须是分页大小的整数倍, 通常为0, 表示从文件头开始映射。
解除映射
int munmap(void *start,size_t length)

取消参数start所指向的映射内存,参数length表示欲取消的内存大小。当进程结束时,映射内存会自动解除,但关闭对应的文件描述词时不会解除映射。

返回值 解除成功返回0,否则返回-1,错误原因存于errno中。
虚拟内存区域
虚拟内存区域是进程的虚存中的一个同质区间,即具有同样特性的连续地址范围。一个进程的内存映象由下面几部分组成:程序代码、数据、BSS和栈区域,以及内存映射的区域。
一个进程的内存区域可以通过查看/proc/pid/maps

08048000-0804f000 r-xp 00000000 08:01 573748 /sbin/rpc.statd #text
0804f000-08050000 rw-p 00007000 08:01 573748 /sbin/rpc.statd #data
08050000-08055000 rwxp 00000000 00:00 0 #bss
040000000-40015000 r-xp 00000000 08:01 933965 /lib/ld2.3.2.so #text
40015000-40016000 rw-p 00014000 08:01 933965 /lib/ld-2.3.2.so #data

每一行的域为:
start_end perm offset major:minor inode
Start: 该区域起始虚拟地址
End: 该区域结束虚拟地址
Perm: 读、写和执行许可;表示对这个区域,允许进程做什么。这个域的最后一个字符要么是p表示私有的,要么是s表示共享的。
Offset: 被映射部分在文件中的起始地址
Major、minor:主次设备号
Inode:索引结点

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2.本站所有资源不保证完整性,仅供参考学习!
3. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
4. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
5. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
6. 如有链接无法下载、失效或广告,请联系管理员处理!
7. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
8. 如遇到加密压缩包,默认解压密码为"woniudada",如遇到无法解压的请联系管理员处理!
蜗牛哒哒 » LINUX教程-LINUX编程-mmap设备操作