ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

VHOST_SET_MEM_TABLE 的设置

2022-01-22 11:58:14  阅读:234  来源: 互联网

标签:size map SET addr vhost MEM VHOST iotlb guest


vhost收到 VHOST_SET_MEM_TABLE 后,设置guest内存空间布局,用于映射 guest 物理内存与 host 虚拟内存。

KVMTOOL SETUP

struct vhost_memory *mem;
list_for_each_entry(bank, &kvm->mem_banks, list) {
		mem->regions[i] = (struct vhost_memory_region) { 
                            //guest 物理内存与 host 用户态虚拟内存的1:1映射
							.guest_phys_addr = bank->guest_phys_addr,
							.memory_size     = bank->size,
							.userspace_addr  = (unsignedlong)bank->host_addr,
		};
		i++;
}
mem->nregions = i;

r = ioctl(vdev->vhost_fd, VHOST_SET_MEM_TABLE, mem);
if (r != 0)
    die_perror("VHOST_SET_MEM_TABLE failed");

KERNEL SETUP

vhost_dev_ioctl
    vhost_set_memory
        vhost_iotlb_add_range(newumem,
		    		    region->guest_phys_addr,
                        region->guest_phys_addr + region->memory_size - 1,
				        region->userspace_addr,
                        VHOST_MAP_RW)

int vhost_iotlb_add_range(struct vhost_iotlb *iotlb, u64 start,
                          u64 last, u64 addr, unsignedint perm)
{               
		struct vhost_iotlb_map *map;      

        map = kmalloc(sizeof(*map), GFP_ATOMIC);

		map->start = start; //guest_phys_addr start
		map->size = last - start + 1;
		map->last = last;   //guest_phys_addr end
		map->addr = addr;   //userspace_addr start
		map->perm = perm;

		iotlb->nmaps++;
		vhost_iotlb_itree_insert(map, &iotlb->root);//map信息插入到rb tree

		INIT_LIST_HEAD(&map->link);
		list_add_tail(&map->link, &iotlb->list);
		return0;
}

KERNEL USESAGE

tx kick func(receive guest message)
    vhost_get_vq_desc
        translate_desc


static int translate_desc(struct vhost_virtqueue *vq, u64 addr,
                          u32 len, struct iovec iov[], int 	
                          iov_size, int access)
{
        const struct vhost_iotlb_map *map;
        map = vhost_iotlb_itree_first(umem, addr, addr + len - 1); 
                                            //addr是virtio前端驱动填充到vring desc中的
                                            //guest物理物址

		size = map->size - addr + map->start; 
           //= map->size - offset (addr - map->start)
 
		_iov->iov_len = min((u64)len - s, size);

        //host 用户态虚拟地址 = host 用户态起始虚拟地址 + offset(guest 物理地址 - guest 物
                              理起始地址)
		_iov->iov_base = (void __user *)(unsigned long)(map->addr + addr - 
                                                                   map->start);
}

标签:size,map,SET,addr,vhost,MEM,VHOST,iotlb,guest
来源: https://blog.csdn.net/yiyeguzhou100/article/details/122635116

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有