免费注册 查看新帖 |

Chinaunix

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

[内存管理] 关于内存管理的一个小问题 [复制链接]

论坛徽章:
13
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:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
1 [报告]
发表于 2017-05-03 22:13 |显示全部楼层
回复 1# lxy572535121

1. 你是出于什么考虑,要求指定限长的位数必须与指定偏移的位数相等?假设系统就是限制段的长度最大1M,你写的应用程序如果需要大量内存,一个段满足不了你,那多分配几个就是了,虽然你可能觉得不爽,但并没有什么不行的呀,更何况段描述符里有个G标志,也可以表达大的长度;
2. 虚拟地址范围还有这样算的呀?32位系统,指针变量32位,你如何表达64T的地址?就算按照你的思路,你说的这些段也是重叠的,不能用乘法。

论坛徽章:
13
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:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
2 [报告]
发表于 2017-05-04 00:41 |显示全部楼层
回复 4# Buddy_Zhang1

1. 虚拟地址、逻辑地址、线性地址、物理地址,不能硬生生说成4种地址,拿80386来说,A1->段式映射->A2->页式映射->A3,你如何拿这4种地址与A1、A2、A3对应上?2. 你对分段机制要解决的问题,理解是错误的。让每个进程觉得自己独占内存,那是保护模式要解决的事,如果靠分段就解决进程间相互干扰,实模式下用分段为什么还是会相互干扰?
    段寄存器最初出现在8086上,解决ALU16位,地址总线20位的问题,而80386仍然保留段寄存器,是为了兼容性。
3. 段式管理的"段"和代码"段"/数据"段",根本就是没有关系的两样东西,每个段里包含了代码段、数据段和其它各种段,怎么讲?
4. 虚拟地址最多包含16K个段,又是怎么讲?
    是因为保护模式下段寄存器高13位为段描述符索引吗?那也是8K个呀。即使不知道你从哪算的16K,你拿它跟4G相乘,就表示你期望每个段都能表示4G范围,那肯定都重叠在0-4G呀,32位变量,怎么能表示出64T?
5. 在32位系统,你能写个程序,反汇编可以看见,或者可以打印一个动态分配超过4G的地址吗?
6. 20的寄存器,是笔误吗?
7. 线性地址负责通过页式映射将虚拟地址转换成物理地址,你知道自己在说什么吗?
8. sorry

论坛徽章:
13
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:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
3 [报告]
发表于 2017-05-04 10:49 来自手机 |显示全部楼层
本帖最后由 _nosay 于 2017-05-04 10:51 编辑

6# lxy572535121

[size=43.1692px]   这样考虑,偏移位数与限长位数相等就够了。    8086为了方便用16位的偏移得到20位的地址,想到了分段的方法,所以把内存分成一段一段的不是最终目的,而是为了另外一个目的,当时也并没有考虑从一个段跨到另一个段的问题,因为段寄存器的16位值,和偏移里的16位值,全都用于计算目的地址,连个表示长度的地方都没有;
    80386还是纯粹为了寻址的话,就如你说的,用一个32位值就行了,连段寄存器都不需要了,但它要考虑兼容老cpu上的程序,还要支持保护模式。所以除了需要一个32位值表示基址,还需要20位值+G表示长度,以及其它位表示别的属性,这正是段描述符结构设计的依据,以及80386保护模式下改变段寄存器含义的原因。
    另外,保护模式可以基于段式管理设计,也可以基于页式管理设计,段式管理并不是保证每个进程有独立空间必不可少的东西。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP