免费注册 查看新帖 |

Chinaunix

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

[内核入门] 内核中计算高低端内存界限896M值的迷惑,求解! [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-04-12 11:12 |只看该作者 |倒序浏览
RT。
os: linux
version:2.4.0
在setup_arch()中
      
         if(max_low_pfn > MAX_MEM_PFN)
               max_low_pfn = MAX_MEM_PFN;

#define MAX_MEM_PFN PFN_DOWN(MAXMEM)
#define MAXMEM (unsigned long)(-0xc0000000 - 128 << 20)         /* -3G - 128M */

我写了一个测试程序
int main()
{
    unsigned long  a = -0xc0000000 - 128 << 20;

    printf("0x%016x.\n", a);

    return 0;
}

结果,打印的值为0xf8000000(编译器直接优化成0xf8000000),而不是0x38000000(896M)
290 00000000004004c4 <main>:
291   4004c4:   55                      push   %rbp
292   4004c5:   48 89 e5                mov    %rsp,%rbp
293   4004c8:   48 83 ec 10             sub    $0x10,%rsp
294   4004cc:   c7 45 f8 00 00 00 f8    movl   $0xf8000000,-0x8(%rbp)
295   4004d3:   c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)
296   4004da:   b8 f8 05 40 00          mov    $0x4005f8,%eax
297   4004df:   48 8b 55 f8             mov    -0x8(%rbp),%rdx
298   4004e3:   48 89 d6                mov    %rdx,%rsi
299   4004e6:   48 89 c7                mov    %rax,%rdi
300   4004e9:   b8 00 00 00 00          mov    $0x0,%eax
301   4004ee:   e8 c5 fe ff ff          callq  4003b8 <printf@plt>
302   4004f3:   b8 00 00 00 00          mov    $0x0,%eax

如果按照这样来算是对的:
     -0xc000000 的补码形式为 0x40000000,计算方法:2 ^ 32 - 3221225472(3221225472为0xc0000000的十进制表示)
     - 128 << 20 的补码形式为 0xf8000000,计算方法:2 ^ 32 - 134217728(134217728为128<<20的十进制表示)
然后两个补码求和: 0x40000000 + 0xf8000000 = 0x1 38000000,最高位溢出不要,剩余的38000000表示的无符号整数刚好是896M

怎么理解这里的这个 -0xc0000000 - 128 << 20  ???

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
2 [报告]
发表于 2014-04-12 19:04 |只看该作者
本帖最后由 shaohui973 于 2014-04-12 19:04 编辑

高手在哪里?指导下小弟,感激不尽。

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
3 [报告]
发表于 2014-04-13 19:00 |只看该作者
回复 2# shaohui973


你检查下 c运算符的优先级吧。。。 ‘-’ 优先级大于 '<<'
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP