免费注册 查看新帖 |

Chinaunix

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

[操作系统] 请高手指点:prom.c DDR大小的侦测 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-30 10:33 |只看该作者 |倒序浏览
  1. void __init
  2. prom_init(int argc, const char **argv)
  3. {
  4.     unsigned long mem;
  5.     mips_machgroup = MACH_GROUP_BRCM;
  6.     mips_machtype = MACH_BCM947XX;

  7. /* Figure out memory size by finding aliases */
  8.         for (mem = (1 << 20); mem < (128 << 20); mem <<= 1) {
  9.                 if (*(unsigned long *)((unsigned long)(prom_init) + mem) ==
  10.                     *(unsigned long *)(prom_init))
  11.                         break;
  12.         }
  13. #if CONFIG_RAM_SIZE
  14.         {
  15.                 unsigned long config_mem;       
  16.                 config_mem = CONFIG_RAM_SIZE * 0x100000;
  17.                 if (config_mem < mem)
  18.                         mem = config_mem;
  19.         }
  20. #endif

  21.         /* Ignoring the last page when ddr size is 128M. Cached
  22.          * accesses to last page is causing the processor to prefetch
  23.          * using address above 128M stepping out of the ddr address
  24.          * space.
  25.          */
  26.         if (MIPS74K(mips_cpu.processor_id) && (mem == 0x8000000))
  27.                 mem -= 0x1000;

  28.         add_memory_region(0, mem, BOOT_MEM_RAM);
  29. }
复制代码
为什么当mem=DDR大小的时候就有
*(unsigned long *)((unsigned long)(prom_init) + mem) == *(unsigned long *)(prom_init)
感觉像是环回了一样!
这个问题困扰我很久了,请高手指点!

论坛徽章:
0
2 [报告]
发表于 2011-04-26 11:24 |只看该作者
回复 1# jyhhappyjyh

这个汇编中也是有这样的机制!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP