原创 linux虛擬網絡設備--虛擬機網卡和linux bridge上tap設備的關係(七)

1. 虛擬機進程 使用ps –ef |grepkvm可以看到虛擬機進程信息如下: /usr/libexec/qemu-kvm -nameinstance-0000001d -S -machine pc-i440fx-rhel7.1

原创 linux用戶態驅動--VFIO(一)

序言 設備驅動可以運行在內核態,也可以運行在用戶態,用戶態驅動的利弊網上有很多的討論,而且有些還上升到政治性上,這裏不再多做討論。不管用戶態驅動還是內核態驅動,他們都有各自的缺點。內核態驅動的問題是:系統調用開銷大;學習曲線陡峭;

原创 KVM virtio_net之NAPI機制(十七)

在虛擬化場景,中斷的開銷更大,所以要儘可能的少用中斷,我們從中斷處理函數開始看。 skb_recv_done函數 static void skb_recv_done(struct virtqueue *rvq) { struct

原创 OVS端口鏡像(十五)

ovs中無法直接抓包分析,可以通過端口流量鏡像的方式進行抓包 端口流量鏡像主要分爲兩步: 創建mirror,指定mirror中的源端口,目的端口 綁定mirror至bridge 1、創建mirror 指定mirror名稱,n

原创 KVM Vhost-net 和 Virtio-net代碼詳解(十八)

場景 Host上運行qemu kvm虛擬機,其中虛擬機的網卡類型爲virtio-net,而Host上virtio-net backend使用vhost-net 數據包進入虛擬機代碼分析 首先看vhost-net模塊註冊,主要使用l

原创 linux共享內存機制(二)

實現進程間通信最簡單也是最直接的方法就是共享內存——爲參與通信的多個進程在內存中開闢一個共享區。由於進程可以直接對共享內存進行讀寫操作,因此這種通信方式效率特別高,但其弱點是,它沒有互斥機制,需要信號量之類的手段來配合。 共享內存

原创 DPDK vhost-user研究(九)

消息機制 當使用vhost-user時,需要在系統中創建一個unix domain socket server,用來處理qemu發送給host的消息。 如果有新的socket連接,說明guest創建了新的virtio-net設備,

原创 linux用戶層驅動--VFIO(四)

VFIO——將設備暴露到用戶態 在開始之前我們先要說一個東西就是 DMA,直接讓設備訪問內存,可以不通過 CPU 搬運數據。 這是一個比較簡單的體系結構圖,設備 和 CPU 通過存儲控制器訪問存儲器。一個簡單的 case 是 C

原创 OVS DPDK vs OVS Deep Dive(十六)

背景 OvS(Open vSwitch)是雲計算平臺的重要連接組件,爲虛擬機提供網絡連,被各大雲平臺,基礎設施供應商廣泛使用,比如OpenStack, OpenNebula。vSwitch–Virtual Switch(虛擬交換機

原创 linux用戶態驅動--IOMMU(三)

在計算機領域,IOMMU(Input/Output Memory Management Unit)是一個內存管理單元(Memory Management Unit),它的作用是連接DMA-capable I/O總線(Direct

原创 DPDK vhost-user之前後端通知機制場景分析(十)

所謂前後端通知,必然涉及兩個方向:前端通知後端,後端通知前端。而我們知道vhost有txq和rxq,對於每種queue都伴隨有這兩種通知。而通知方式又根據是否支持event_idx有着不同的實現,最後virtio1.1引入的pac

原创 OVS端口鏡像(十四)

OVS上實現端口鏡像的基本流程如下: 創建mirror,在mirror中指定鏡像數據源及鏡像目的地 將創建的mirror應用到bridge中 鏡像數據源可以通過下面幾個選項來指定: select_all: 布爾值,設置爲tr

原创 KVM中I/O設備直接分配和SR-IOV(十六)

學習 KVM 的系列文章: 本文將分析 PCI/PCIe 設備直接分配(Pass-through)和 SR-IOV, 以及三種 I/O 虛擬化方式的比較。 1. PCI/PCI-E 設備直接分配給虛機 (PCI Pass-thro

原创 DPDK vhost-user之packed ring(六)

virtio1.1已經在新的kernel和dpdk pmd中陸續支持,但是網上關於這一塊的介紹卻比較少,唯一描述多一點的就是這個ppt:https://www.dpdk.org/wp-content/uploads/sites/3

原创 linux共享內存機制(一)

共享存儲允許兩個或多個進程共享一個給定的存儲區,是進程間通信最快的一種方式。 不要同時對共享存儲空間進行寫操作,通常,信號量用於同步共享存儲訪問。 最簡單的共享內存的使用流程 ①ftok函數生成鍵值 ②shmget函數創建共享內存