spiceserver記憶體操作部分也是整個專案用的比較多的模組,它自己封裝了一套記憶體操作的函式,要掌握spiceserver必須要掌握這些函式的使用,本篇我主要介紹一下我在閱讀和使用這些函式及巨集的一些理解,可能不是很全面,甚至理解不是很到位,後面有新的理解和發現再對blog進行更新。
void *spice_malloc(size_t n_bytes) spice_gnuc_malloc spice_gnuc_alloc_size(1);
void *spice_malloc0(size_t n_bytes) spice_gnuc_malloc spice_gnuc_alloc_size(1);
void *spice_realloc(void *mem, size_t n_bytes) spice_gnuc_warn_unused_result;
void *spice_malloc_n(size_t n_blocks, size_t n_block_bytes) spice_gnuc_malloc spice_gnuc_alloc_size2(1,2);
void *spice_malloc_n_m(size_t n_blocks, size_t n_block_bytes, size_t extra_size) spice_gnuc_malloc;
void *spice_malloc0_n(size_t n_blocks, size_t n_block_bytes) spice_gnuc_malloc spice_gnuc_alloc_size2(1,2);
void *spice_realloc_n(void *mem, size_t n_blocks, size_t n_block_bytes) spice_gnuc_warn_unused_result;
我們看到上面一些自定義記憶體分配函式都有兩個修飾的巨集,乙個是
spice_gnuc_malloc乙個是spice_gnuc_alloc_size(1)或或者
spice_gnuc_malloc spice_gnuc_alloc_size2(1,2),他們的定義如下:
#define spice_gnuc_malloc __attribute__((__malloc__))
#define spice_gnuc_alloc_size(x) __attribute__((__alloc_size__(x)))
#define spice_gnuc_alloc_size2(x,y) __attribute__((__alloc_size__(x,y)))
有關這些巨集的定義在
中可以找到。
__attribute__((__malloc__))
的作用,英文解釋如下:
意思是函式宣告了這個以後,gcc對該函式有個更好的優化,意思是函式要返回乙個指標,並且保證這個指標不含有別名,也就是指標指向的記憶體不被其他指標所指向,表明是要新分配乙個記憶體
。__attribute__((__alloc_size__(x)))英文解釋如下:
意思是函式宣告這個後,返回乙個指向記憶體的指標,記憶體的大小有第x個函式引數制定,例如:
void *spice_malloc(size_t n_bytes)使用宣告該屬性後,返回的記憶體大小被第1個引數指定,也就是n_bytes指定。
__attribute__((__alloc_size__(x,y)))
英文解釋如下:
同上面的差不多,只不過多了個引數,意思是返回記憶體大小同第x個引數和第y個引數有關,這個無需再解釋了。
閱讀了原始碼,發現這些函式內部的呼叫都是比較簡單的:
(1)spice_malloc:內部呼叫malloc函式,我們可以直接把它當做malloc來呼叫;
(2)spice_malloc0:內部呼叫的是calloc,它和malloc的區別是calloc分配記憶體後會將記憶體塊清零;
(3)spice_realloc:內部呼叫realloc;
(4)spice_malloc_n:內部呼叫的是spice_malloc,只是引數分成兩個,乙個是塊的大小,乙個是塊的個數;
(5)spice_malloc0_n:spice_malloc_n分配後再清零的效果;
(6)spice_malloc_n_m:在spice_malloc_n的基礎上再增加乙個額外的大小,例如:有時候我們分配記憶體時需要再加上乙個結構體頭部;
(7)spice_realloc_n:spice_realloc分配記憶體大小分成塊和塊數的形式。
我們來看下
spice_malloc函式原始碼吧,其他函式都差不多,就不一一枚舉了。
void *spice_malloc(size_t n_bytes)
malloc_error("unable to allocate %lu bytes", (unsigned long)n_bytes);
}return null;
}
spiceserver中比較常用的記憶體塊結構:
reddatachunk、
spicechunks,我這裡簡單寫了乙個有關它們使用的demo,我先將乙個檔案內容讀取到reddatachunk結構中,然後將reddatachunk結構中的資料拷貝到spicechunks中,使用了spiceserver中的一些自定義函式,**如下:
#include #include #include "mem.h"
#define package_len 512
/* 讀取檔案,將檔案內容儲存在red_chunk中 */
void get_chunk_from_file(const char *filepath, reddatachunk *red_chunk)
reddatachunk *cur_chunk = red_chunk;
while(true)
uint32_t read_len = fread(pbuff, 1, package_len, file);
if( read_len > 0 )
else
}fclose(file);
}/* 釋放reddatachunk結構記憶體 */
void free_red_chunk(reddatachunk *red_chunk)
}/* 將儲存在red_chunk中的資料拷貝到spice_chunks中 */
spicechunks *get_spicechunk(reddatachunk *red_chunk)
data = spice_chunks_new(i);/* 分配spicechunks記憶體 */
data->data_size = 0;
data->flags |= spice_chunks_flags_free;
for (i = 0, chunk = red_chunk->next_chunk;
chunk != null && i < data->num_chunks;
chunk = chunk->next_chunk, i++)
return data;
}void print_chunks(spicechunks *chunks)
}int main(int argc, char **argv)
I O記憶體記憶體操作
i o記憶體記憶體操作 訪問暫存器和訪問普通的sdram是不同的。特殊暫存器在2410上對映在虛擬位址的0xf0000000開始的地方。具體可以參考map.h的定義。define ioread8 p define ioread16 p define ioread32 p define iowrite...
C 記憶體操作
最近閒來無事發現周圍的朋友都在玩 植物大戰殭屍 的遊戲!於是動了製作這遊戲工具的念頭!雖然在網上同類工具很多 但是用c 寫的我幾乎看不到!所以我想用c 寫乙個!首先用ce或者od或者其他反彙編工具找出遊戲的記憶體基址!遊戲記憶體基址 base 0x006a9ec0 至於如何獲取這些位址不在我們這論壇...
記憶體操作函式
calloc 配置記憶體空間 相關函式 malloc,free,realloc,brk 表頭檔案 include 定義函式 void calloc size t nmemb,size t size 函式說明 calloc 用來配置nmemb個相鄰的記憶體單位,每一單位的大小為size,並返回指向第乙...