思考:
1.
可以
open
的时候
O_CREAT
一个新文件来创建映射区吗
?
2.
如果
open
时
O_RDONLY
,
mmap
时
PROT
参数指定
PROT_READ|PROT_WRITE
会怎样?
3.
文件描述符先关闭,对
mmap
映射有没有影响?
4.
如果文件偏移量为
1000
会怎样?
5.
对
mem
越界操作会怎样?
6.
如果
mem++
,
munmap
可否成功?
7. mmap
什么情况下会调用失败?
8.
如果不检测
mmap
的返回值,会怎样?
总结:
1.
创建映射区的过程中,隐含着一次对映射文件的读操作。
2.
当
MAP_SHARED
时,要求:映射区的权限应
<=
文件打开的权限
(
出于对映射区的保护
)
。而
MAP_PRIVATE 则无所谓,因为 mmap
中的权限是对内存的限制。
3.
映射区的释放与文件关闭无关。只要映射建立成功,文件可以立即关闭。
4.
特别注意,当映射文件大小为
0
时,不能创建映射区。所以:用于映射的文件必须要有实际大小!! mmap 使用时常常会出现总线错误,通常是由于共享文件存储空间大小引起的。如,
400
字节大小的文件,
在建立映射区时
offset 4096
字节,则会报出总线错。
5. munmap
传入的地址一定是
mmap
的返回地址。坚决杜绝指针
++
操作。
6.
如果文件偏移量必须为
4K
的整数倍
7. mmap
创建映射区出错概率非常高,一定要检查返回值,确保映射区建立成功再进行后续操作。
注意事项:
1.用于创建映射区的文件大小为0,实际指定非o大小创建映射区,出“总线错误”。
2.用于创建映射区的文件大小为0,实际制定o大小创建映射区,出“无效参数”。
3.用于创建映射区的文件读写属性为,只读。映射区属性为读、写。出“无效参数”
4创建映射区,需要read权限。当访问权限指定为“共享”MAP_SHARED时,mmap的读写权限应该〈=文件的open权限。只写不行。
5.文件描述符fd,在map创建映射区完成即可关闭I后续访问文件,用地址访问。
6. offset 必须是4096的整数倍。(MMU映射的最小单位4 )
7.对申请的映射区内存,不能越界访问。
8. munmap用于释放的地址,必须是mmap申请返回的地址。
9.映射区访问权限为“私有”MAP_PRIVATE,对内存所做的所有修改,只在内存有效,不会反应到物理磁盘上。
6. offset 必须是4096的整数倍。(MMU映射的最小单位4 )
7.对申请的映射区内存,不能越界访问。
8. munmap用于释放的地址,必须是mmap申请返回的地址。
9.映射区访问权限为“私有”MAP_PRIVATE,对内存所做的所有修改,只在内存有效,不会反应到物理磁盘上。
10.映射区访问权限为“私有”MAP_PRIVATE,只需要open文件时,有读权限,用于创建映射区即可。