記憶體對齊巨集ALIGN

2021-07-27 09:29:56 字數 1384 閱讀 8951



對於正整數

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...