自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(90)
  • 收藏
  • 关注

原创 OVS datapath流表结构及匹配过程

datapath流表的查找函数是ovs_flow_tbl_lookup_stats,在此之前,先看下datapath组织流表的方式。 最新2.6的ovs流表,已经不是最早单纯的精确匹配了,而是一种精确匹配+带掩码匹配合并在一起的方式,叫做megaflow,目的是减少datapath里精确流表的条目数。但在我看来,这种方式只是在yy,在大规模生产环境下,不会因为用了megaflow精确流表就会变得可

2016-11-01 01:39:11 8184

原创 ovs的upcall及ofproto-dpif处理细节

无论是内核态datapath还是基于dpdk的用户态datapath,当flow table查不到之后都会进入upcall的处理(我喜欢管这条路径叫做慢速路径,那么datapath里就是快速路径啦~~)

2016-10-24 03:04:15 6436

原创 ovs vswitchd的启动分析

ovs vswitchd的启动vswitchd启动代码可参考ovs-vswitchd.c的main函数,其中最重要的两个函数是bridge_run以及netdev_runbridge_runvoid bridge_run() { ... /* Initialize the ofproto library. This only needs to run once, but

2016-10-18 01:20:08 5421

原创 ovs的netdev, ofproto以及dpif etc.

How to Port Open vSwitch to New Software or Hardware====================================================Open vSwitch (OVS) is intended to be easily ported to new software andhardware platforms. T

2016-10-10 02:08:11 7285

原创 virtio network驱动分析

本文以virtio网络驱动为例,分析virtio驱动是如何处理网络IO的,驱动的定义如下static struct virtio_device_id id_table[] = { { VIRTIO_ID_NET, VIRTIO_DEV_ANY_ID }, { 0 },};static unsigned int features[] = { VIRTIO_NET_F

2016-05-10 03:04:15 10431

原创 virtio后端方案vhost

vhost是virtio的另一种方案,用于跳过qemu,减少qemu和内核之间上下文切换的开销,对于网络IO而言提升尤其明显。vhost目前有两种实现方案,内核态和用户态,本文重点讨论内核态的vhostvhost内核模块主要处理数据面的事情,控制面上还是交给qemu,vhost的数据结构如下struct vhost_dev { MemoryListener memory_liste

2016-05-09 11:00:10 9704

原创 qemu的virtqueue实现

和内核一样,qemu也需要支持virtqueue,VirtQueue的定义如下#define VIRTIO_PCI_VRING_ALIGN 4096typedef struct VRingDesc{ uint64_t addr; uint32_t len; uint16_t flags; uint16_t next;} VRingDesc

2016-04-27 16:27:57 4446

原创 virtio的qemu总线与设备模型

(很多内容是网上找的,+上我个人的一点理解,推荐大家去看 http://mnstory.net/2014/10/qemu-device-simulation 这篇文章)qemu启动时,如果配置了相应virtio设备,会对guest的pci总线,virtio设备等进行模拟,先来看看qemu的设备模拟,那i8254/PIT为例(PIT的硬件规范略过,有兴趣的话可以参考 http://wiki.os

2016-04-25 21:15:56 15237

原创 virtio的vring队列

上一篇已经提到,在virtio设备初始化的过程中,会通过setup_vp创建virtqueue,目前的virtqueue队列都是通过vring来实际工作的,我们可以把virtqueue当做一个接口类,而把vring_virtqueue当做这个接口的一个实现/** * virtqueue - a queue to register buffers for sending or receivin

2016-04-17 02:15:58 17631 1

原创 virtio pci设备基础

这段时间又再次revisit了一把virtio,把笔记整理一下贴出来,大部分内容都是网上找的,+上我个人的一些理解在里面我们首先关注virtio设备的配置空间,virtio设备本身是基于PCI总线的,因此本质上就是一个PCI设备,和所有其他PCI设备一样,virtio也有自己的vendor ID 0x1AF4,device ID从0x1000 - 0x103F,subsystem de

2016-04-12 17:45:10 11443

转载 Virtio 基本概念和设备操作(zz)

Linux Kernel 支持很多 Hypervisor,比如 KVM、Xen 和 VMware 的 VMI 等。每个 Hypervisor 都有自己独特的 block、network、console 等设备模型,设备驱动多样化的特性和优化方式使得各个平台共有性的东西越来越少,亟需提供一种通用的框架和标准接口来减少各 Hypervisor 虚拟化设备之间的差异,从而减少驱动开发的负担。虚拟

2016-03-27 19:17:28 2532

转载 PCI学习笔记(zz)

1.PCI设备编号    每一个PCI device都有其unique PFA(PCI Fcntion Address)    PFA由 bus number、device number、function number组成。        一条PCI总线支持256个PFA,即支持256个PCI device。        每个PCI芯片都有自己的device numb

2016-03-26 21:54:34 3413

转载 io端口与io内存详解(zz)

(一)地址的概念1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义。物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存、BIOS等)。在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址线上。物理地址空间,一部分给物理RAM(内存)用,一部分给总线用,这是由硬件设计来决定的,因此在32bits地址线的x86

2016-03-25 16:12:30 2872

原创 QEMU代码中的QLIST

下面会写一些KVM、QEMU相关的笔记,ge

2014-10-20 13:45:47 3604

原创 per_cpu变量用法

per_cpu的原理就是一个变量在所有CPU cache上都存一份

2014-06-18 17:26:28 10126

原创 xen网络前后端交互

RX的报文接收,首先由netfront发起

2014-04-25 15:35:12 4129

原创 xen grant table机制分析

grant table是xen基于共享内存的,在不同domain之间进行通信的一种机制,grant table需要domain和xen共同配合才能进行 * Xen's grant tables provide a generic mechanism to memory sharing * between domains. This shared memory interface under

2014-03-29 21:26:54 5633

原创 GSO revisit

GSOGSO用来扩展之前的TSO,目前已经并入upstream内核。TSO只能支持tcp协议,而GSO可以支持tcpv4, tcpv6, udp等协议。在GSO之前,skb_shinfo(skb)有两个成员ufo_size, tso_size,分别表示udp fragmentation offloading支持的分片长度,以及tcp segmentation offloading支持的

2013-09-22 02:51:34 7189 1

原创 netback再分析

以konrad的dom0 tree ( http://git.kernel.org/cgit/linux/kernel/git/konrad/xen.git/ ) 为base tree,分析下netback这两年的代码变化和相应patch首先一个比较大的变化在于netback不再依赖xen foreign page这个feature。我之前的文章 http://blog.csdn.net/ma

2013-09-17 17:51:33 4897

原创 xen网络后端驱动分析(发送篇)

这篇来研究netback的报文发送,后端设备创建过程中会调用netif_map,映射tx, rx的IO ring,同时绑定event channel中断。当netfront要发送skb时,会触发irq让后端发送,对应的ISR为netif_be_intirqreturn_t netif_be_int(int irq, void *dev_id){    struct xen_netif

2013-09-09 20:20:33 3967

原创 xen网络后端驱动分析(接收篇)

首先来看下netback收包的过程,netback的收包是通过调用netif_be_start_xmit来进行的。在这之前,netfront要分配好page,通过GR交给netback,这样netback才可以把包的内容copy到这些GR指向的page中。每次netback能接收多少包是由netfront交给netback多少个GR指向的page决定的。netfront是通过结构体struct

2013-08-30 14:53:42 3432

原创 xen网络后端驱动分析(设备篇)

netback和通用网络设备差不多,其priv结构体为xen_netif(netfront为netfront_info,igb叫igb_adapter,都是一个调调。注,priv结构体是跟着net_device后面的一块线性内存区域,用来存放不同设备驱动的私有结构)我们先拿jeremy's git tree的2.6.31的netback做分析,然后再比较下2.6.32以及upstream ne

2013-08-04 17:29:55 5019

原创 xen网络前端驱动代码分析(发送篇)

发送的核心函数为 xennet_start_xmitstatic int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev){    unsigned short id;    struct netfront_info *np = netdev_priv(dev);    struct xen_n

2013-08-01 02:18:29 2798

原创 xen网络前端驱动代码分析(设备初始化篇)

无论是块设备还是网络设备,前端驱动模块的安装和卸载都通过xenbus_register_frontend,xenbus_unregister_driver来完成。 其中netfront_driver也是一个xenbus_driver结构static struct xenbus_driver netfront_driver = {    .name = "vif",    .owner

2013-07-31 12:41:47 3456

原创 xen网络前端驱动代码分析(接收篇)

我们以RHEL6的xen netfront前端驱动为例。RHEL5的前端驱动,有一个acceleration的特性,是由一家叫solarflare的公司为其网卡定制的plugin,基本架构就是直接从网卡拿了包扔给虚拟机,不经过网桥,当然这需要前端后端都要支持这个acceleration feature。感兴趣的可以去看这篇文章http://www.tecnologika.co.uk/wp-co

2013-07-30 23:01:04 3566 1

原创 LVS源码分析(1)

由于要做一个类似LVS的包转发模块,研究了LVS的架构和代码,下面这个系列会做一个总结。首先推荐下这个blog http://yfydz.cublog.cn 里面对LVS, IPSec的讲解非常不错几个重要的数据结构如下:ip_vs_conn:一个连接由N元组构成,包括 caddr (客户端地址cip), vaddr (服务虚拟地址vip), daddr (目的realserver地址di

2013-02-25 17:05:01 8482

转载 转一篇文章,比较kmalloc/vmalloc/get_free_pages

对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换等硬件支持)的处理器而言,Linux提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB。进程的4GB内存空间被人为的分为两个部分--用户空间与内核空间。用户空间地址分布从0到3GB(PAGE_OFFSET,在0x86中它等于0xC0000000),3GB到4GB为内核空间。内核空间中,从3G到vmall

2013-02-20 22:53:23 6519

原创 linux通过tc控制网络QoS(2)

先来看下traffic control在内核里是如何实现的,首先内核在发送数据时,最终会调用到dev_queue_xmit,    struct Qdisc *q    if (q->enqueue) {        rc = __dev_xmit_skb(skb, q, dev, txq);        goto out;    }   如果q->enqueue函

2013-01-01 15:22:07 6800 1

原创 top显示的内存各项参数解析

top观察进程数据时,会有如下几个内存参数(可以用f选择显示哪些参数):VIRT, RES, SHR, SWAP, CODE, DATAtop实际上是从/proc//statm文件中读取这些信息,/proc//smaps文件是进程虚拟内存映射的详细数据,我们知道内核的struct page结构有引用计数,如果>1,表示是shared page,否则是private page

2012-12-17 14:13:23 6005

原创 open vswitch研究: ovsdb

ovsdb/SPEC文件定义了ovsdb的表规范,创建一个db时,需要预先准备好一个schema文件,该文件是一个JSON格式的字符串,定义了db名字,包含的所有表;每张表都包含一个columns的JSON dict,通过这个schema文件(e.g. vswitchd/vswitch.ovsschema)来创建一个db file。因此ovsdb实际是个文件数据库(为啥不直接用sqlite,还要自

2012-11-26 19:40:59 20614 2

原创 open vswitch研究:utility

streamstruct pstream {    const struct pstream_class *class;    char *name;};pstream_class是一个类似的接口类,其实现根据底层socket的不同(unix domain socket, tcp socket, ssl socket)而不同,p表示passive,其接口定义如下,

2012-11-25 21:53:30 4321

原创 open vswitch研究:基本数据结构

hmap/* A hash map. */struct hmap {    struct hmap_node **buckets; /* Must point to 'one' iff 'mask' == 0. */    struct hmap_node *one;    size_t mask;    size_t n;};/* A hash map nod

2012-11-19 19:02:27 5087 3

原创 open vswitch研究:vswitchd

vswitchd是用户态的daemon进程,其核心是执行ofproto的逻辑。我们知道ovs是遵从openflow交换机的规范实现的,就拿二层包转发为例,传统交换机(包括Linux bridge的实现)是通过查找cam表,找到dst mac对应的port;而open vswitch的实现则是根据入包skb,查找是否有对应的flow。如果有flow,说明这个skb不是流的第一个包了,那么可以在flo

2012-11-13 14:02:52 10971 2

原创 open vswitch研究:openflow I

关于openflow的规范不是本文讨论范畴,这篇主要讨论OVS对openflow的支持,代码基本都在ofproto/目录下struct ofproto代表了一个openflow switch的模型,是一个"接口类"struct ofproto {    struct hmap_node hmap_node; /* In global 'all_ofprotos' hmap. */

2012-11-03 23:18:40 9647

原创 open vswitch研究: action

ovs的action,都是预定义好的行为,也可以用nlattr结构来定义,enum ovs_action_attr {    OVS_ACTION_ATTR_UNSPEC,    OVS_ACTION_ATTR_OUTPUT,       /* u32 port number. */    OVS_ACTION_ATTR_USERSPACE,    /* Nested OVS_US

2012-10-17 16:53:37 6769

原创 open vswitch研究:flow

struct sw_flow_key 用来唯一定义一个flow,该结构相当复杂,请参考源码sw_flow_key分为四部分,分别代表switch, L2, L3, L4的profileswitch的profile是一个struct phy结构,包括了tunnel ID, priority, input switch port;ethernet的profile是一个struct eth结构,

2012-10-16 20:34:44 5773 1

原创 linux内核网络协议栈学习笔记(7)

本篇继续讨论IP包的收发ip_local_deliver:ip_local_deliver用来把数据包接收到本地,代码很短/*   *  Deliver IP Packets to the higher protocol layers. */ int ip_local_deliver(struct sk_buff *skb){       /*     *  R

2012-10-11 03:00:58 3902

原创 linux内核网络协议栈学习笔记:vlan

这篇是我临时加的,本来不打算放在整个内核协议栈分析的系列里的,但我现在觉得vlan还是蛮重要的,而且讨论vlan源码的文章很少,不知道我这篇算不算第一篇 :Dvlan的代码都在net/8021q/的内核目录下,首先我们来看8021q模块 (net/8021q/vlan.c)vlan_proto_init , vlan_cleanup_module 是模块的init/exit函数,我们来看v

2012-10-02 01:38:36 8807

原创 open vswitch研究:datapath

struct vport是OVS的设备结构,个人认为非常类似于kernel里的netdev结构/** * struct vport - one port within a datapath * @rcu: RCU callback head for deferred destruction. * @port_no: Index into @dp's @ports array.

2012-09-26 18:32:26 6576

原创 linux内核网络协议栈学习笔记(6)

本篇讨论IP包的收发(暂不包括路由)先来看inet_init,首先是调用proto_register,注册了tcp_prot, udp_prot, raw_prot,其中proto_register前半部分是初始化各种slab_cache,后半部分把这些struct proto结构链到proto_list里其次调用sock_register,内核有一个全局的net_proto_fami

2012-09-24 21:40:25 5643

空空如也

空空如也

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

TA关注的人

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