- 博客(734)
- 资源 (92)
- 收藏
- 关注
原创 HTTP协议 (四) 缓存
http://www.cnblogs.com/TankXiao/archive/2012/11/28/2793365.html
2015-04-19 09:32:26
344
原创 QEMU设备模拟
备模拟目的我们好像不会干一件事而毫无目的,就算不停刷微信朋友圈也是为了打发你无聊的时间。其实最装B的回答是:设备模拟的目的就是模拟设备。这话是屁话,不过也能说明些什么,确实是模拟设备,用软件的方式提供硬件设备具备的功能。对于和PC机交互的硬件设备,主要要干两件事,一是提供IRQ中断,二是响应IO输入输出。IO包括PIO/MMIO/DMA等(DMA算不算IO?)以i8254.c实现的
2015-04-18 20:34:10
3069
原创 KVM+QEMU世界中的pci总线与virtio总线 module_call_init pc_machine_init
在qemu中增加pci设备并用linux驱动验证这篇文章的背景是通过9p文件系统在host os与guest os间共享一个目录,或许更专业点的叫法是File system Passthru. 因此需要配置guest os中Linux内核,使之支持下面的选项(.config):CONFIG_NET_9P=yCONFIG_NET_9P_VIRTIO=mCONFIG
2015-04-18 20:16:01
1649
原创 struct file_operations kvm_vm_fops
KVM在和用户态程序进行交互的过程中,主要通过/dev/kvm设备文件进行通信。从后文的KVM的初始化过程中可以得知,/dev/kvm是一个字符型设备,通过符合Linux标准的一系列结构体进行支撑,主要是kvm_chardev_ops、kvm_vm_fops、kvm_vcpu_fops,分别对应字符型设备、VM文件描述符和VCPU文件描述符的三种操作。kvm_chardev_ops的定义在vi
2015-04-18 19:54:35
622
原创 OpenStack QEMU
我们在OpenStack中使用的就是QEMU的虚拟化功能。 QEMU进程直接使用了KVM的接口/dev/kvm,向KVM发送创建虚拟机和运行虚拟机的命令。框架代码如下:open("/dev/kvm")ioctl(KVM_CREATE_VM)ioctl(KVM_CREATE_VCPU)for (;;) {ioctl(KVM_RUN)switch (exit_rea
2015-04-18 10:41:14
912
原创 Qemu mmap
KVM的抽象对象 KVM同应用程序(Qemu)的交互接口为/dev/kvm,通过open以及ioctl系统调用可以获取并操作KVM抽象出来的三个对象,Guest的虚拟处理器(fd_vcpu[N]), Guest的地址空间(fd_vm), KVM本身(fd_kvm)。其中每一个Guest可以含有多个vcpu,每一个vcpu对应着Host系统上的一个线程。 Qemu启动Guest系统时,通过/
2015-04-18 10:33:29
1028
原创 kvm 中的kvm_run 是如何与qemu中的kvm_run联系到一起
kvm 中的kvm_run 是如何与qemu中的kvm_run联系到一起的在qemu下面的函数中,完成了 env->kvm_run的映射.int kvm_init_vcpu(CPUArchState *env)env->kvm_run = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED,238
2015-04-18 10:24:43
1474
原创 Io与中断
I/O客户机退出后回调用vmx_handle_exit() 这里应该是处理的IO请求或者其他 基本的函数调用过程:kvm_vcpu_ioctl->kvm_arch_vcpu_ioctl_run(vcpu, vcpu->runkvm_arch_vcpu_ioctl_run(vcpu, vcpu->run)->__vcpu_run(vcpu)->vcpu_enter_guest(
2015-04-18 10:19:33
2362
原创 kvm 中断以及io虚拟化 cpu_enter_guest->inject_pending_event
vcpu_enter_guest->inject_pending_event->中检查是否有中断到来(其检测的为vcpu->arch.interrupt.pending)这里有个问题,设置相应的中断是在apic_set_vector(vector, apic->regs + APIC_TMR)设置,这里设置完了后在哪里被解析出来,这里和上面检测的不一样,这个函数代表的是写相应的寄存器kvm
2015-04-18 10:16:52
1330
原创 Guest OS, Qemu, KVM工作流程 kvm_vmx_exit_handlers kvm_vcpu_ioctl kvm_x86_ops->handle_exit
这里主要介绍基于x86平台的Guest Os, Qemu, Kvm工作流程,如图,通过KVM APIs可以将qemu的command传递到kvm: 1.创建VM system_fd = open("/dev/kvm", xxx); vm_fd = ioctl(system_fd, KVM_CREATE_VM, xxx); 2.创建VCPU vcpu_fd = kvm_vm_io
2015-04-18 09:58:30
2108
原创 struct kvm_io_device_ops struct virtio_device
在 KVM 内核空间的 MMIO 和 PIO 实现比较简单, KVM 实现了一个抽象的 IO_BUS 模型,把所有的设备都按 struct kvm_io_device 抽象实现,要求每个都提供自己的 struct kvm_io_dev_ops 接口的实现, 每个平台设备的 struct kvm_io_dev_ops 的 read/write 函数的主要功能就是根据 IO 地址读写该设备内核数据结构
2015-04-17 23:45:08
706
原创 kvm_cpu_exec
http://blog.csdn.net/dashulu/article/details/17090293接着KVM虚拟机IO处理过程中Guest Vm IO处理过程(http://blog.csdn.net/dashulu/article/details/16820281),本篇文章主要描述IO从guest vm跳转到kvm和qemu后的处理过程. 首先回顾一下kvm的启动过程
2015-04-17 23:38:07
994
原创 中断注入
中断注入中断注入实际是向客户机CPU注入一个事件,这个事件包括异常和外部中断和NMI。异常我们一般看作为同步,中断被认为异步。硬件具体实现就中断注入实际就是设置VMCS中字段VM-Entry interruption-infomation字段。中断注入实际在VM运行前完成的,具体代码如下:static int vcpu_enter_guest(struct kvm_vcpu *vcpu
2015-04-17 23:34:36
1933
原创 qemu-kvm 设备虚拟化----I/O 端口和 I/O 内存
操作设备存在两种接口:I/O 端口和 I/O 内存,下面分析虚拟机如何截获和模拟这两种情况的。1.用户空间访问内核数据结构信息内存映射可被实现来提供用户程序对设备内存的直接存取,KVM 内核代表每个 VCPU 的 struct kvm_run 数据结构被 mmap用户空间,从而用户空间可以读取 struct kvm_run 中的信息,对于mmio读写操作来说,可以知道其地址和大小。
2015-04-17 23:28:05
1874
原创 load_file(vm_mem + 0x100000, av[2]); virDomainCreateXM
清单 1. 测试 KVM 系统管理程序的应用程序片断int main(){ void *vm_mem; kvm = kvm_init(&test_callbacks, 0); if (!kvm) { fprintf(stderr, "kvm_init failed\n"); return 1; } if (kvm_create(kvm, 128 * 102
2015-04-17 23:16:12
856
原创 qemu-kvm 线程事件模型 【QEMU-KVM代码分析之三】
qemu-kvm 线程事件模型1.主(父)线程。主线程执行循环,主要做三件事情1).执行select操作,查询文件描述符有无读写操作2).执行定时器回调函数3).执行下半部(BH)回调函数。为什么要采用BH,资料说主要避免可重入性和调用栈溢出。2.执行客户机代码的线程只讨论kvm执行客户机代码情况(不考虑TCG,TCG采用动态翻译技术),如果有多个vcpu,就意味着
2015-04-17 23:07:24
3214
原创 KVM中Guest OS的调度执行
2.1 KVM中Guest OS的调度执行VMM调度Guest OS执行时,Qemu通过ioctl系统调用进入内核模式,在KVM Driver中通过get_cpu获得当前物理CPU的引用。之后将Guest状态从VMCS中读出。并装入物理CPU中。执行VMLAUCH指令使得物理处理器进入非根操作环境,运行客户代码。当Guest OS执行一些特权指令或者外部事件时,比如I/O访问,对控
2015-04-17 22:54:51
2116
原创 看操作系统虚拟化原理总结篇——VMCS详解
1.VMCS的组成有三部分:偏移0处是版本标识,偏移4处是中止指示,偏移8处是VMCS的数据域,其中第三部分才是我们要考虑的重点。它是被保存在内存中的。2,为什么要引入VMCS这完全是由于Intel VT_x来引起的,它主要被CPU进行操作,然后保存着VCPU的相关寄存器的信息和内容。可以这么理解,一个物理CPU通过VMCS能够获得每个虚拟CPU的各种信息。另外VT_x也提供了
2015-04-17 22:47:02
3771
原创 操作系统虚拟化原理总结篇——VMCS详解
1.VMCS的组成有三部分:偏移0处是版本标识,偏移4处是中止指示,偏移8处是VMCS的数据域,其中第三部分才是我们要考虑的重点。它是被保存在内存中的。2,为什么要引入VMCS这完全是由于Intel VT_x来引起的,它主要被CPU进行操作,然后保存着VCPU的相关寄存器的信息和内容。可以这么理解,一个物理CPU通过VMCS能够获得每个虚拟CPU的各种信息。另外VT_x也提供了
2015-04-17 22:44:52
2304
原创 QEMU中的IOCTL
5. QEMU中的IOCTL在QEMU-KVM中,用户空间的QEMU是通过IOCTL与内核空间的KVM模块进行通讯的。1. 创建KVM在/vl.c中通过kvm_init()将会创建各种KVM的结构体变量,并且通过IOCTL与已经初始化好的KVM模块进行通讯,创建虚拟机。然后创建VCPU,等等。2. KVM_RUN这个IOCTL是使用最频繁的,整个KVM运行就不停在执行这个IOC
2015-04-17 22:41:41
1339
原创 kvm虚拟化
http://blog.chinaunix.net/uid-26000137-id-3761116.html从软件架构上来说,kvm提供了两个内核模块,使用kvm的io_ctl接口可以管理vcpu和内存,为vcpu注入中断和提供时钟信号,而kvm本身没有提供设备的模拟。设备模拟需要应用层软件Qemu来实现。这种架构保证了kvm避免了繁琐的设备模拟和设备驱动部分(内核中80%以上的代
2015-04-17 22:31:42
1596
原创 ip_route_output_slow() ip_route_input()与linux的tunnel技术实现 ipip_tunnel_lookup
Linux-2.6.21.1 网络函数调用流程 接收以太帧:netif_rx -> queue -> netif_receive_skb -> bond -> packet_type_all: deliver_skb -> bridge -> packet_type(IPV4)->func == ip_rcv 接收IPv4包:ip_rcv
2015-04-12 19:47:48
2054
原创 Linux内核路由过程简述 ip_route_output_slow() ip_route_input()
环回接口(loopback interface)的新认识 背景前些日子在IDC实验docker的时候,为了避免与公司网络冲突,将bridge设置为127.x网段的IP,原以为这样就OK,后来发现在访问container内部的服务的时候无法访问。开始以为iptables的问题,搞了半天,后来,才发现系统对127.x.x.x的包根本不会经过bridge。这两天补习了一下linux的路由实现,才彻底
2015-04-12 19:39:27
5141
1
原创 TCP/IP关于环回接口的描述
环回接口(loopback interface)的新认识背景前些日子在IDC实验docker的时候,为了避免与公司网络冲突,将bridge设置为127.x网段的IP,原以为这样就OK,后来发现在访问container内部的服务的时候无法访问。开始以为iptables的问题,搞了半天,后来,才发现系统对127.x.x.x的包根本不会经过bridge。这两天补习了一下linux
2015-04-12 19:35:43
5821
原创 络设备的IP地址结构
络设备的IP地址结构====================(1) 在TCPIP协议环境下,网络设备结构(net_device)具有一个ip_ptr指针指向IP协议的设备参数块(in_device),它包含设备IP地址结构(in_ifaddr)的链表指针(ifa_list).IP地址结构链可以为一个网络设备配置多个IP地址,使得局域网中的单台主机能模拟多台主机的作用.
2015-04-12 19:32:40
453
原创 网络设备的IP地址结构
络设备的IP地址结构====================(1) 在TCPIP协议环境下,网络设备结构(net_device)具有一个ip_ptr指针指向IP协议的设备参数块(in_device),它包含设备IP地址结构(in_ifaddr)的链表指针(ifa_list).IP地址结构链可以为一个网络设备配置多个IP地址,使得局域网中的单台主机能模拟多台主机的作用.
2015-04-12 19:30:15
631
原创 从ip addr add和ifconfig的区别看linux网卡ip地址的结构
今天一个老外在邮件列表上问了一个问题,就是ip addr add和ifconfig的区别,我给他进行了解答,可能因为英语不好吧,解答的很简单,因此我还是要在这里详细说明一下。其实它们之间没有什么区别,只 是表述方式不同罢了。如果你非常理解网络协议的原理以及网络的分层架构那么我想你就不会有这个问题,实际上,每一个网卡设备都有一个mac地址,但是却可 以有多个网络层地址,比如IP地址,然而这个事实
2015-04-12 19:26:08
6094
原创 IP地址
IP地址 /include/linux/inetdevice.h,定义IPV4专用的网络设备相关的结构、宏等 /net/ipv4/devinet.c,支持IPV4特性的设备操作接口 数据组织 net_device结构中包含了驱动相关的所有信息,先按分类把同一类型的信息组织到其他结构中,然后嵌套到net_device结构中。例如,与ipv4相关的配置存放在in_device结构中,I
2015-04-12 19:25:25
475
原创 关于IP网段间互访的问题—路由是根本
之所以IP网段间可以互相访问,完全靠的就是路由,因此路由是IP通信的根本,ip是机器可以进行通信的资格证书,而路由决定该机器的数据可以到哪以及如何到。没有路由就不可能有IP网络,IP其实就是一个标号,而IP路由就是精心设计的基于这种标号的寻址机制。这种逻辑上的解决方案使整个世界连接在了一起从而成为一个整体,前面说过,ip提供了一个逻辑的物理层,而传输层就是逻辑上的链路层,那么整个ip网络就是一个逻
2015-04-12 19:24:37
498
原创 网络设备的IP地址结构
1) 在TCPIP协议环境下,网络设备结构(net_device)具有一个ip_ptr指针指向IP协议的设备参数块(in_device),它包含设备IP地址结构(in_ifaddr)的链表指针(ifa_list).IP地址结构链可以为一个网络设备配置多个IP地址,使得局域网中的单台主机能模拟多台主机的作用. (2) 设备IP地址的配置由应用程序通过ioctl()系统调用使用
2015-04-12 19:21:46
821
原创 openstack中swift和cinder中的区别
swift是object storage(对象存储),将object(可以理解为文件)存储到bucket(可以理解为文件夹)里,你可以用swift创建container,然后上传文件,例如视频,照片,这些文件会被replication到不同服务器上以保证可靠性,swift可以不依靠虚拟机工作。所谓的云存储,OpenStack就是用swift实现的,类似于Amazon AWS S3(Simple S
2015-02-14 11:29:52
2181
原创 openstack网络模式
openstack neutron中定义了四种网络模式:# tenant_network_type = local# tenant_network_type = vlan # Example: tenant_network_type = gre# Example: tenant_network_type = vxlan 本文主要以vlan为例,并
2015-02-08 19:41:00
821
原创 kvm 存储栈分析
1. kvm与qemu的关系 发现好多同学还是不太了解kvm与qemu的关系,首先做个简单的介绍:qemu:it is a emulator, 用来仿真cpu,设备,总线等设备kvm: it's a kenerl module, 用来处理qemu向内核发起的请求总结一下: qemu是kvm的客户端展现,kvm是内核为qemu提供的服务代理,用来处理qemu的请求。
2015-02-08 19:15:55
701
原创 qemu虚拟机中客户机上网
启动KVM进程,例如;qemu-kvm -m 1024 -smp 4 -hda php-el5.4-vm.img -cdrom /home/wills/CentOS-5.4-x86_64-bin-DVD.iso -net nic,macaddr=00:3e:00:12:34:80 -net tap,script=/etc/init.d/qemu-ifup -boot d -vnc 192.
2015-02-08 15:28:42
1381
原创 qemu network backend的初始化
Network优化:1、virtio-net:基于virtio框架的虚拟以太网设备vhost_net优化:内核进程vhost_XXXX其他优化选项:数据发送的完整流程在上面过程中可以看到vhost最核心处就在于将Guest中的virtio用于传输层的vring队列空间通过mapping方式与Host Kernel进行了共享,这样数据就
2015-02-08 14:34:40
2147
原创 qemu虚拟机与外部网络的通信
如果想用virtio来实现一个虚拟设备大概流程是这样的:1、自己实现scan设备的功能,然后调用register_virtio_device 函数来注册发现的虚拟设备。参考drivers/lguest/lguest_device.c里面的scan_devices 函数。一个典型的实现是,虚拟机主机提供的共享内存配置,里面提供了虚拟设备的列表一样的配置,然后自己根据配置注册device。
2015-02-08 14:15:49
1270
原创 Nginx upstream原理分析【1】upstream和FastCGI前篇
[Nginx 源码分析] Fastcgi 模块(下)http://www.tuicool.com/articles/YbE3AfNginx upstream原理分析【1】upstream和FastCGI前篇http://chenzhenianqing.cn/articles/764.htmlspawn-fcgi 代码介绍
2015-02-01 21:21:47
1988
原创 HAProxy 研究笔记 -- TCP 连接处理流程
本文基于 HAProxy 1.5-dev7 版本。目录1. 关键数据结构 session2. 相关初始化2.1. 初始化处理 TCP 连接的方法2.2. 初始化 listener2.3. 绑定所有已注册协议上的 listeners2.4. 启用所有已注册协议上的 listeners3. TCP 连接的处理流程3.1. 接受新建连接
2015-02-01 11:13:28
1894
原创 HAProxy
HAProxy的event_accept函数源码分析HAProxy的独门武器:ebtreeNginx使用ETag功能的分析HAProxy 研究笔记 -- HTTP请求处理-1-接收HAProxy 研究笔记 -- 主循环处理流程 HAProxy 研究笔记 -- HTTP请求处理-2-解析HAProxy 研究笔记 -- epoll 事件的处理多个进程绑定相同端口的实现分析[
2015-02-01 10:57:34
529
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