Dynamips及相关教学软件研究与设计
显示设备信息
函数原型为:
void dev_show(struct vdevice *dev)
显示设备的各种参数信息。先判断参数dev的合法性,再显示设备指向的名称,物理地址,物理长度。
6.映射一个设备
在指定的物理地址中重新映射一个设备,先判断参数name是否存在,然后把参数paddr赋给设备指向的物理地址(dev->phys_addr),把参数len赋给设备指向的物理长度(dev->phys_len),把orig->fd赋给设备指向的fd,把orig->主机地址(orig->host_addr)赋给设备指向的主机地址(dev->host_addr),把orig->handler赋给设备指向的handler(dev->handler),最后返回dev各种值。
4.3.3 虚拟输入输出(IO)的实现
在这里主要分析PCI I/O和Network Input/Output(NIO)
首先分析PCI I/O的实现
增加一个PCI I/O
移除PCI I/O
初始化PCI I/O
再分析NIO
创建一个新的NetIO
删除一个NetIO
保存NETIO配置信息
通过NETIO发送一个包
通过NETIO接收一个包
TCP sockets的实现
UDP sockets的实现
1.增加一个PCI I/O
增加一个PCI I/O设备,首先第一步是为其分配空间,分配好空间后就要为其各属性赋上相应的值,这样就达到创建一个PCI I/O设备的目的了。
具体情况是先定义一个i/o设备指针p,先为新的I/O device分配空间,将参数star赋给p指向的start,将参数end赋给p指向的end,将参数dev赋给p指向的real_dev,再将参数handle赋给p指向的handler,最后再把p赋给d指向的设备表dev_list并返回p。
此函数如下:
struct pci_io_device *pci_io_add(struct pci_io_data *d,
m_uint32_t start,m_uint32_t end,
struct vdevice *dev,dev_handler_t handler)
{
struct pci_io_device *p;
if (!(p = malloc(sizeof(*p)))) {
fprintf(stderr,"pci_io_add: unable to create a new device.\n");
return NULL;
} /* 分配空间 */
p->start = start; /* 为各属性赋值 */
p->end = end;
p->real_dev = dev;
p->handler = handler;
p->next = d->dev_list;
p->pprev = &d->dev_list;
if (d->dev_list != NULL) /* 在设备列表中增加记录 */
d->dev_list->pprev = &p->next;
d->dev_list = p;
return p;
}
2.移除PCI I/O
函数原型为:
void pci_io_data_remove(vm_instance_t *vm,struct pci_io_data *d)
首先保证d不为空,然后移除pci i/o设备,再释放d自身的结构。
3.初始化PCI I/O
首先为其分配空间,然后在内存中设置相关信息,接着调用初始化设备的操作,将此PCI_IO的设备初始化,进行各种赋值操作包括其设备名称,私有的数据,物理地址,物理长度,设备句柄。最后虚拟机绑定设备的函数即vm_bind_device()将此PCI_IO绑定到虚拟机中。
具体函数实现是先定义一个pci_io_data类型的指针d,先分配PCI I/O 数据结构空间,再把pci_io赋给d指向的设备名称(d->dev.name),把d赋给d指向的dev.priv_data,把参数paddr赋给d指向的设备物理地址(d->dev.phys_addr),把2*1048576赋给d指向的设备物理长度(d->dev.phys_len),把pci_io_access赋给d->dev.handler。最后调用虚拟机绑定设备函数vm_bind_device(vm,&d->dev)实现。
此函数如下:
struct pci_io_data *pci_io_data_init(vm_instance_t *vm,m_uint64_t paddr)
{
struct pci_io_data *d;
if (!(d = malloc(sizeof(*d)))) {
fprintf(stderr,"PCI_IO: out of memory\n");
return NULL;
} /* 分配空间 */
memset(d,0,sizeof(*d)); /* 初始化内存 */
dev_init(&d->dev); /* 初始化设备 */
d->dev.name = "pci_io"; /* 赋值 */
d->dev.priv_data = d;
d->dev.phys_addr = paddr;
d->dev.phys_len = 2 * 1048576;
d->dev.handler = pci_io_access;
vm_bind_device(vm,&d->dev);
return(d);
}
4.创建一个新的NetIO
函数原型为:
static netio_desc_t *netio_create(char *name)
先为nio分配空间,设定nio型号为空,再保存名称。
5.删除一个NetIO
函数原型为:
int netio_delete(char *name)
通过调用registry_delete_if_unused(name,OBJ_TYPE_NIO,netio_free,NULL)函数实现。
6.保存一个NETIO配置信息
函数原型为:
void netio_save_config(netio_desc_t *nio,FILE *fd)
调用nio->save_cfg(nio,fd)函数来保存参数nio,fd的信息。
7.通过NETIO发送一个包
函数原型为:
ssize_t netio_send(netio_desc_t *nio,void *pkt,size_t len)
包括发送包的NIO名称, 发送包的字节数大小,其间要应用TX过滤器,最后成功返回发送包的信息。
8.通过NETIO接收一个包
函数原型为:
ssize_t netio_recv(netio_desc_t *nio,void *pkt,size_t max_len)
首先接收包的信息,包括包的名称,包的字节长度,再应用RX过滤器,返回包的长度len。
9.TCP sockets的实现
<< 上一页 [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] ... 下一页 >>
Dynamips设计与分析-Dynamips及相关教学软件研究与设计 第20页下载如图片无法显示或论文不完整,请联系qq752018766