当前位置: 技术问答>linux和unix
关于linux的虚拟内存
来源: 互联网 发布时间:2016-12-09
本文导语: 今天和同事讨论一个问题就是是否会针对外设创建页表,也就是虚拟内存的本质是什么?以mmap为例,我们将普通的文件通过mmap映射到虚拟内存中,直接操作映射的虚拟内存则可以修改文件,其实现的机制是什么?对...
今天和同事讨论一个问题就是是否会针对外设创建页表,也就是虚拟内存的本质是什么?以mmap为例,我们将普通的文件通过mmap映射到虚拟内存中,直接操作映射的虚拟内存则可以修改文件,其实现的机制是什么?对于物理内存的mmap原理以及实现机制这个都是知道的。我想问的是我们如何是将存储介质中的文件(毕竟存储介质中文件是不可以直接被CPU操作的,只有通过IO接口来操作的)与虚拟内存联系起来的?
|
大概了解一点:简单来说对于某个普通文件的mmap最终通过VFS之后会调用到具体文件系统inode->i_fop->mmap,而对于很多文件系统来说实际上就是直接generic_file_mmap(),而在mmap某个文件后,操作mmap返回的虚拟地址空间的内容时(通过vma_area_struct判断如果产生page fault时),会调用filemap_fault(),如不在page cache这时候会启动真正的从磁盘读写。
详细的内容估计要把整个的代码分析一下才行。
详细的内容估计要把整个的代码分析一下才行。
|
没有仔细分析过,把大致了解的信息列一下,建议找找网上关于swap/vm的资料,有一个可以参考的:
http://bbs.chinaunix.net/thread-2002714-1-1.html,另外可以参考《Understanding the Linux Virtual Memory Manager》和《Linux源代码情景分析》,再对着手头的代码进行分析,这>部分由于涉及到VM/VFS,个人觉得还是有点复杂,:-)
总的来说,关键是分换入(swap in)和换出(swap out)2个方向:VM在满足一定条件时,如内存紧张或是page很久没用时,会启用换出,shrink_page_list -> add_to_swap,再根据page是>否dirty最终调用swapper_space->a_ops->writepage完成换出;换入则是在访问某个进程的虚拟地址产生page fault(页表项解析时),会通过handle_mm_fault -> handle_pte_fault -> do_swap_page -> swapin_readahead完成换入,当然其中还涉及到很多关于换入/换出时关于页表,page,swap内容等大量的处理。
http://bbs.chinaunix.net/thread-2002714-1-1.html,另外可以参考《Understanding the Linux Virtual Memory Manager》和《Linux源代码情景分析》,再对着手头的代码进行分析,这>部分由于涉及到VM/VFS,个人觉得还是有点复杂,:-)
总的来说,关键是分换入(swap in)和换出(swap out)2个方向:VM在满足一定条件时,如内存紧张或是page很久没用时,会启用换出,shrink_page_list -> add_to_swap,再根据page是>否dirty最终调用swapper_space->a_ops->writepage完成换出;换入则是在访问某个进程的虚拟地址产生page fault(页表项解析时),会通过handle_mm_fault -> handle_pte_fault -> do_swap_page -> swapin_readahead完成换入,当然其中还涉及到很多关于换入/换出时关于页表,page,swap内容等大量的处理。