Spiceserver記憶體操作相關函式的使用

2021-07-11 17:03:45 字數 3908 閱讀 3154

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,並返回指向第乙...