2011-03-15 90 views
0

我一直在閱讀數據結構對齊文章,但我無處可去。也許事情太複雜了,我不明白。我也遇到了數據結構填充這也是對齊數據所必需的。如何將數據結構填充添加到struct usb_ep?另外,如何確保每次執行kmalloc時要讀取的數據都應該位於內存偏移量爲4的倍數?如何使用kmalloc執行數據結構對齊?

回答

3

關於對齊,kmalloc會正確對齊結構。如果你有一個4字節的變量,它將是4字節對齊的,如果你有一個8字節的變量,它將被對齊8字節。理解對齊是需要填充的原因。

你不想得到的是你的結構中的變量之間的garbade填充。你可以用pragma pack directive(可能是最簡單的)或手動添加填充來實現。

struct usb_ep 
{ 
short a; /* 2 bytes*/ 
int b; /* 4 bytes*/ 
short c; /* 2 bytes*/ 
}; 

所有元件的大小是8個字節,但是由於對準要求,大小將12bytes。內存佈局會是這樣:

short a  - 2 bytes 
char pad[2] - 2 bytes of padding 
int b   - 4 bytes 
short c  - 2 bytes 
char pad[2] - 2 bytes of padding 

爲了得不到任何填充物,或增加結構的大小,可以以滿足對齊要求重新排列元素。

即具有結構:

struct usb_ep 
{ 
short a; /* 2 bytes*/ 
short c; /* 2 bytes*/ 
int b; /* 4 bytes*/ 
}; 

將有8個字節的尺寸,以及用於添加填充沒有要求。

+0

如果您使用雜注包指令,這是否意味着您不必填充? – Owen 2011-03-16 01:45:27

+0

這是否也意味着使用kmalloc,您不必擔心數據對齊,因爲它默認已經對齊了數據? – Owen 2011-03-16 03:59:37

+0

當然不是! kmalloc()不知道你想要分配的數據的內部信息。 – adobriyan 2011-03-16 07:22:27

1

這來自http://minirighi.sourceforge.net/html/kmalloc_8c.html

void * kmemalign (size_t alignment, size_t size) 
    Allocate some memory aligned to a boundary. 
Parameters: 
alignment The boundary. 
size  The size you want to allocate. 
Exceptions: 
NULL  Out-of-memory. 
Returns: 
A pointer to a memory area aligned to the boundary. The pointer is a aligned_mem_block_t pointer, so if you want to access to the data area of this pointer you must specify the p->start filed. 
Note: 
Use kfree(void *ptr) to free the allocated block. 

的最佳方式墊場的結構是按大小來聲明變量。所以你的第一個,然後是最小的。

struct example { 
    double amount; 
    char *name; 
    int cnt; 
    char is_valid; 
}; 

這並不總是最後的結構邏輯連接的項目,但通常會給予最緊湊和最方便的內存使用情況。

你可以在你的結構聲明中使用填充字節,但是它們混淆了代碼,並不保證緊湊的結構。編譯器可以對齊4字節邊界上的每個字節,所以你可能最終得到

struct example2 { 
    char a; 
    char padding1[3]; 
    char b; 
    char padding2[3]; 
}; 

服用4個字節的4個字節爲padding1,4個字節b和4個字節padding2。有些編譯器允許你指定在這種情況下會產生正確結果的打包結構。通常我只是聲明從最大到最小類型的字段並將其留在那裏。如果你需要在兩種語言/編譯器之間共享內存,那麼你需要確保結構在內存中保持一致。