免费注册 查看新帖 |

Chinaunix

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

关于address_space的一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-29 08:52 |只看该作者 |倒序浏览
昨天看了下address_space,大致看懂了怎么运行。但是在文件映射的时候只是将文件的一部分映射到线性地址上,那在内存访问这个线性地址的时候遇到缺页异常等情况已经有一套机制了,为什么还要用address_space?或者说在什么时候会用到这个结构?
xiexie.

论坛徽章:
0
2 [报告]
发表于 2011-11-29 09:40 |只看该作者
内核中对每一个文件都有一个内核缓存空间,由address_space表示,file和inode应该都有指针指向它。通过这个内核缓冲空间,多个进程可以共享同一个文件的映射区域。比如进程A映射了文件x的第一个block,进程B也映射了文件x的第一个block,那其实上他们操作的都是同一个address_space.

为了支持这个address_space,在处理缺页异常的时候,内核对这种文件映射的处理和匿名页的处理是不一样的,具体根据vm_ops.nopage方法是否为空区分,对于文件映射,最终会调用filemap_nopage。这个函数根据线性地址的偏移量找到应该映射的那个page,填充页表。

论坛徽章:
0
3 [报告]
发表于 2011-11-29 09:53 |只看该作者
回复 2# wangjl_sdu


    非常感谢,大概明白了。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
4 [报告]
发表于 2011-11-29 11:39 |只看该作者
我觉得只要这一点明白一切都好说了: address_space 是页面交换的抽象, 凡是参与paging的页面, 必然属于一个 address_space

论坛徽章:
0
5 [报告]
发表于 2011-11-29 12:42 |只看该作者
回复 4# zylthinking


    是不是做内存映射的时候都是会用到这个?

论坛徽章:
0
6 [报告]
发表于 2011-11-29 13:11 |只看该作者
回复 4# zylthinking


    是不是address_space就是来管理一个映射的缓存的?

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
7 [报告]
发表于 2011-12-01 10:20 |只看该作者
本帖最后由 linuxfellow 于 2011-12-01 10:33 编辑
昨天看了下address_space,大致看懂了怎么运行。但是在文件映射的时候只是将文件的一部分映射到线性地址上, ...
ggzwtj 发表于 2011-11-29 08:52


总结一下address space和swap space:

    address_space is a structure for each file backed object.
    通常它链接着所有映射到这个文件上的vma,以及含有从该文件的读入数据的物理页面。
   由于共享内存是用一个临时文件作为支撑的,每个共享内存的vma也连到一个address_space下

   那些用于application 或 shared library的堆栈,.bss用途的vma,这些vma叫做anonymous vma;直接由swap space支撑,和address_space没有关系。

不对不全之处请指正!

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
8 [报告]
发表于 2011-12-01 11:06 |只看该作者
总结一下address space和swap space:

    直接由swap space支撑,和address_space没有关系
linuxfellow 发表于 2011-12-01 10:20


有关系, 参与paging的应该都有adress space, swap 也是paging出去的页面

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
9 [报告]
发表于 2011-12-01 11:54 |只看该作者
有关系, 参与paging的应该都有adress space, swap 也是paging出去的页面
zylthinking 发表于 2011-12-01 11:06


明确一下:
struct address_space 和paging用的address space应该是两个不同的概念。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
10 [报告]
发表于 2011-12-01 12:05 |只看该作者
明确一下:
struct address_space 和paging用的address space应该是两个不同的概念。
linuxfellow 发表于 2011-12-01 11:54


怎么是不同概念呢?
address_space 就是所谓地址空间, 无论是 mapping的 file, 还是 mapping 的 swap, 都是backup storage,  paging 的时候, 都是通过 adress_space 中的 index 获得需要写到 backup storage 中的哪个 offset, 写方法都是 adress_space 中的函数指针。
所以说 adress_space 就是带有后端存储的可允许 paging out 的页面特有的。
进一步说, 一个页面只有和 adress space 联系起来以后, 才会进入 lru 链表, 才会被内核线程看到从而才有可能被paging out出去; 就算是 malloc出来的用户端内存, 在一开始写到用户页表项的时候, 没有联系adress_space, 也是不可交换的, 等发现内存紧张找到一个进程要page out 它的页面的时候, 也是先将这些页面先加入adress space, 然后才 page out到swap的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP