4463|10

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

检测当前地址页是否为别名 [复制链接]

一个内存检查的例程如下:

  1. for(i = 0; i < NUM_MEM_AREAS; i++)

  2. memory_map[i].used = 0;



  3. /* first write a 0 to all memory locations */

  4. for(addr = MEM_START; addr < MEM_END; addr += PAGE_SIZE)

  5. * (u32 *)addr = 0;

  6. for(i = 0, addr = MEM_START; addr < MEM_END; addr += PAGE_SIZE) {

  7. if ( current memory page isnot a valid ram page) {

  8. /* no RAM here */

  9. if(memory_map[i].used )

  10. i++;

  11. continue;

  12. }



  13. /*

  14. * 当前页已经是一个被映射到 RAM 的有效地址范围

  15. * 但是还要看看当前页是否只是 4GB 地址空间中某个地址页的别名?

  16. */

  17. [color=#FF0000]if(* (u32 *)addr != 0)[/color] { /* alias? */

  18. /* 这个内存页是 4GB 地址空间中某个地址页的别名 */

  19. if ( memory_map[i].used )

  20. i++;

  21. continue;

  22. }



  23. /*

  24. * 当前页已经是一个被映射到 RAM 的有效地址范围

  25. * 而且它也不是 4GB 地址空间中某个地址页的别名。

  26. */

  27. if (memory_map[i].used == 0) {

  28. memory_map[i].start = addr;

  29. memory_map[i].size = PAGE_SIZE;

  30. memory_map[i].used = 1;

  31. } else {

  32. memory_map[i].size += PAGE_SIZE;

  33. }

  34. } /* end of for (…) */


复制代码

为什么(* (u32 *)addr != 0就是说明当前地址页是某个地址页的别名?

最新回复

我顶  详情 回复 发表于 2009-8-21 08:56
点赞 关注

回复
举报

62

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没有高人知道吗
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
顶一下,我现在也在为这个问题难受了,哥们我的QQ:47157860,交流一下
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

4
 
再顶一下
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
好像代码没贴全吧
有没有往RAM里写非零数据的代码?
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

6
 
还必须确保所安排的地址范围的的确确是可读写的 RAM 空间,因此,必须对你所安排的地址范围进行测试。具体的测试方法可以采用类似于 blob 的方法,也即:以 memory page 为被测试单位,测试每个 memory page 开始的两个字是否是可读写的。为了后面叙述的方便,我们记这个检测算法为:test_mempage,其具体步骤如下:

1. 先保存 memory page 一开始两个字的内容。

2. 向这两个字中写入任意的数字。比如:向第一个字写入 0x55,第 2 个字写入 0xaa。

3. 然后,立即将这两个字的内容读回。显然,我们读到的内容应该分别是 0x55 和 0xaa。如果不是,则说明这个 memory page 所占据的地址范围不是一段有效的 RAM 空间。

4. 再向这两个字中写入任意的数字。比如:向第一个字写入 0xaa,第 2 个字中写入 0x55。

5. 然后,立即将这两个字的内容立即读回。显然,我们读到的内容应该分别是 0xaa 和 0x55。如果不是,则说明这个 memory page 所占据的地址范围不是一段有效的 RAM 空间。

6. 恢复这两个字的原始内容。测试完毕。

为了得到一段干净的 RAM 空间范围,我们也可以将所安排的 RAM 空间范围进行清零操作。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
这是一篇关于bootloader文章中的代码,文章的地址是:
http://www.ibm.com/developerworks/cn/linux/l-btloader/
上面是这篇文章中的一段
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 
补充一下楼主的问题:
程序开始时:
for(addr = MEM_START; addr < MEM_END; addr += PAGE_SIZE)

* (u32 *)addr = 0;
已经将内存全置零,
接下来的:
if(* (u32 *)addr != 0) { /* alias? */

/* 这个内存页是 4GB 地址空间中某个地址页的别名 */

if ( memory_map.used )

i++;

continue;

}
又用* (u32 *)addr 来与0比较,但前面已经置0了。
这也是一个问题
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

9
 
为什么(* (u32 *)addr != 0就是说明当前地址页是某个地址页的别名?

——抱歉,我没有看懂。
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

10
 
望大家都来指点
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

11
 
我顶
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表