Chinaunix首页 | 论坛 | 博客
  • 博客访问: 205926
  • 博文数量: 91
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 15
  • 用 户 组: 普通用户
  • 注册时间: 2015-12-09 10:37
文章分类
文章存档

2016年(87)

2015年(4)

我的朋友

分类: LINUX

2016-05-04 14:07:19

原文地址:linux ALIGN 宏定义注释 作者:embeded-linux

在看到内核的高速缓存cache分配中利用SLOB分配,在slob_alloc函数中调用了以下的宏定义:

#define ALIGN(val,align) (((val) + ((align) - 1)) & ~((align) - 1))

开始看到这,分析了一下,不是很明白用实际数据模拟一下,好像有点眉目,纠结在这很长时间啊,

上网查了一下,哎。。。。大家都不愧为中华儿女,秉承了中华传统的山寨民族风啊,千篇一律,都一样,

来吧,仔细分析以下,Align的英文排列对齐的意思,最shit的就是算法的原理,下面举个实际的例子吧,

查阅一些资料,看到千篇一律的引入了一个“界数”的概念,恕在下愚钝,真是没接触过这个词啊,我在这纠结

好长时间,哎。。。没文化就是这么可怕。




点击(此处)折叠或打开

int main(int argc ,char **argv)

  1. {
  2.     int m = 12,n = 8,p;
  3.     p = (m + (n -1))&~(n -1);
  4.     /*n = 8, (n-1) == 7 按位取反(32位)1111 1111 1111 1111 1111 1111 1111 1000 & 0000 0000 0000 0000 0000 0000 0001 0011*/
  5.     /* p == 16*/
  6.     /*在调用一次*/

           m = 18, n= 8;
          
           p =  (m + (n -1))&~(n -1);       

  •         /*n = 8, (n-1) == 7 按位取反(32位)1111 1111 1111 1111 1111 1111 1111 1000 & 0000 0000 0000 0000 0000 0000 0001 1001*/
  •         /* p == 24*/
  •         /*在调用一次*/
  •          m = 18, n= 5;
              
               p =  (m + (n -1))&~(n -1);       
  •         /*n = 5, (n-1) == 4 按位取反(32位)1111 1111 1111 1111 1111 1111 1111 1011 & 0000 0000 0000 0000 0000 0000 0001 0110*/
  •          
               /* p == 20*/
    1.     return 0;
    2. }
    这下是不是清晰点了,根据m,n,和p的运算结果得到结论:

    高潮来了。。。。

    p 的运算结果一定是n的倍数,p 一定大于等于m;(特此注明,n一定是2的幂次。。。2,4,8,16.....1024);


    好了最后我们放到内核中你过来看一下,


    这才是重点,时间是检验真理的唯一标准么


    1 .看看SLOB分配内存的时候

    #define _ALIGN(val,align) ((val) +((align) - 1) & ~((align) - 1))

    要以align为单位倍数对齐,得到的值大于等于addr;


    2.在内存的页面对齐的宏定义



    #define PAGE_SIZE     4096


    #define  PAGE_MASK   (~(PAGE_SIZE) - 1)

    #define PAGE_ALIGN(addr)    ((addr) + PAGE_SIZE-1) & PAGE_MASK

    。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
    阅读(1630) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~