kvm架構分析(一) IO裝置管理架構

2021-09-28 16:15:42 字數 2853 閱讀 8152

kvm io裝置管理架構採用io匯流排方式,涉及到guest os陷入到hypervisor進行io的裝置都掛載在匯流排上。kvm提供四種匯流排:

mmio和pio是常見的訪問硬體裝置暫存器的兩種方式,所以mmio和pio匯流排是用來掛載支援硬體虛擬化的硬體裝置,比如gicv3就是掛載在mmio匯流排上的。virtio匯流排則是掛載支援並實現相關virtio標準的裝置,比如virtio-net、virtio-console、virtio-block等等。

以gicv3為例,kvm實現了三種結構體以支援io。分別是:

其中vgic_io_device是gicv3裝置私有的,不同的裝置有著不同的結構體。本文第一部分簡介讀寫gicv3的整個流程,第二部分介紹io匯流排和io裝置,最後介紹vgic裝置的io。

guest os訪問gicv3的distributor暫存器會觸發同步異常。相應的guest os訪問的資料位址會儲存在far_el2暫存器中。假設改位址是addr,那麼kvm把addr交給io匯流排去處理,處理流程如下:

將位址資訊和讀/寫資訊傳給io匯流排,io匯流排通過addr匹配找到相應的kvm_io_device,然後執行read/write。通過container_of函式找到私有的vgic_io_device,vgic_io_device將guest os可以修改的暫存器劃分為不同的region。通過偏移位址(addr-gic_base_addr)和region的位址進行比較找到其所在的region,最後執行相應的讀寫操作。

kvm_io_bus結構體中dev_count是統計當前裝置總數(乙個vm的裝置);ioeventfd_count是統計當前io的次數;range則指示乙個裝置的所處位址範圍,以便於io匯流排根據位址找到相應的裝置。

struct kvm_io_bus 

;struct kvm_io_range

;

io匯流排的api如下:

int

kvm_io_bus_write

(struct kvm_vcpu *vcpu,

enum kvm_bus bus_idx, gpa_t addr,

int len,

const

void

*val)

;int

kvm_io_bus_write_cookie

(struct kvm_vcpu *vcpu,

enum kvm_bus bus_idx,

gpa_t addr,

int len,

const

void

*val,

long cookie)

;int

kvm_io_bus_read

(struct kvm_vcpu *vcpu,

enum kvm_bus bus_idx, gpa_t addr,

int len,

void

*val)

;// 向io匯流排註冊乙個裝置

intkvm_io_bus_register_dev

(struct kvm *kvm,

enum kvm_bus bus_idx, gpa_t addr,

int len,

struct kvm_io_device *dev)

;void

kvm_io_bus_unregister_dev

(struct kvm *kvm,

enum kvm_bus bus_idx,

struct kvm_io_device *dev)

;struct kvm_io_device *

kvm_io_bus_get_dev

(struct kvm *kvm,

enum kvm_bus bus_idx,

gpa_t addr)

;

kvm使用kvm_io_device來管理不同的裝置,給io匯流排提供一致的讀/寫介面。

struct kvm_io_device_ops 

;struct kvm_io_device

;

結構體vgic_io_device和vgic_register_region,這裡比較簡單,具體實現可以參看virt\kvm\arm\vgic\vgic-mmio-v3.c

struct vgic_io_device 

;const

struct vgic_register_region *regions;

enum iodev_type iodev_type;

int nr_regions;

struct kvm_io_device dev;};

struct vgic_register_region

;union

;unsigned

long

(*uaccess_read)

(struct kvm_vcpu *vcpu, gpa_t addr,

unsigned

int len)

;union;}

;

virt\kvm\kvm_main.c涉及到kvm_io_bus和kvm_io_device。

virt\kvm\arm\vgic\vgic-mmio.c涉及到kvm_io_device和vgic_io_device。

virt\kvm\arm\vgic\vgic-mmio-v3.c涉及到vgic_io_device和vgic_register_region。

6 2裝置管理 使用者層IO軟體 緩衝 磁碟

一 使用者層的i o軟體 1.系統呼叫與庫函式 2.spooling技術 假離線操作 多道程式技術,專門利用程式模擬離線i o的外圍機,完成裝置i o操作。稱這種聯機情況下實現的同時外圍操作為spooling 技術。3.spooling系統的組成 二 緩衝管理 1.緩衝管理 2.引入緩衝區的主要原因...

CUDA (一) 基本裝置管理函式 向量相加

lz之前看過一點點的gpu的加速 後來發現要想寫好cuda 對硬體的理解,記憶體的理解,平行計算等要求還是很高的,然後就很慫的放棄了,沒有繼續下去,而且實驗室基本上都是做cv的,很少有同學做hpc,所以對這方面屬於真小白。直到前陣子,去gtc china,也還是小白,cuda也就用過最基礎的cuda...

linux裝置驅動模型架構分析 一

lddm與驅動程式密切相關,而驅動程式處於linux系統中的什麼位置呢?我們自頂向下一步步來說,先看下圖 以下內容以中的內容為主體結合自己的認識和對於4.1核心的修改,這個系列文章非常好,推薦 linux由五個部分組成 也稱作程序管理 程序排程。負責管理 cpu資源,以便讓各個程序可以以盡量公平的方...