您的位置:首页 > 其它

内存映射

2016-07-28 07:59 232 查看
存映射相关的数据结构和地址空间操作,建立映射时内核和应用程序之间的交互。C标准库提供了mmap函数建立映射。在内核一端,提供了两个系统调用mmap和mmap2.

asmlinkage unsigned long sys_map(2)(unisgned long addr, unsigned long len, unsigned long prot, unsigned long flags, unsigned long fd, unsigned long off)

mmap和mmap2之间差别在于偏移量的语义。在uzhe两个调用中,他都表示映射在文件中开始的位置。对于 mmap,位置的单元室字节,而mmap2使用单元则是页(PAGE_SIZE).

通常C标准库只提供一个函数,由应用程序用来创建内存映射。

可使用munmap系统调用删除映射。

4.7.1 创建映射

mmap和mmap2

*MAP_FIXED指定出了给定地址之外,不能将其他地址用于映射。

*如果一个uixinag在几个进程之间共享时,则必须使用MAP_SHARED.

*MAP_PRIVATE创建与任何数据源都不相关的匿名映射,fd和off参数被忽略。

prot可指定PROT_EXEC,PROT_READ,PROT_WRITE,PROT_NODE值祝。

为简明起见,下文值讨论sys_mmap2:最终都会达下文讨论的do_mmap_pgoff寒素。

get_unmmaped_area函数,在虚拟地址空间中找到一个适当的区域用于映射。

calc_vm_prot_bits和calc_vm_flag_bit将系统调用中指定的标志和访问权限常数合并到一个共同的标志集中,

在检查过参数并设置好所有需要的标志之后,剩余的工作委托给mmap_region。find_vma_prepare函数,来查找前一个和后一个区域的vm_area_struct实例。

映射数据不是在建立映射时立即读入内存,只有十几需要相应数据时才进行读取。

*统计,即内核维护了进程用于映射的页数目统计

*还必须进行广发的安全性和合理性检查,以防应用程序设置无效参数或可能影响系统稳定性的参数。

4.7.2 删除映射

从虚拟地址空间删除现存映射,必须使用munmap系统调用,他需要两个参数:解除映射区域的起始地址和长度.sys_munmap是该系统调用的入口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: