對於正整數
2^n(
n>1
)來說,存在這樣的特性,如果整數x是
2^n的整數倍,則
x的二進位制形式的低n位為
0,如果x
不是2^n
的整數倍,則x與(
~(2^n-1)
)進行與運算可以得到乙個與
x相近的是
2^n整數倍的正整數。這個特性經常用於記憶體分配時對齊。如果是上對齊,則需要先加上
2^n-1
,再進行上述運算。
在
linux2.6.30.4
中,在include/
linux
/kernel.h
檔案中,
align
巨集的定義如下:
#define align(x,a) __align_mask(x,(typeof(x))(a)-1)
#define __align_mask(x,mask) (((x)+(mask))&~(mask))
上面**中,
typeof(x)
表示取x
的型別,如果x是
int,則
typeof(x)
為int
。(typeof(x))(a)-1
,表明把
a轉化為
x的型別,並減
1,作為對齊掩碼。不考慮型別,上述**可以簡化為如下:
#define align(x,a) (((x)+(a)-1)&~(a-1))
上面的計算方法在
linux
等**中也常常可以看到
,下面給出幾個例子
:(1)
當分配位址
addr時,
要將該位址以
size
為倍數對齊
, 而且要得到是比
addr
大的值,
則使用_align
巨集:#define _align(addr,size)(((addr)+(size)-1)&(~((size)-1)))
(2)
與頁面對齊相關的巨集
#define page_size 4096
#definepage_mask (~(page_size-1))
#define page_align(addr) -(((addr)+page_size-1)& page_mask)
(3)
與skb
分配時對齊相關的巨集
#define skb_data_align(x) (((x) + (smp_cache_bytes -1)) & ~(smp_cache_bytes - 1))
ALIGN巨集與記憶體對齊
1.原理 int a int size 8 1000 bin 計算a以size為倍數的下界數 就讓這個數 要計算的這個數 表示成二進位制時,最後三位為0就可以達到這個目標。只要下面這個數與a進行 與運算 就可以了 11111111 11111111 11111111 11111000 而上面這個數實...
巨集 內聯函式, 記憶體對齊,
預處理 i 巨集定義,條件編譯指令,注釋 編譯 s 彙編 o 二進位制檔案,機器指令,與上一步統稱為編譯 鏈結 exe 將相關檔案彼此鏈結 巨集,簡單的替換 內聯函式 inline 節約一些小函式頻繁呼叫,大量消耗棧空間的問題。inline必須與函式的定義放在一起,才能是內聯函式,編譯時處理內聯。v...
核心巨集ALIGN的含義
from 在linux2.6.30.4中,在include linux kernel.h檔案中,align巨集的定義如下 cpp view plain copy define align x,a align mask x,typeof x a 1 define align mask x,mask x...