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


    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

  • 相关阅读:
    二、VueRouter ---kkb
    一、Vue组件化 ---kkb
    React项目的一些配置以及插件
    四、React全家桶(二)
    三、React全家桶(一)
    二、React组件化
    扩展欧几里得算法(含严谨证明)
    bzoj4034 树上操作
    欧几里得算法(含严谨证明)
    noip2013 车站分级
  • 原文地址:https://www.cnblogs.com/mull/p/8029253.html
Copyright © 2020-2023  润新知