- 博客(126)
- 资源 (5)
- 收藏
- 关注

原创 KVM,QEMU核心分析
目前正在学习虚拟化软件KVM相关运行原理、过程,对源码的分析进行了总结,只是为了学习交流使用,若有不正确的地方,希望大家提出。总入口:我的个人blog 文章列表1. kvm安装与启动过程说明2. kvm安装与启动过程说明-Kernel源码编译方式3. KVM硬件辅助虚拟化之 EPT(Extended Page Table)4. KVM硬件辅助虚拟
2014-07-16 13:12:34
5289
1
原创 virtio-netdev 数据包的发送
在前面几文中已经大体介绍了virtio的重要组成,包括virtio net设备的创建,vring的创建,与virtio设备的交互方式,我们就从网络数据包的发送角度来看下virtio的具体使用流程。[点击查看全文]http://luoye.me/2014/08/09/virtio-netdev-send/
2014-09-04 11:39:31
2292
原创 Vhost Architecture
在前面的文章中在介绍virtio机制中,可以看到在通常的应用中一般使用QEMU用户态程序来模拟I/O访问,而Guest中的数据要通过Guest到Host Userspace的第一次拷贝,再经过Host userspace的第二次拷贝,这种多次的数据拷贝和CPU特权级的切换对性能有相当大的影响。为加速virtio设备的I/O性能,VHOST通过driver的形式在Host Kernel中直接实现
2014-09-04 11:38:58
2003
原创 vring的创建
KVM上设备I/O虚拟化的性能问题长期存在,此时由Rusty Russell开发的virtio引起了开发者们的注意并逐渐被KVM等虚拟化平台接纳并作为了其I/O虚拟化最主要的一个通用框架。Virtio使用virtqueue来实现其I/O机制,每个virtqueue就是一个承载大量数据的queue。vring是virtqueue的具体实现方式。[点击查看全文]http://l
2014-09-04 11:37:43
1646
原创 virtio netdev的创建
Linux目前支持至少了8种虚拟化系统:XenKVMVMware’s VMIIBM’s System pIBM’s System zUser Mode LinuxlguestIBM’s legacy iSeries而新的系统也在不断的涌现,各个系统在网络设备、块设备、console及其它设备驱动在新特性支持和性能优化方面存在着瓶颈。为解决这些问题,Rusty Russell
2014-09-04 11:33:32
1260
原创 Guest与virtio netdev的交互方式
Qemu为virtio设备分配了专门的pci设备ID,device IDs (vendor ID 0x1AF4) from 0x1000 through 0x10FF,而pci子系统中的厂商ID和设备ID就成为了virtio类型和厂商域的组成,所以PCI驱动是不需要知道virtio设备类型的真正含义,对于Kernel来说只是注册了一个struct virtio_device,并挂载到了virtio
2014-09-04 11:33:06
1378
原创 Hypercall
在Linux中,大家应该对syscall非常的了解和熟悉,其是用户态进入内核态的一种途径或者说是一种方式,完成了两个模式之间的切换;而在虚拟环境中,有没有一种类似于syscall这种方式,能够从no root模式切换到root模式呢?答案是肯定的,KVM提供了Hypercall机制,x86体系架构也有相关的指令支持。[点击查看全文]http://luoye.me/2014/07/27/
2014-09-04 11:29:25
2420
原创 Qemu之Network Device全虚拟方案三: I/O虚拟化
前面两文主要对前端网络流的数据路径和虚拟网卡的创建进行了说明,这些可以看做是Guest OS网络数据包收发的准备工作,那么网络数据包是如何在Guest OS中进进出出的呢,本文就是重点讲述Guest OS的数据包的收发路径,其中涉及到一个重要的虚拟化技术,即I/O虚拟化。[点击查看全文]http://luoye.me/2014/07/26/netdev-virtual-3/
2014-09-03 12:18:54
1780
原创 Qemu之Network Device全虚拟方案二:虚拟网卡的创建
上文针对Qemu在前端网络流路径的建立方面做了详细的描述,数据包从Host的物理网卡经过Host Linux内核中的Bridge, 经过Tap设备到达了Qemu的用户态空间。而Qemu是如何把数据包送进Guest中的呢,这里必然要说到到虚拟网卡的建立。当命令行传入nic相关参数时,Qemu就会解析网络相关的参数后进入虚拟网卡的创建流程。而在上文中提到对于所有-net类型的设备,都视作一个n
2014-09-03 12:17:13
4131
2
原创 Qemu之Network Device全虚拟方案一:前端网络流的建立
KVM在I/O虚拟化方面,传统的方式是使用Qemu纯软件的方式来模拟I/O设备,其中包括经常使用的网卡设备。这次我们重点分析Qemu为实现网络设备虚拟化的全虚拟化方案。本主题从三个组成方面来完整描述,包括:1. 前端网络流的建立; 2. 虚拟网卡的创建; 3. 网络I/O虚拟化 in Guest OS。本篇主要讲述“前端网络流的建立”。[点击查看全文]http://luoye.
2014-09-03 12:15:10
2367
原创 KVM Run Process之KVM核心流程
在“KVM Run Process之Qemu核心流程”一文中讲到Qemu通过KVM_RUN调用KVM提供的API发起KVM的启动,从这里进入到了内核空间运行,本文主要讲述内核中KVM关于VM运行的核心调用流程,所使用的内核版本为linux3.15。[点击查看全文]http://luoye.me/2014/07/12/KVM_RUN_PROCESS2/
2014-08-31 18:04:50
1452
原创 KVM Run Process之Qemu核心流程
在前文中,介绍了在KVM环境下使用Qemu成功创建并运行了虚拟机,而这一切的背后是什么样的运作机制呢?本文主要介绍在整个创建和运行过程中Qemu与KVM里两者的核心运行流程。[点击查看全文]http://luoye.me/2014/07/12/KVM-RUN-PROCESS/
2014-08-31 18:02:41
1210
原创 KVM-Introduce
相信很多的人对虚拟机并不陌生,目前也有很多优秀的虚拟机软件,例如:VMware, VirtualBox, Xen, KVM等。而本文的主要内容是介绍KVM。KVM: Kernel Based Virtual Machine:[点击查看全文]http://luoye.me/2014/07/05/KVM-Introduce
2014-08-31 17:59:32
993
原创 KVM硬件辅助虚拟化之 EPT in Nested Virtualization
在嵌套虚拟环境(Nested Virtualization)下,运行在hypervisor上的Virtual Machine仍可以作为hypervisor去运行其它的Virutal Machine,而KVM也支持了这种强大的特性。而在《KVM硬件辅助虚拟化之 EPT》一文中,我们详细分析了单层虚拟机并引入硬件辅助虚拟化EPT功能的环境下,Guest OS中的虚拟地址到真实物理地址的访问方法
2014-08-31 17:57:10
2893
原创 KVM硬件辅助虚拟化之 EPT(Extended Page Table)
传统OS环境中,CPU对内存的访问都必须通过MMU将虚拟地址VA转换为物理地址PA从而得到真正的Physical Memory Access,即:VA->MMU->PA,见下图。虚拟运行环境中由于Guest OS所使用的物理地址空间并不是真正的物理内存,而是由VMM供其所使用一层虚拟的物理地址空间,为使MMU能够正确的转换虚实地址,Guest中的地址空间的转换和访问都必须借助VMM来实现,
2014-08-29 23:00:50
3647
原创 kvm安装与启动过程说明-Kernel源码编译方式
《kvm安装与启动过程说明》进行了通用桌面系统的虚拟机安装。在本文中将介绍自行编译linux Kernel内核源码,无桌面OS虚拟机安装和启动。为后续内核调试打下基础。[点击查看全文]http://luoye.me/2014/06/16/kvm-install-2/
2014-08-29 22:58:20
964
原创 virtio-blk浅析
和virtio-network一样,virtio-blk驱动使用Virtio机制为Guest提供了一个高性能的块设备I/O的方法。我们这里看下virtio-blk的实现。[点击查看全文] http://luoye.me/2014/08/29/virtio-blk/
2014-08-29 22:50:30
2429
原创 [Android学习笔记5]四大应用组件之一:Service 下
绑定方式的Service使用在实现绑定服务时,最重要的是定义onBind()回调方法返回的接口,有三种方式:1. 继承Binder类2. 使用Messenger3. 使用AIDL这里对1,2方式进行分析。 1.继承Binder类如果你的服务是你的应用程序的私有服务,并且跟客户端运行在同一个进程中,那么就应该通过继承Binder类来创建你的接口,并且佛从onBind(
2013-07-20 12:04:50
864
原创 [Android学习笔记4]四大应用组件之一:Service 上
一、什么是Service一个Service就是一个能够在后台执行长时操作的应用程序组件,并且不提供用户界面。一个应用程序组件能够启动一个Service,即使用户切换到另一个应用程序,这个Service也会继续在后台运行。另外,一个组件能够绑定一个跟它交互的Service,甚至是进程间通信(IPC)。例如,一个Service可以处理网络事务、播放音乐、执行文件I/O、或者跟CotentProvi
2013-07-19 21:31:23
1397
原创 [Android学习笔记3]ImageSwitcher
今天实现一个比较简单的图片切换效果的小程序。利用ImageSwitcher类,通过设置一个ViewFactory工厂,实现其makeView()方法来创建显示图片的View。方法setImageResource用来显示指定的图片资源。 1. 将8张图片放入/res/drawable目录下,同时命名为sample_0,sample_1,....sample_7等;2. 在代
2013-07-18 21:19:45
7222
原创 [Android学习笔记2]ListView
列表(List)视图可以将某种控件按照列表的形式组织起来。ListActivity 扩展了Activity可以方便 ListView的使用。ListActivity 类实际上集成了Activity和ListView 的功能,其内部包含了一个ListView ,使用这个类可以直接构造界面中的列表视图。
2013-07-16 21:06:41
1102
原创 [Android学习笔记1]Activity+Layout+Button
线性布局(LinearLayout)是指view对象在父view中可按水平或垂直方向线性排列。相对布局(RelativeLayout)是指view对象的排列依赖于各对象之间的相对位置。下面是展示两者的小例子,同时展示如何启动一个新的Activity和监听Button按键事件的方式。
2013-07-15 23:09:57
1043
转载 gdb查看内存区命令
用gdb查看内存格式: x /nfu 说明x 是 examine 的缩写n表示要显示的内存单元的个数f表示显示方式, 可取如下值x 按十六进制格式显示变量。d 按十进制格式显示变量。u 按十进制格式显示无符号整型。o 按八进制格式显示变量。t 按二进制格式显示变量。a 按十六进制格式显示变量。i 指令地址格式c 按字符格式显示变量。f 按浮点
2013-07-03 21:27:30
1204
转载 C和C++之间库的互相调用
昨晚有个朋友问我关于在C中调用C++库的问题,今天午饭后,由于脖子痛的厉害而没有加入到我们组的“每天一战”的行列中去,所以正好将C和C++之间的库调用关系做个总结。1.extern "C"的理解:很多人认为"C"表示的C语言,实际并非如此,"C"表示的是一种链接约定,只是因C和C++语言之间的密切关系而在它们之间更多的应用而已。实际上Fortran和汇编语言也常常使用,因为它们也正好符合C
2013-06-05 22:02:38
686
转载 gcc -l参数和-L参数
-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了 好了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数
2013-06-02 18:32:49
598
原创 [网络编程]epoll流程浅析
花了半天,把epoll的实现大体看了下,这里稍总结下:epoll相关的三个用户态API接口:1、epoll_create函数函数声明:int epoll_create(int size)该函数生成一个epoll专用的文件描述符。它其实是在内核申请一空间,用来存放你想关注的socket fd上是否发生以及发生了什么事件。size就是你在这个epoll fd上能关注的最大soc
2013-04-21 16:08:14
2585
原创 [网络编程]select流程分析
函数原型:int select(int maxfdp1,fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout)主要代码路径与文件 linux/fs/select.c linux/include/linux/poll.h select的调用路径sys_
2013-04-21 00:05:39
1795
原创 [网络编程]socket创建流程
今天分析下socket的创建流程关于用户态socket如何通过系统调用进入内核态到sys_socke,这里就不再分析,直接看内核态socket入口SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol){ int retval; struct socket *sock; int
2013-04-20 18:25:06
1737
转载 一个fork的面试题
转:前两天有人问了个关于Unix的fork()系统调用的面试题,这个题正好是我大约十年前找工作时某公司问我的一个题,我觉得比较有趣,写篇文章与大家分享一下。这个题是这样的:题目:请问下面的程序一共输出多少个“-”?#include #include #include int main(void){ int i; for(i=0; i<2; i++){
2013-04-19 18:25:13
781
转载 敏捷地写博客
为什么写博客写技术博客对于程序员的提升是不可估量的。只要你坚持一段时间,你就会发现它给你带来的各种积极的变化。思考问题更加深入了,更容易关注细节了,表达能力也增强了……不断的总结自己。程序员面对的世界是非常复杂的,未知领域也很多,在解决问题时第一次的方式并不一定是最完美的,只有通过不断的总结,不断的反思,才更容易抓住事物的本质。随着程序员的水平提高,需要思考的问题就开始变的更深度,更抽
2013-04-19 13:50:57
790
原创 linux网络协议栈分析笔记14-路由4-FIB3
看完fib的查找,弄清了一些数据结构的组织,我们再来看看路由表是如何创建的从ip_fib_init注册的两个通知链来看,在IP地址发送变动时会触发通知链的处理函数,都会调用fib_add_ifaddr()来添加地址到路由中这个里面由调用了fib_magic来进行路由地址的操作。static void fib_magic(int cmd, int type, __be32 dst, in
2013-04-16 21:32:22
1690
1
原创 linux网络协议栈分析笔记13-路由3-FIB2
当然,我们选择路由1那章的遗留的接口进入分析fib_lookup() 我们前面提到过fib初始化时,CONFIG_IP_MULTIPLE_TABLES 宏导致了两种方式的fib表初始化,因此存在了有多路由表存在和无多路由表存在的情况,我们先看无多路由表的情况static inline int fib_lookup(struct net *net, const stru
2013-04-14 19:48:10
2334
原创 linux网络协议栈分析笔记12-路由2-FIB1
上一章我们看到了通过fib_lookup去查找了路由信息,这一章我们就看看fib到底是什么FIB(Forward Information Base) 转发信息库inet_init()->ip_init()->ip_rt_init()->ipv4_dst_ops.kmem_cachep = kmem_cache_create("ip_dst_cache"
2013-04-14 19:46:30
1935
原创 linux网络协议栈分析笔记11-路由1-路由缓存
来吧,路由路由是网络的核心,是linux网络协议栈的核心,我们找个入口进去看看还记得在笔记5-IP层的处理1中ip_rcv_finish走到过一个岔口->ip_rcv_finish() ->ip_route_input() 查找路由信息 ->if (iph->ihl > 5 && ip_rcv_options(skb)) 如果IP头部大于20字节,则表
2013-04-13 20:20:53
3259
原创 linux网络协议栈分析笔记10-arp邻居子系统3
还是回到neigh_resolve_output()int neigh_resolve_output(struct sk_buff *skb){ struct dst_entry *dst = skb_dst(skb); struct neighbour *neigh; int rc = 0; if (!dst || !(neigh =
2013-04-12 19:41:49
1886
原创 linux网络协议栈分析笔记9-arp邻居子系统2
上回说到流量输出会走到neigh_resolve_output 我们来看看邻居这玩意能玩点什么花样,传说的arp学习在哪里int neigh_resolve_output(struct sk_buff *skb){ struct dst_entry *dst = skb_dst(skb); struct neighbour *neigh; int rc
2013-04-12 19:40:37
2063
原创 linux网络协议栈分析笔记8-arp邻居子系统1
我们进入arp协议,我们看看linux中号称邻居子系统是啥样的static struct packet_type arp_packet_type __read_mostly = { .type = cpu_to_be16(ETH_P_ARP), .func = arp_rcv,};还记得那个netif_receive_skb吧,选择
2013-04-11 21:54:02
1778
原创 linux网络协议栈分析笔记7-VLAN的处理
这次先看看VLAN怎么处理的 主要代码目录linux/net/8021qdev_add_pack(&vlan_packet_type); vlan-802.1qstatic struct packet_type vlan_packet_type __read_mostly = { .type = cpu_to_be16(ETH_P_8021Q)
2013-04-10 20:10:32
2027
原创 linux网络协议栈分析笔记6-IP层的处理2
上章说到ip_rcv_finish最后会有两个选择:1)ip_local_deliver2)ip_forward现在我们看下ip_forward()->ip_forward() ->struct ip_options * opt = &(IPCB(skb)->opt); option中保存的是skb的一些ip头中的options信息 ->if
2013-04-09 21:07:01
1760
Linux内核设计的艺术
2012-12-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人