免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2517 | 回复: 10
打印 上一主题 下一主题

[内存管理] [求教]页表VS文件表,好纠结... [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-28 18:12 |只看该作者 |倒序浏览
小菜鸟一枚,有个问题想请教下各位大神:文件表(fd表、file结构表和v-node表这一套东西) 跟VM里面的普通页表是什么关系呢,一直搞不清楚...   
  
我目前的理解是:页表是VM体系的基本单位,进程空间中所有的区域最后都要通过页表来索引和转换,文件地址也不例外,因为文件应该会以MMIO的形式map到虚拟存储系统中的。但是每次碰到文件IO部分的时候又觉得这三种文件表跟页表的形式差异很大,像是独立的体系?
  



具体化为两个问题吧,这两个问题其实是对我目前疑惑的不同表述

问题一:  
   
我要到一个虚拟地址里读一串数据(此数据目前没有被缓存到物理内存中),MMU会根据页表去定位物理地址,它发现页表项中提示这些页尚未被缓存,还在HD上,则此时会触发缺页处理程序,然后内核会去硬盘里调数据进入物理主存。  
   
--- 我目前的疑惑主要是:在这一过程中,文件表项是何时起作用的?unix中,数据均以文件的形式存放在HD上,而HD本质上是一个IO设备,上面文件数据也需要memory map到进程空间才可以被访问,这么看来好像就不需要独立维护一套文件表项了,除非文件表项是页面的补充,在缺页访问HD时才会用到?

问题二:

我对单独的两个部分:基于页机制的虚拟-物理地址存储与转换体系  和  文件系统  理解的都还可以:
  
---前者主要是TLB-cache-Mem-HD,基于分页和页表的机制,中间包括各种策略的调入调出;
---后者主要是fd - file table - vnode - HD上的实际文件;
  
但我还没有把两者之间的关系搞明白,即这两个部分最终都是要到HD上访问文件数据(临时存放在dram中,不放回HD的先不考虑),那这两条路径究竟是怎么协同运作的呢?是补充的关系,还是本来就是同一个访问流程的不同描述?

一直搞不清楚,然后书上和网上的资料貌似也很少直接提到这一块,故求指点迷津,先行谢过~

论坛徽章:
2
寅虎
日期:2014-11-25 21:47:342015小元宵徽章
日期:2015-03-06 15:58:18
2 [报告]
发表于 2014-12-28 19:22 |只看该作者
简单的说:fd是该进程中对某个文件用户态索引(一般是整型)的描述。file是该文件在内核中抽象。当你在open该文件的那刻起,i_ops,i_mapping等资源就已经被具体的fs限定好了,之后想干什么就可以干什么了。

论坛徽章:
0
3 [报告]
发表于 2014-12-28 19:31 |只看该作者
回复 2# 镇水铁牛

谢谢回复,举个例子:

比如刚刚创建了一个新进程,对于进程空间的不同区域(如代码区、数据区)只有页表的映射关系,还没有真正从HD中缓存数据到DRAM中来。此时,新进程开始运行,并发生了缺页,触发缺页处理程序。那么:

A --- 是否在新进程刚刚创建的时候,与之有关联的所有文件就已经被open,相关的文件表项也已经在内核结构中被创立了?

B --- 缺页处理程序是根据进程空间的文件表去索引并从HD读取数据到DRAM中的吗?


   

论坛徽章:
2
寅虎
日期:2014-11-25 21:47:342015小元宵徽章
日期:2015-03-06 15:58:18
4 [报告]
发表于 2014-12-28 20:03 |只看该作者
回复 3# oo_ooo
其实对这些最好的理解就是:从代码级跟踪系统调用open,write的具体实现,你就会豁然开朗了。
A --- 是否在新进程刚刚创建的时候,与之有关联的所有文件就已经被open,相关的文件表项也已经在内核结构中被创立了?
【回复】open是你主动调用的,何来打开所有文件?
B --- 缺页处理程序是根据进程空间的文件表去索引并从HD读取数据到DRAM中的吗?
【回复】当你去write该fd对应的文件,write的输入参数offset,imapping会根据文件系统的metadata找到该数据对应于该HD的具体的扇区号,IO就是这样交互的。可以先不要纠结于缺页异常。
你一直纠结的文件表(fd表、file结构表和v-node表),fd table含义估计你理解错了,file结构表还是file结构? v-node表是啥意思?

建议看具体的代码实现,代码是最好的资料,很多书上写的含糊不清。

论坛徽章:
0
5 [报告]
发表于 2014-12-28 20:20 |只看该作者
本帖最后由 oo_ooo 于 2014-12-28 20:22 编辑

回复 4# 镇水铁牛

非常感谢铁牛兄的耐心解答,其实我对文件IO本身的flow大概了解,我比较糊涂的是:

A --- 是否在新进程刚刚创建的时候,与之有关联的所有文件就已经被open,相关的文件表项也已经在内核结构中被创立了?
【回复】open是你主动调用的,何来打开所有文件?
【追问】open在这里造成了歧义,其实我想问的是:是否一个新进程刚刚创建的时候,与之有关联的所有文件就已经被打开了(例如放在HD上的一个大程序可执行文件),相关的fd已经在用户区中的descriptor table中分配、而内核区的file table中也已加入对应的表项?

B --- 缺页处理程序是根据进程空间的文件表去索引并从HD读取数据到DRAM中的吗?
【回复】当你去write该fd对应的文件,write的输入参数offset,imapping会根据文件系统的metadata找到该数据对应于该HD的具体的扇区号,IO就是这样交互的。可以先不要纠结于缺页异常。
【追问】比如我read一个fd对应的文件,imapping会根据文件系统的metadata找到该数据对应于该HD的具体的扇区号。那么内核是一边读数据到物理内存中,一边更新对应的页表吗?

下面会去详细的啃代码,不过这段时间有些较紧急的任务,所以还是想先弄清楚一点:wink:

论坛徽章:
2
寅虎
日期:2014-11-25 21:47:342015小元宵徽章
日期:2015-03-06 15:58:18
6 [报告]
发表于 2014-12-28 21:14 |只看该作者
对你的追问A中:内核区的file table中也已加入对应的表项?这个我还没有把握,我猜测文件被访问过,被cache也是合理的,可能就是你所谓的加入相应的表中。
对你的追问B中:不是所有读写都需要更新页表吧,更新page cache的状态,inode的状态就够了。

论坛徽章:
0
7 [报告]
发表于 2014-12-28 21:17 |只看该作者
回复 6# 镇水铁牛

thanks~
   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
8 [报告]
发表于 2014-12-29 09:13 |只看该作者
oo_ooo 发表于 2014-12-28 20:20
回复 4# 镇水铁牛

非常感谢铁牛兄的耐心解答,其实我对文件IO本身的flow大概了解,我比较糊涂的是:

其实你说的文件表(虽然我不是很理解~~)跟页表没有直接的关系,两者应该是相对独立的东西。
只有对指定文件做了mmap映射之后,文件才和内存建立关系。

论坛徽章:
0
9 [报告]
发表于 2014-12-29 11:00 |只看该作者
回复 8# humjb_1983


谢谢humjb_1983的回复,大概搞明白了,是没啥直接联系。

现在我的理解是,可不太精确的把文件表项这套东西看做是VM页表机制的下游 or 后勤部,文件mmap之后,内核/用户代码才能去HD中读入数据,后续数据处理的时候才会涉及到页表机制的范畴~ 不知是否准确

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
10 [报告]
发表于 2014-12-29 12:26 |只看该作者
oo_ooo 发表于 2014-12-29 11:00
回复 8# humjb_1983

呵呵,如之前所说,只有当mmap之后,文件和内存才建立关系,你说的部分符合。
当没有mmap时,文件读写仍然可以进行,这也是通常的做法,此时的文件跟页表就没啥关系了,顶多跟page cache有关系。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP