免费注册 查看新帖 |

Chinaunix

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

请问,处理器的分页部件是怎么把不同进程的相同的线性地址转换成不同的物理地址? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-16 17:57 |只看该作者 |倒序浏览
我在看书,好像得到物理地址只需要这几个:线性地址、页目录表的首地址。
但是,比如,每个程序都有可能使用0X11112222这个线性地址,那么分页部件是怎么从这些线性地址得到不同的物理地址的呢?
多谢

论坛徽章:
0
2 [报告]
发表于 2011-01-16 17:58 |只看该作者
我一直很困惑,如果按照书上的转换方法,为什么得到的物理地址不会冲突

论坛徽章:
0
3 [报告]
发表于 2011-01-16 22:59 |只看该作者
可以配着源码看就会理解了...

举个例子
在x86上, 0X11112222 这个线性地址会分为三个部分
1, 最高10位, 利用这10位的值到页目录表中找到页表的地址
2. 中间10位, 上一步找到页表之后, 然后利用中间10位在页表找到对应页
3. 低12位, 是页中的偏移地址

这样就找到具体物理地址了, 这个过程在x86上是硬件(cpu)完成的.

至于映射的物理地址冲突, 这个完全是代码里设定的. 有时操作系统里故意将不同虚拟地址映射到一段相同的物理地址, 同时不同虚拟地址的权限不同, 这样就起到了保护作用.

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
4 [报告]
发表于 2011-01-17 08:14 |只看该作者
因为每个进程用的页表不一样

论坛徽章:
0
5 [报告]
发表于 2011-01-25 10:18 |只看该作者
系统有个页目录 每个进程对应一个页表  页表里面有个基地址 每个页表的基地址不一样
两个进程访问相同的虚拟地址的时候  最终会映射到每个进程的基地址加上一个页内偏移(因为两个虚拟地址一样,偏移一样,但是基地址不一样,所以最终到物理地址十不一样的)

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
6 [报告]
发表于 2011-09-29 15:40 |只看该作者
每个进程在自己的内存描述符中都存有pgd_t *pgd字段,这个字段存放页目录的起始地址。每个进程的这个是不一样的,所以页目录,页表就不一样了。

论坛徽章:
0
7 [报告]
发表于 2011-09-30 15:39 |只看该作者
回复 6# embeddedlwp

这位朋友是正解,其实这个pdg,保存在mm_struct的pgd成员中,

这样:task_struct->mm_struct->pgd, 每个进程就有了一个不同的地址计算基数,最后得出的物理地址就不会冲突了。

但要注意init进程之前init_mm的pgd地址为:sapper_pg_dir,当然,这又有许多额外的故事。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
8 [报告]
发表于 2011-09-30 16:12 |只看该作者
回复 1# 湿了耶
通俗的讲,就是每个进程都有一个虚拟地址到物理地址的转换表,而这个转换表不同的进程是不同的。所以就会出现不同进程的同一个虚拟地址对应不同的物理地址。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2011-10-03 14:28 |只看该作者
这其实是分段机制和分页机制的区别:
分段是让各个进程有不一样的线性空间
分页是各个进程有相同的线性空间
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP