日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hva的创建过程

發(fā)布時間:2024/1/8 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hva的创建过程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?其創(chuàng)建流程如下圖所示:

?ppc架構(gòu)的處理器的在mac_newworld.c文件中ppc_core99_init函數(shù)中調(diào)用memory_region_allocate_system_memory函數(shù)創(chuàng)建ram,ram屬于實體MemoryRegion,有自己的內(nèi)存(從QEMU進程的中分配內(nèi)存空間)。源代碼分析如下:

memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,const char *name,uint64_t ram_size) {uint64_t addr = 0;int i;if (nb_numa_nodes == 0 || !have_memdevs) {allocate_system_memory_nonnuma(mr, owner, name, ram_size);//hva內(nèi)存的創(chuàng)建通過該函數(shù)完 //成,對于其它代碼不做解析return;}…… }

?在下面函數(shù)中可以從文件恢復(fù)hva內(nèi)存,也可以直接分配hva內(nèi)存,memory_region_init_ram_from_file函數(shù)用于從文件恢復(fù),而memory_region_init_ram_nomigrate用于分配內(nèi)存。

static void allocate_system_memory_nonnuma(MemoryRegion *mr, Object *owner,const char *name,uint64_t ram_size) {if (mem_path) { #ifdef __linux__Error *err = NULL;memory_region_init_ram_from_file(mr, owner, name, ram_size, 0, 0,mem_path, &err); //從文件中恢復(fù)hvaif (err) {error_report_err(err);if (mem_prealloc) {exit(1);}error_report("falling back to regular RAM allocation.");/* Legacy behavior: if allocation failed, fall back to* regular RAM allocation.*/mem_path = NULL;memory_region_init_ram_nomigrate(mr, owner, name, ram_size, &error_fatal);} #elsefprintf(stderr, "-mem-path not supported on this host\n");exit(1); #endif} else {memory_region_init_ram_nomigrate(mr, owner, name, ram_size, &error_fatal);//分配hva內(nèi)存}vmstate_register_ram_global(mr); }

?以下主要分析memory_region_init_ram_nomigrate函數(shù)分配內(nèi)存

void memory_region_init_ram_nomigrate(MemoryRegion *mr,Object *owner,const char *name,uint64_t size,Error **errp) {memory_region_init_ram_shared_nomigrate(mr, owner, name, size, false, errp); } void memory_region_init_ram_shared_nomigrate(MemoryRegion *mr,Object *owner,const char *name,uint64_t size,bool share,Error **errp) {Error *err = NULL;memory_region_init(mr, owner, name, size);//創(chuàng)建RAM的memoryregion(QOM的創(chuàng)建過程)mr->ram = true; //完成MemoryRegion的成員變量的初始化mr->terminates = true;mr->destructor = memory_region_destructor_ram;mr->ram_block = qemu_ram_alloc(size, share, mr, &err);//hva內(nèi)存的分配通過該函數(shù)完成mr->dirty_log_mask = tcg_enabled() ? (1 << DIRTY_MEMORY_CODE) : 0;if (err) {mr->size = int128_zero();object_unparent(OBJECT(mr));error_propagate(errp, err);} } RAMBlock *qemu_ram_alloc(ram_addr_t size, bool share,MemoryRegion *mr, Error **errp) {return qemu_ram_alloc_internal(size, size, NULL, NULL, false,share, mr, errp); }

?創(chuàng)建RamBlock,并完成Ram的MemoryRegion與RamBlock的連接

static RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, ram_addr_t max_size,void (*resized)(const char*,uint64_t length,void *host),void *host, bool resizeable, bool share,MemoryRegion *mr, Error **errp) {RAMBlock *new_block;Error *local_err = NULL;size = HOST_PAGE_ALIGN(size);max_size = HOST_PAGE_ALIGN(max_size);new_block = g_malloc0(sizeof(*new_block));//動態(tài)創(chuàng)建RAMBlocknew_block->mr = mr; //完成各個元素的初始化new_block->resized = resized;new_block->used_length = size;new_block->max_length = max_size;assert(max_size >= size);new_block->fd = -1;new_block->page_size = getpagesize(); //獲取系統(tǒng)的頁大小new_block->host = host;if (host) {new_block->flags |= RAM_PREALLOC;}if (resizeable) {new_block->flags |= RAM_RESIZEABLE;}ram_block_add(new_block, &local_err, share);//通過該函數(shù)完成hva的分配if (local_err) {g_free(new_block);error_propagate(errp, local_err);return NULL;}return new_block; } static void ram_block_add(RAMBlock *new_block, Error **errp, bool shared) {RAMBlock *block;RAMBlock *last_block = NULL;ram_addr_t old_ram_size, new_ram_size;Error *err = NULL;old_ram_size = last_ram_page();qemu_mutex_lock_ramlist();new_block->offset = find_ram_offset(new_block->max_length);if (!new_block->host) {if (xen_enabled()) {xen_ram_alloc(new_block->offset, new_block->max_length,new_block->mr, &err);if (err) {error_propagate(errp, err);qemu_mutex_unlock_ramlist();return;}} else {new_block->host = phys_mem_alloc(new_block->max_length,&new_block->mr->align, shared);//該函數(shù)完成 //hva的創(chuàng)建…… }

?phys_mem_alloc函數(shù)在exec.c文件中指向qemu_anon_ram_alloc函數(shù),該函數(shù)調(diào)用系統(tǒng)函數(shù)VirtualAlloc在進程中創(chuàng)建內(nèi)存。

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的hva的创建过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。