Dynamips设计与分析-Dynamips及相关教学软件研究与设计 第19页
停止一个虚拟机
函数原型为:
int vm_stop(vm_instance_t *vm)
CPU组停止所有的CPU,VM标记为VM_STATUS_SHUTDOWN,并返回0。
5.移除一个虚拟机
函数原型为:
void vm_object_remove(vm_instance_t *vm,vm_obj_t *obj)
通过改变obj指针和VM指针来完成
6.获取虚拟机类型
函数原型为:
char *vm_get_type(vm_instance_t *vm)
通过vm->type得出虚拟机的型号是3600,7200,2691,3725,3745或其他。
7.通过虚拟机关闭硬件资源
函数原型为:
int vm_hardware_shutdown(vm_instance_t *vm)
CPU也要停止运行,释放object表、PCI总线使用的资源、PCI总线池,删除系统CPU组等操作
8.保存虚拟机配置信息到指定的文件
配置好虚拟机信息之后需要保存起来。
函数原型为:
void vm_save_config(vm_instance_t *vm,FILE *fd)
保存虚拟机配置的各种信息
4.3.2 虚拟设备(Device)的实现
虚拟Device在Dynamips中是项重要的内容。
先来看一个虚拟设备的数据结构:
struct vdevice {
char *name;
u_int id;
m_uint64_t phys_addr; /* 物理地址 */
m_uint32_t phys_len; /* 物理长度 */
m_iptr_t host_addr; /* 主机地址 */
void *priv_data; /* 私有数据 */
int flags;
int fd;
dev_handler_t handler; /* 句柄 */
struct vdevice *next,**pprev;
};
这是一个虚拟的设备结构,包括设备名称,编号,物理地址,物理长度,主机地址私有的数据等等信息,是虚拟设备必须具有的属性。
在这里主要分析如下几个部分:
创建一个虚拟设备
获取虚拟设备
初始化一个虚拟设备
显示设备信息
映射一个设备
1.创建一个虚拟设备
函数实现如下:
struct vdevice *dev_create(char *name)
{
struct vdevice *dev;
if (!(dev = malloc(sizeof(*dev)))) {
fprintf(stderr,"dev_create: insufficient memory to "
"create device '%s'.\n",name);
return NULL;
} /* 为创建的虚拟设备分配空间 */
dev_init(dev); /* 初始化设备 */
dev->name = name; /* 为创建的虚拟设备命名 */
return dev; /* 返回虚拟设备 */
}
要创建一个设备,就应该有设备名称及占用的空间。因此这个函数先为设备分配一个空间,再调用dev_init(dev)函数对其初始化操作,最后返回这个设备值以达到创建一个设备的目的。
2.获取虚拟设备
要获取设备信息可以有三个方法,即通过id获取,通过name获取,通过物理地址查找获取
(1)通过id获取设备信息
函数实现如下:
struct vdevice *dev_get_by_id(vm_instance_t *vm,u_int dev_id)
{
if (!vm || (dev_id >= MIPS64_DEVICE_MAX))
return NULL;
return(vm->dev_array[dev_id]);
}
分析一下这个函数如何实现的,先判断id是否合法即在合法的范围内。合法则利用设备id的调用其虚拟机指向的设备阵列即可返回设备信息。
(2)通过name获取设备信息
函数实现如下:
struct vdevice *dev_get_by_name(vm_instance_t *vm,char *name)
{
struct vdevice *dev;
if (!vm)
return NULL;
for(dev=vm->dev_list;dev;dev=dev->next)
if (!strcmp(dev->name,name))
return dev;
return NULL;
}
先判断vm存在与否,再利用参数name匹配查找获得设备信息。
(3)通过物理地址获取设备信息
函数实现如下:
struct vdevice *dev_lookup(vm_instance_t *vm,m_uint64_t phys_addr,int cached)
{
struct vdevice *dev;
if (!vm)
if ((phys_addr >= dev->phys_addr) &&
((phys_addr - dev->phys_addr) < dev->phys_len))
return dev;
}
return NULL;
}
通过物理地址获取设备信息,先判断vm存在与否,再利用参数phys_add(物理地址)匹配查找获得设备信息。
4.初始化一个虚拟设备
函数原型为:
void dev_init(struct vdevice *dev)
调用memset(dev,0,sizeof(*dev)),为虚拟设备初始化内存,将值-1赋给dev->fd
<< 上一页 [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] ... 下一页 >>
Dynamips设计与分析-Dynamips及相关教学软件研究与设计 第19页下载如图片无法显示或论文不完整,请联系qq752018766