Dynamips设计与分析-Dynamips及相关教学软件研究与设计 第18页
应用层的实现
在本层主要实现三个部分:虚拟机Virtual Machines,虚拟设备Virtual Device,虚拟输入输出IO。
4.3.1 虚拟机(VM)的实现
首先分析vm_instance这个数据结构,它定义了很多参数,比方说设备类型,状态标记,实例id,对内存的定义有:RAM,ROM, IOMEM和NVRAM的大小。RAM,ROM,IOMEM,NVRAM分别是随机存储器,只读存储器,输入输出存储器以及非易失随机存储器。
struct vm_instance {
char *name;
int type; /* 类型有C7200, C3600, ... */
int status; /* 实例状态标记 */
int instance_id; /* 实例id */
u_int ram_size,rom_size; /* RAM 和 ROM 大小(Mb) */
u_int iomem_size; /* IOMEM 大小(Mb) */
u_int nvram_size; /* NVRAM 大小(Kb) */
…
又定义了基本的硬件设备:CPU,PCI总线以及PCI I/O 空间。
…
cpu_group_t *cpu_group; /* CPU组 */
cpu_mips_t *boot_cpu; /* 引导CPU */
struct pci_bus *pci_bus[2]; /* PCI总线2 */
struct pci_bus *pci_bus_pool[VM_PCI_POOL_SIZE]; /* PCI 总线池 */
struct pci_io_data *pci_io_space; /* PCI 输入输出空间 */
…
上面所说的这些都需要Dynamips进行虚拟实现,才能模拟出真正思科路由器的环境。
在这里主要分析如下几个部分:
创建一个虚拟机实例
增加一个虚拟机
释放一个虚拟机
停止一个虚拟机
移除一个虚拟机
获取虚拟机类型
通过虚拟机关闭硬件资源
保存虚拟机配置信息到指定的文件
1.创建一个虚拟机实例
创建的虚拟机信息有名称,实例id,虚拟机类型。首先要为创建的虚拟机分配空间,然后是对内存空间初始化,包括类型虚拟机,虚拟机大小问题等。接着就是对虚拟机的各种属性进行详细的赋值操作了,包括虚拟机实例id,类型,状态标记,JIT使用的状态等等信息,最后还不要忘了对虚拟机命名,这里的函数是调用strdup()函数把参数名称复制给虚拟机指向的名称。最后一步就是在注册表中增加创建的这个虚拟机的记录。这样就实现了创建一个虚拟机。
实现函数如下:
vm_instance_t *vm_create(char *name,int instance_id,int machine_type)
{
vm_instance_t *vm;
if (!(vm = malloc(sizeof(*vm)))) {
fprintf(stderr,"VM %s: unable to create new instance!\n",name);
return NULL;
} /* 为创建的虚拟机分配空间 */
memset(vm,0,sizeof(*vm)); /* 这个函数对内存进行初始化,memset()的内涵:用来对一段内存空间全部设置为某个字符,这里全部设为0,初始化的空间大小即是虚拟机的大小,初始化的那段内存取名为vm。在Dynamips中进行创建操作时经常用到此函数 */
vm->instance_id = instance_id; /* 赋值id */
vm->type = machine_type; /* 赋虚拟机的类型 */
vm->status = VM_STATUS_HALTED; /* 赋虚拟机的状态标记 */
vm->jit_use = JIT_SUPPORT; /* 支持JIT标记 */
vm->vtty_con_type = VTTY_TYPE_TERM;
vm->vtty_aux_type = VTTY_TYPE_NONE;
vm->timer_irq_check_itv = VM_TIMER_IRQ_CHECK_ITV;
if (!(vm->name = strdup(name))) {
fprintf(stderr,"VM %s: unable to store instance name!\n",name);
goto err_name;
} /* 赋虚拟机的名称 */
if (vm_get_lock(vm) == -1)
goto err_lock;
if (vm_create_log(vm) == -1)
goto err_log;
if (registry_add(vm->name,OBJ_TYPE_VM,vm) == -1) {
fprintf(stderr,"VM: Unable to store instance '%s' in registry!\n",
vm->name);
goto err_reg_add;
}
return vm; /* 返回虚拟机的值 */
err_reg_add: /* 以下为出错处理 */
vm_close_log(vm);
err_log:
free(vm->lock_file);
err_lock:
free(vm->name);
err_name:
free(vm);
return NULL;
}
2.增加一个虚拟机
函数原型为:
void vm_object_add(vm_instance_t *vm,vm_obj_t *obj)
通过改变obj指针和VM指针来完成
3.释放一个虚拟机
释放一个虚拟机就是释放其占用的资源,包括释放硬件资源,关闭记录文件,移除锁定文件,再释放虚拟机的各种参数。
实现函数如下:
void vm_free(vm_instance_t *vm)
{
if (vm != NULL) {
vm_hardware_shutdown(vm); /* 关闭硬件资源 */
vm_close_log(vm); /* 关闭log文件 */
); /* 释放虚拟机的各种属性 */
free(vm->sym_filename);
free(vm->ios_image);
free(vm->ios_config);
free(vm->rom_filename);
free(vm->name);
free(vm);
}
}
<< 上一页 [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] ... 下一页 >>
Dynamips设计与分析-Dynamips及相关教学软件研究与设计 第18页下载如图片无法显示或论文不完整,请联系qq752018766