忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1054 | 回复: 2

[内核入门] 各进程3G+986MB~4G映射关系同步问题? [复制链接]

论坛徽章:
9
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:12
发表于 2017-08-09 10:50 |显示全部楼层
本帖最后由 _nosay 于 2017-08-09 10:52 编辑

    各个进程的3G~4G虚拟地址,属于内核空间,并且3G~3G+986MB与物理页面是固定的线性映射,而3G+986MB~4G的映射关系是可变的,在目录表中对应的下标为992~1023,这样就涉及到各个进程映射表的“同步”问题。
    粗暴的方式是,某个进程建立或断开了这个范围的虚拟页面映射时,马上修改所有进程的映射关系,站在某个进程的视角,可能在使用某个映射关系时,这个映射关系被修改了很多次,最后一次之前的修改都是没有必要的。
    Linux选择的是机智的方式,比如某个进程建立该范围虚拟页面映射时,只修改swapper_pg_dir,到进程B真正访问该虚拟页面时,由于自己的映射表里没有这个映射关系,就会产生缺页异常,并根据swapper_pg_dir“同步”自己的目录表:
add.png
    但我不理解的是,如果进程A、B的目录表以及swapper_pg_dir原本有某个映射关系,由于进程A断开某个虚拟页面映射导致这个映射关系没了,并同步到swapper_pg_dir,进程B的目录表里还存着旧的映射信息,如何产生缺页异常呢?
del.png

论坛徽章:
9
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:12
发表于 2017-08-09 18:11 |显示全部楼层
回复 1# _nosay

̲̲ ̲不̲说̲ ▁  16:01:37
每个进程有个自己独立的目录表,有1024个目录项,是不是?
̲̲ ̲不̲说̲ ▁  16:01:43
32位系统
̲̲ ̲不̲说̲ ▁  16:03:42
其中有256个目录项,用于记录内核空间的映射关系,768个用于记录当前进程用户空间的映射关系。
̲̲ ̲不̲说̲ ▁  16:05:29
由于3G~3G+986MB这个范围映射关系是固定的,所有进程都一样,所以也不管。

道可道、非常道  16:05:43
每当一个新的进程建立的时候,都会将swapper_pg_dir的768项以后的信息全部复制到新进程页目录的768项以后,代表内核空间

̲̲ ̲不̲说̲ ▁  16:06:46
这只是在新建进程这一个时间点上
̲̲ ̲不̲说̲ ▁  16:07:29
我的问题正是问,进程运行的时候,如果修改了这部分的映射关系,其它进程怎么知道

道可道、非常道  16:07:46
内核的缺页异常处理你可以看看

̲̲ ̲不̲说̲ ▁  16:08:58
我的疑问是,如果进程A释放了一块内存,进程B没有机会进入缺页异常处理函数

道可道、非常道  16:08:52
我的理解,如果swapper_pg_dir被修改了,当进程在内核态,按照当前的页目录访问时,会产生缺页异常,导致会重新同步swapper_pg_dir到自己的页目录

̲̲ ̲不̲说̲ ▁  16:09:36
http://bbs.chinaunix.net/thread-4266268-1-1.html
̲̲ ̲不̲说̲ ▁  16:10:31
再你这句回答上,再深入的想一下,分别拿建立和断开来想,我的疑问在断开。
̲̲ ̲不̲说̲ ▁  16:12:05
驱动缺页异常函数,是不是先要“缺”?
̲̲ ̲不̲说̲ ▁  16:16:49
我发问的帖子里,第一张图表示原来都没有某个映射关系,然后进程A的目录表和swapper_pg_dir里有了,第二张图表示原来都有某个映射关系,然后进程A和swapper_pg_dir里都没了
̲̲ ̲不̲说̲ ▁  16:18:31
所以不理解第二种情况,进程B如果导致缺页异常

道可道、非常道  16:18:30
你怎么理解的“缺”

̲̲ ̲不̲说̲ ▁  16:19:57
目录表项->页表项这个映射过程不完整,就是“缺”
̲̲ ̲不̲说̲ ▁  16:20:42
比如找到的目录项是0,或页表项是0

道可道、非常道  16:21:38
使用vmalloc申请内存时,内核只会更新主内核页表,所以当前使用的进程页表就有可能因为未与主内核页表同步导致异常

̲̲ ̲不̲说̲ ▁  16:21:57
所以我怀疑是不是vmalloc区域对应的页表,在系统启动时就分配好,各个进程有各自的目录项,但目录项指向的页表却只有一份

