首页
社区
课程
招聘
[讨论]关于CPU访问物理内存地址
发表于: 2014-7-25 18:47 6267

[讨论]关于CPU访问物理内存地址

2014-7-25 18:47
6267
突然想到一个问题,如果cpu访问一个不存在的物理地址,会怎么样。
比如 mov ebx,[0b2000000h]
这个地址被发到北桥,北桥解析地址0b2000000h,如果是内存,就读内存,如果是设备就读设备,
如果这个地址既没在内存,也没在设备,那么返回0还是什么?那么mov ebx,0b2000000h,结果是ebx=0?
我这个假设0b2000000h经过页表转换以后还是0b2000000h。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
应该没有这种地址
2014-7-25 19:54
0
雪    币: 427
活跃值: (488)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
protected mode下32位地址范围0x00000000--0xFFFFFFFF
2014-7-25 20:27
0
雪    币: 2161
活跃值: (750)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
楼主理解不对吧
CPU拿到线性地址后会根据页表取得物理地址
如你所说这个线性地址是无效的,即会触发缺页异常(R3则程序崩溃,R0则蓝屏或重启)
和北桥有啥关系?还没到读物理地址的那一步呢
真到了那一步,即线性地址有物理地址的映射,假设读物理地址错误,则立即蓝屏或重启(硬件故障)
在BOOTLOADER阶段BIOS会提供可用物理内存的信息,以OS的严谨性几乎不存在映射错误
还有,发到北桥的是物理地址
个人见解
2014-7-25 20:37
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
5
windows当然不会映射错误的物理地址,我自己在OS以前访问,比如MBR里面,我自己写旳,mov ebx,0b2000000h,会怎样?死机?还是ebx=0?
2014-7-25 22:49
0
雪    币: 2161
活跃值: (750)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
立刻重启
2014-7-26 10:29
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
7
你说的是错的,我实验了,啥事没有,ebx=0,继续执行.
2014-7-26 11:34
0
雪    币: 2161
活跃值: (750)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
8
额,你的一句话不足以让我信服。
最好能说一下你的实验环境,实模式还是保护模式?
中断向量有没有?页表信息怎样?
按照你ebx的写法,应该是属于保护模式,引发缺页中断了吗?
我的意思是如果是硬件错误(包括读物理内存越界)都会当机的。
---
还有你的假设,在MBR里写mov ebx,0b2000000h是不现实的
MBR最多512字节,分区表信息是16字节,最多4个分区,也就是说代码最多有448字节
而这些空间不足以支持从实模式到保护模式的转换,因此都是在osloader中实现的
所以我认为你的假设不成立(我写过MBR并成功引导Windows)
也就是说你的实验环境不是MBR中
2014-7-26 11:53
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
9
没有代码,就用debug对一个不存在的地址读数据,写数据,没任何错误.
比如mov  es,0a000h
      mov  ax,0
      mov  es:[ax],3
      ;对a000:0写入数据3,不会出错,正常执行
      mov  bx,es:[ax]
      ;读取a000:0的数据,结果不是3,而是0,就是说写入是无效的,读取也是无效的,任何情况都返回0
      ;但是绝对不会出现异常的错误,就像什么都没发生,继续执行下一条语句,只不过非法内存的值为0而已
2014-7-26 12:04
0
雪    币: 2161
活跃值: (750)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
10
[QUOTE=squdong;1303793]没有代码,就用debug对一个不存在的地址读数据,写数据,没任何错误.
比如mov  es,0a000h
      mov  ax,0
      mov  es:[ax],3
      ;对a000:0写入数据3,不会出错,正常执行
      mov  bx,es:[ax]
  ...[/QUOTE]

呵呵,看来是我想多了。
2014-7-26 12:38
0
游客
登录 | 注册 方可回帖
返回
//