自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

白水煮鸡蛋

路漫漫其修远兮~~~~~~~~~~

  • 博客(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 5210 3

原创 virtio-netdev 数据包的发送

在前面几文中已经大体介绍了virtio的重要组成,包括virtio net设备的创建,vring的创建,与virtio设备的交互方式,我们就从网络数据包的发送角度来看下virtio的具体使用流程。[点击查看全文]http://luoye.me/2014/08/09/virtio-netdev-send/

2014-09-04 11:39:31 2223

原创 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 1936

原创 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 1565

原创 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 1204

原创 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 1325

原创 Hypercall

在Linux中,大家应该对syscall非常的了解和熟悉,其是用户态进入内核态的一种途径或者说是一种方式,完成了两个模式之间的切换;而在虚拟环境中,有没有一种类似于syscall这种方式,能够从no root模式切换到root模式呢?答案是肯定的,KVM提供了Hypercall机制,x86体系架构也有相关的指令支持。[点击查看全文]http://luoye.me/2014/07/27/

2014-09-04 11:29:25 2346

原创 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 1718

原创 Qemu之Network Device全虚拟方案二:虚拟网卡的创建

上文针对Qemu在前端网络流路径的建立方面做了详细的描述,数据包从Host的物理网卡经过Host Linux内核中的Bridge, 经过Tap设备到达了Qemu的用户态空间。而Qemu是如何把数据包送进Guest中的呢,这里必然要说到到虚拟网卡的建立。当命令行传入nic相关参数时,Qemu就会解析网络相关的参数后进入虚拟网卡的创建流程。而在上文中提到对于所有-net类型的设备,都视作一个n

2014-09-03 12:17:13 4025 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 2335

原创 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 1387

原创 KVM Run Process之Qemu核心流程

在前文中,介绍了在KVM环境下使用Qemu成功创建并运行了虚拟机,而这一切的背后是什么样的运作机制呢?本文主要介绍在整个创建和运行过程中Qemu与KVM里两者的核心运行流程。[点击查看全文]http://luoye.me/2014/07/12/KVM-RUN-PROCESS/

2014-08-31 18:02:41 1160

原创 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 946

原创 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 2801

原创 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 3507 1

原创 kvm安装与启动过程说明-Kernel源码编译方式

《kvm安装与启动过程说明》进行了通用桌面系统的虚拟机安装。在本文中将介绍自行编译linux Kernel内核源码,无桌面OS虚拟机安装和启动。为后续内核调试打下基础。[点击查看全文]http://luoye.me/2014/06/16/kvm-install-2/

2014-08-29 22:58:20 905

原创 kvm安装与启动过程说明

根据这段时间对Linux KVM的研究,现将KVM的安装与Virtual OS的启动进行总结说明。

2014-08-29 22:55:33 815

原创 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 2385

原创 [Android学习笔记5]四大应用组件之一:Service 下

绑定方式的Service使用在实现绑定服务时,最重要的是定义onBind()回调方法返回的接口,有三种方式:1. 继承Binder类2. 使用Messenger3. 使用AIDL这里对1,2方式进行分析。 1.继承Binder类如果你的服务是你的应用程序的私有服务,并且跟客户端运行在同一个进程中,那么就应该通过继承Binder类来创建你的接口,并且佛从onBind(

2013-07-20 12:04:50 814

原创 [Android学习笔记4]四大应用组件之一:Service 上

一、什么是Service一个Service就是一个能够在后台执行长时操作的应用程序组件,并且不提供用户界面。一个应用程序组件能够启动一个Service,即使用户切换到另一个应用程序,这个Service也会继续在后台运行。另外,一个组件能够绑定一个跟它交互的Service,甚至是进程间通信(IPC)。例如,一个Service可以处理网络事务、播放音乐、执行文件I/O、或者跟CotentProvi

2013-07-19 21:31:23 1313

原创 [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 7127 3

原创 [Android学习笔记2]ListView

列表(List)视图可以将某种控件按照列表的形式组织起来。ListActivity 扩展了Activity可以方便 ListView的使用。ListActivity 类实际上集成了Activity和ListView 的功能,其内部包含了一个ListView ,使用这个类可以直接构造界面中的列表视图。

2013-07-16 21:06:41 1051

原创 [Android学习笔记1]Activity+Layout+Button

线性布局(LinearLayout)是指view对象在父view中可按水平或垂直方向线性排列。相对布局(RelativeLayout)是指view对象的排列依赖于各对象之间的相对位置。下面是展示两者的小例子,同时展示如何启动一个新的Activity和监听Button按键事件的方式。

2013-07-15 23:09:57 984

转载 gdb查看内存区命令

用gdb查看内存格式: x /nfu 说明x 是 examine 的缩写n表示要显示的内存单元的个数f表示显示方式, 可取如下值x 按十六进制格式显示变量。d 按十进制格式显示变量。u 按十进制格式显示无符号整型。o 按八进制格式显示变量。t 按二进制格式显示变量。a 按十六进制格式显示变量。i 指令地址格式c 按字符格式显示变量。f 按浮点

2013-07-03 21:27:30 1147

转载 C和C++之间库的互相调用

昨晚有个朋友问我关于在C中调用C++库的问题,今天午饭后,由于脖子痛的厉害而没有加入到我们组的“每天一战”的行列中去,所以正好将C和C++之间的库调用关系做个总结。1.extern "C"的理解:很多人认为"C"表示的C语言,实际并非如此,"C"表示的是一种链接约定,只是因C和C++语言之间的密切关系而在它们之间更多的应用而已。实际上Fortran和汇编语言也常常使用,因为它们也正好符合C

2013-06-05 22:02:38 653

转载 gcc -l参数和-L参数

-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了 好了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数

2013-06-02 18:32:49 573

原创 [网络编程]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 2514

原创 [网络编程]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 1739

原创 [网络编程]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 1678

转载 一个fork的面试题

转:前两天有人问了个关于Unix的fork()系统调用的面试题,这个题正好是我大约十年前找工作时某公司问我的一个题,我觉得比较有趣,写篇文章与大家分享一下。这个题是这样的:题目:请问下面的程序一共输出多少个“-”?#include #include #include int main(void){ int i; for(i=0; i<2; i++){

2013-04-19 18:25:13 743

转载 敏捷地写博客

为什么写博客写技术博客对于程序员的提升是不可估量的。只要你坚持一段时间,你就会发现它给你带来的各种积极的变化。思考问题更加深入了,更容易关注细节了,表达能力也增强了……不断的总结自己。程序员面对的世界是非常复杂的,未知领域也很多,在解决问题时第一次的方式并不一定是最完美的,只有通过不断的总结,不断的反思,才更容易抓住事物的本质。随着程序员的水平提高,需要思考的问题就开始变的更深度,更抽

2013-04-19 13:50:57 747

原创 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 1598 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 2246

原创 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 1863

原创 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 3074

原创 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 1818

原创 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 1948

原创 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 1707

原创 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 1953

原创 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 1689

glibc2.9源代码

glibc2.9 提供了标准c接口头文件和一些c库函数,对于c编程有一定的参考价值

2013-04-16

Linux内核设计的艺术

学习linux内核不错的资料 本书导读   前言   第1章 从开机加电到执行main函数之前的过程1   1.1 启动BIOS,准备实模式下的中断向量表和中断服务程序1   1.1.1 BIOS的启动原理2   1.1.2 BIOS在内存中加载中断向量表和中断服务程序3   1.2 加载操作系统内核程序并为保护模式做准备4   1.2.1 加载第一部分代码—引导程序(bootsect)5   1.2.2 加载第二部分代码—setup7   1.2.3 加载第三部分代码—system模块12   1.3 开始向32位模式转变,为main函数的调用做准备16   1.3.1 关中断并将system移动到内存地址起始位置0x0000016   1.3.2 设置中断描述符表和全局描述符表18   1.3.3 打开A20,实现32位寻址20   1.3.4 为在保护模式下执行head.s做准备21   1.3.5 head.s开始执行24   1.4 本章小结41   第2章 从main到怠速42   2.1 开中断之前的准备工作43   2.1.1 复制根设备号和硬盘参数表 44   2.1.2 物理内存规划格局45   2.1.3 虚拟盘设置与初始化46   2.1.4 内存管理结构mem_map初始化47   2.1.5 异常处理类中断服务程序挂接48   2.1.6 初始化块设备请求项结构50   2.1.7 与建立人机交互界面相关的外设的中断服务程序挂接52   2.1.8 开机启动时间设置55   2.1.9 系统开始激活进程056   2.1.10 进程相关事务初始化设置57   2.1.11 时钟中断设置59   2.1.12 系统调用服务程序挂接59   2.1.13 初始化缓冲区 。。。。。。。。。

2012-12-02

linux内存管理之伙伴系统分析(大内存分配)

linux内存管理之伙伴系统分析(大内存分配)

2012-04-08

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除