道可道、非常道  16:22:32
主内核页表肯定是启动的时候初始化的

̲̲ ̲不̲说̲ ▁  16:23:05
哦,所有进程使用的是同一份是吧?

道可道、非常道  16:23:11
在内核态是一份,但是每个进程会有一份拷贝
道可道、非常道  16:23:27
如果不一致了,就会可能产生异常
道可道、非常道  16:23:40
然后重新同步

̲̲ ̲不̲说̲ ▁  16:24:22
那判断不一致的时机是什么?
̲̲ ̲不̲说̲ ▁  16:29:35
按道理如果目录项所指页表的所有页表项都断开了,会释放这个页表,并清空目录项,但我在vfree()的代码,没有看到对这种情况的处理
̲̲ ̲不̲说̲ ▁  16:31:19
所以说vmalloc区域对应的目录项以及所指的页表,是不是启动时在某个函数就设置好了,后面不会变了,而映射失败也只可能发生在页表这一层?
̲̲ ̲不̲说̲ ▁  16:31:30
@道可道、非常道 ?
̲̲ ̲不̲说̲ ▁  16:41:06
swapper_pg_dir是页表,还是目录表[表情]?

道可道、非常道  16:41:02
vmalloc的页目录表,是在编译的时候,固定到汇编代码中的
道可道、非常道  16:41:14
目录表啊
道可道、非常道  16:41:26
这个叫临时页全局目录表
道可道、非常道  16:41:49
临时页表是由汇编初始化的
道可道、非常道  16:41:58
表示汇编代码看不懂
道可道、非常道  16:42:08
所以页表没了解细节
道可道、非常道  16:42:46
swapper_pg_dir这个是静态初始化的
道可道、非常道  16:42:47
直接在编译阶段,就定好了地址

̲̲ ̲不̲说̲ ▁  16:43:20
swapper_pg_dir.png
̲̲ ̲不̲说̲ ▁  16:43:33
head.S中
̲̲ ̲不̲说̲ ▁  16:43:49
0号进程的目录表

道可道、非常道  16:44:33
网不好,公司老是断网

西昆仑  16:44:55
我也觉得网不好……

道可道、非常道  16:45:27
那你可以分析一下了
道可道、非常道  16:45:36
看看具体怎么初始化的

̲̲ ̲不̲说̲ ▁  16:46:56
一时半会不知道看哪个函数,不知道是不是992~1023下标对应的页表,都是系统启动时分配的,总共32个,以后一直不会被释放
̲̲ ̲不̲说̲ ▁  16:51:01
我怀疑的是,最高128MB虚拟地址,使用的32个页表是固定的,目录表992~1023下标处的目录项也是固定的,新进程复制到自己的目录表后,也不用变了,而这些指类似于“指针”,因为它们指向相同的页表,不管建立/断开,在映射表里可以让其它进程感知到。

道可道、非常道  16:51:00
不清楚哎,搞清楚了,说一下哈

̲̲ ̲不̲说̲ ▁  16:51:37


道可道、非常道  16:51:30
应该是
道可道、非常道  17:00:09
vfree好像是只将物理内存页面和页面的映射关系解除了

̲̲ ̲不̲说̲ ▁  17:01:10
没有解除目录项和页表的关系是吧?

道可道、非常道  17:06:13
没看到
道可道、非常道  17:06:24
再仔细瞅瞅

̲̲ ̲不̲说̲ ▁  17:13:25
你看的是哪些版本,Linux2.4 arch/i386/mm/init.c pagetable_init(),看来这个函数直接为内核空间分配好了页表

̲̲ ̲不̲说̲ ▁  17:14:07
这是系统启动阶段调用的

道可道、非常道  17:19:59
刚看了一下
道可道、非常道  17:19:59
这个页表是不会被回收的
道可道、非常道  17:20:03
应该是一直存在的
道可道、非常道  17:20:40
如果页表项为空,进行访问的时候,会产生异常

̲̲ ̲不̲说̲ ▁  17:21:21
[表情]
道可道、非常道  17:23:30
释放的时候,只是清除了页表项,但是页表还是存在的

论坛徽章:
18
程序设计版块每日发帖之星
日期:2015-08-17 06:20:0015-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:56黑曼巴
日期:2016-12-26 16:00:32每日论坛发贴之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:51程序设计版块每日发帖之星
日期:2016-06-03 06:20:00程序设计版块每日发帖之星
日期:2016-06-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-30 06:20:00
发表于 2017-08-16 11:01 |显示全部楼层
赞,讨论的真细致。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP