2017-12-12 18:53:04

gcc优化引起get_free_page比__get_free_page返回值多4096

内核版本:1.3.100

extern inline unsigned long get_free_page(int priority)
{
    unsigned long page;
    page = __get_free_page(priority);
    DDBUG("1.page=%p, nr=%d", page, page>>PAGE_SHIFT);
    if (page){
        memset((void *) page, 0, PAGE_SIZE);
    }    
    DDBUG("2.page=%p, nr=%d", page, page>>PAGE_SHIFT);
    return page;
}

page_alloc.c(245):__get_free_pages : 2.map_nr=431, ADDRESS(431)=001af000
/root/oldlinux/src/linux/include/linux/mm.h(242):get_free_page : 1.page=001af000, nr=431
/root/oldlinux/src/linux/include/linux/mm.h(246):get_free_page : 2.page=001b0000, nr=431
应该返回0x001af000结果错给了0x001b0000

修订:page使用volatile属性,告诉gcc,这个变量使用内存,使用前从内核中取
 
static inline unsigned long get_free_page(int priority)
{
    volatile unsigned  long page;
    page = __get_free_page(priority);
    DDBUG("1.page=%p, nr=%d", page, page>>PAGE_SHIFT);
    if (page){
        memset(page, 0, PAGE_SIZE);
    }    
    DDBUG("2.page=%p, nr=%d", page, page>>PAGE_SHIFT);
    return page;
}

page_alloc.c(245):__get_free_pages : 2.map_nr=431, ADDRESS(431)=001af000
/root/oldlinux/src/linux/include/linux/mm.h(241):get_free_page : 1.page=001af000, nr=431
/root/oldlinux/src/linux/include/linux/mm.h(245):get_free_page : 2.page=001af000, nr=431

gcc优化引起get_free_page比__get_free_page返回值多4096的更多相关文章

  1. [转] C++中临时对象及返回值优化

    http://www.cnblogs.com/xkfz007/articles/2506022.html 什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行 ...

  2. 转:C++中临时对象及返回值优化

    http://www.cnblogs.com/xkfz007/articles/2506022.html 什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行 ...

  3. C++返回值优化

    返回值优化(Return Value Optimization,简称RVO)是一种编译器优化机制:当函数需要返回一个对象的时候,如果自己创建一个临时对象用于返回,那么这个临时对象会消耗一个构造函数(C ...

  4. 返回值优化(RVO)

    C++的函数中,如果返回值是一个对象,那么理论上它不可避免的会调用对象的构造函数和析构函数,从而导致一定的效率损耗.如下函数所示: A test() { A a; return a; } 在test函 ...

  5. GCC:条件判断中赋值语句和函数结尾时无返回值的警告

    有下面非常经典的一个字符串复制程序. test1.c #include <stdio.h> int main() { char str_t[]="This String come ...

  6. 【M20】协助完成“返回值优化(RVO)”

    1.方法返回对象,会导致临时对象的产生,这降低了效率,const Rational operator* (const Rational& lhs,Rational& rhs).有没有什 ...

  7. [More Effective C++]条款22有关返回值优化的验证结果

    (这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回 ...

  8. C++返回值优化RVO

    返回值优化,是一种属于编译器的技术,它通过转换源代码和对象的创建来加快源代码的执行速度.RVO = return value optimization. 测试平台:STM32F103VG + Keil ...

  9. JMeter(7) 优化判断返回类型和返回值

    之前判断接口类型和返回值用beanshell,可见JMeter(5)-JMeter之BeanShell使用 优化点 接口测试里面对返回字段的类型验证和值验证为基本需求,将方法导成jar文件,导入之后方 ...

随机推荐

  1. 纯注解方式配置spring+springMVC

    1.新建类initConfig,继承AbstractAnnotationConfigDispatcherServletInitializer,并重写getRootConfigClasses().get ...

  2. Python3基础 dict in/not in 查询一个字符是否指定字典的键或者值

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  3. git使用操作

    git config --system --unset credential.helper 重置git

  4. hihoCoder week19 RMQ问题再临-线段树 单点更新 区间查询

    单点更新 区间查询 #include <bits/stdc++.h> using namespace std; #define m ((l+r)/2) #define ls (rt< ...

  5. python接口测试模版

    """Test case implementation""" import sys import functools import diff ...

  6. 查看iis对应w3wp.exe显示的进程ID号

    1.任务管理器,查看,选择列,选择PID(进程标识符) 2.通过cmd查询: 管理员身份运行cmd,跳转到C:\Windows\System32\inetsrv目录,然后运行appcmd list w ...

  7. 运行和控制Nginx——命令行参数和信号

    参考资料: Nginx中文文档: http://www.nginx.cn/nginxchscommandline Nginx的启动.停止.平滑重启.信号控制和平滑升级:http://zachary-g ...

  8. 【BZOJ】3143: [Hnoi2013]游走

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3143 显然如果一条边期望被走过的次数越多,我们就应该给它的编号越小. 所以问题变为如何求每 ...

  9. "ProgrammerHome"项目笔记

    系统目的: 1.技术练习:把平时不用的,重要技术栈,在此项目中打磨(java.python.算法.系统构架) 2.新技术(工具)应用:有些平时想做,想实现的技术,可以在这里实现.而且以微服务的方式,轻 ...

  10. ubuntu14.04 Keras框架搭建

    >>>sudo su >>> pip3 install -U --pre pip setuptools wheel >>> pip3 instal ...