在看到内核的高速缓存cache分配中利用SLOB分配,在slob_alloc函数中调用了以下的宏定义:
#define ALIGN(val,align) (((val) + ((align) - 1)) & ~((align) - 1))
开始看到这,分析了一下,不是很明白用实际数据模拟一下,好像有点眉目,纠结在这很长时间啊,
上网查了一下,哎。。。。大家都不愧为中华儿女,秉承了中华传统的山寨民族风啊,千篇一律,都一样,
来吧,仔细分析以下,Align的英文排列对齐的意思,最shit的就是算法的原理,下面举个实际的例子吧,
查阅一些资料,看到千篇一律的引入了一个“界数”的概念,恕在下愚钝,真是没接触过这个词啊,我在这纠结
好长时间,哎。。。没文化就是这么可怕。
int main(int argc ,char **argv)
-
{
-
int m = 12,n = 8,p;
-
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 0011*/
-
/* p == 16*/
-
/*在调用一次*/
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*/
-
return 0;
-
}
这下是不是清晰点了,根据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) |