日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀] 當(dāng)我們查看Linux kernel.C的Virtio代碼時(shí),我們會(huì)發(fā)現(xiàn)許多相關(guān)的文件。那么,verdio,我們只有Virtio\UC',Virtio\ubk。C、 美德\ubalon。C、 等等。與這些文件相關(guān)聯(lián)的是什么?其次,有許多相應(yīng)的程序功能。這個(gè)電話怎么說是真的,比如說通過互聯(lián)網(wǎng)。從哪里開始?為了澄清這些關(guān)系,必須考慮模式Linux.DiesIn本文分析了linux-kernel-3.10中病毒組織與設(shè)備初始化的關(guān)系。

當(dāng)我們查看Linux kernel.C的Virtio代碼時(shí),我們會(huì)發(fā)現(xiàn)許多相關(guān)的文件。那么,verdio,我們只有Virtio\UC',Virtio\ubk。C、 美德\ubalon。C、 等等。與這些文件相關(guān)聯(lián)的是什么?其次,有許多相應(yīng)的程序功能。這個(gè)電話怎么說是真的,比如說通過互聯(lián)網(wǎng)。從哪里開始?為了澄清這些關(guān)系,必須考慮模式Linux.DiesIn本文分析了linux-kernel-3.10中病毒組織與設(shè)備初始化的關(guān)系。

總線及驅(qū)動(dòng)的注冊(cè)

linux設(shè)備驅(qū)動(dòng)模型的核心有三個(gè)概念:設(shè)備(device),驅(qū)動(dòng)(driver),總線(bus)。而如果我們把virtio的相關(guān)關(guān)系梳理清楚后,以網(wǎng)絡(luò)virtio_net為例映射到設(shè)備驅(qū)動(dòng)模型,就得到了下圖。我們這個(gè)小節(jié)后面就以下圖為背景展開。

圖1

linux將virtio實(shí)現(xiàn)分離成兩部分:和物理總線標(biāo)準(zhǔn)相關(guān)的(如pci,scsi等),和物理總線標(biāo)準(zhǔn)無關(guān)的。

圖中左側(cè)部分即和物理總線相關(guān)的實(shí)現(xiàn),這里以pci為了,當(dāng)然virtio也支持其他總線類型,如scsi。virtio-pci是virtio對(duì)應(yīng)pci的驅(qū)動(dòng)實(shí)現(xiàn),所以virtio-pci是一個(gè)pci總線上的一個(gè)驅(qū)動(dòng)。它通過如下方式注冊(cè)到pci總線上去。

l??virtio總線的注冊(cè)

點(diǎn)擊(此處)折疊或打開

/*virtio.c*/

static struct bus_type virtio_bus?=?{

.name?=?"virtio",

.match?=?virtio_dev_match,

.dev_attrs?=?virtio_dev_attrs,

.uevent?=?virtio_uevent,

.probe?=?virtio_dev_probe,

.remove?=?virtio_dev_remove,

};

static?int?virtio_init(void)

{

if?(bus_register(&virtio_bus)?!=?0)

panic("virtio bus registration failed");

return 0;

}

core_initcall(virtio_init);

如代碼所示,這個(gè)總線的名字叫”virtio”,通過bus_register就將virtio總線注冊(cè)進(jìn)系統(tǒng),可以在sys文件系統(tǒng)中查看。

l??virtio-net驅(qū)動(dòng)注冊(cè)

最后我們看我們經(jīng)常接觸到設(shè)備驅(qū)動(dòng)的初始化,我們以網(wǎng)絡(luò)驅(qū)動(dòng)virtio_net為例,其對(duì)應(yīng)的驅(qū)動(dòng)為virtio-net。其注冊(cè)過程如下。

點(diǎn)擊(此處)折疊或打開

/*?virtio-net.c?*/

static struct virtio_device_id id_table[]?=?{

{?VIRTIO_ID_NET,?VIRTIO_DEV_ANY_ID?},

{?0?},

};

static struct virtio_driver virtio_net_driver?=?{

.feature_table?=?features,

.feature_table_size?=?ARRAY_SIZE(features),

.driver.name?=????KBUILD_MODNAME,

.driver.owner?=????THIS_MODULE,

.id_table?=????id_table,

.probe?=????virtnet_probe,

.remove?=????virtnet_remove,

.config_changed?=?virtnet_config_changed,

#ifdef CONFIG_PM

.freeze?=????virtnet_freeze,

.restore?=????virtnet_restore,

#endif

};

module_virtio_driver(virtio_net_driver);

#define module_virtio_driver(__virtio_driver)?\

module_driver(__virtio_driver,?register_virtio_driver,?\

unregister_virtio_driver)

int?register_virtio_driver(struct virtio_driver?*driver)

{

/*?Catch this early.?*/

BUG_ON(driver->feature_table_size?&&?!driver->feature_table);

driver->driver.bus?=?&virtio_bus;

return driver_register(&driver->driver);

}

最終通過register_virtio_driver函數(shù)將驅(qū)動(dòng)的bus設(shè)置為之前注冊(cè)的virtio總線,完成總線的注冊(cè)。這樣我們就能在sys文件系統(tǒng)對(duì)應(yīng)virtio總線下的drivers目錄看到這個(gè)驅(qū)動(dòng)了。

所以我們?cè)倩仡^來看圖1,可以看到virtio設(shè)備是橫跨兩類總線及驅(qū)動(dòng)的。

virtio設(shè)備的初始化流程

梳理清楚virtio相關(guān)設(shè)備,總線及驅(qū)動(dòng)關(guān)系后我們看下virtio設(shè)備的初始化過程,我們還是以網(wǎng)絡(luò)virtio_net設(shè)備為例子。這個(gè)初始化過程如下圖2中的黃色部分所示。

圖2

首先是系統(tǒng)啟動(dòng)kernel初始化階段,pci子系統(tǒng)調(diào)用pci_scan_device發(fā)現(xiàn)pci網(wǎng)卡設(shè)備,并初始化對(duì)應(yīng)pci_dev結(jié)構(gòu),然后將去注冊(cè)到pci總線上(dev->dev.bus=&pci_bus_type)。同時(shí)設(shè)置device的vendor_id為0x1AF4(virtio的pci vendor_id),device_id為1

然后當(dāng)我們加載virtio-pci驅(qū)動(dòng)時(shí),當(dāng)調(diào)用module_pci_driver(virtio_pci_driver)將virtio-pci驅(qū)動(dòng)注冊(cè)在pci總線上時(shí),在linux設(shè)備驅(qū)動(dòng)模型中,這會(huì)導(dǎo)致對(duì)pci總線設(shè)備鏈表上未被驅(qū)動(dòng)綁定的每個(gè)設(shè)備調(diào)用pci總線的match回調(diào)函數(shù),即pci_bus_match函數(shù)。原型如下:

static int pci_bus_match(struct device *dev, struct device_driver *drv)

pci_bus_match函數(shù)將linux設(shè)備驅(qū)動(dòng)模型核心出入的device結(jié)構(gòu)轉(zhuǎn)換為pci_dev結(jié)構(gòu),將device_driver結(jié)構(gòu)轉(zhuǎn)換為pci_driver結(jié)構(gòu),之后調(diào)用pci_match_device函數(shù)判斷pci設(shè)備結(jié)構(gòu)是否有匹配的pci設(shè)備ID結(jié)構(gòu)。如果有則判斷設(shè)備的pci ID和驅(qū)動(dòng)設(shè)置的id_table中是否一樣,如果一樣說明設(shè)備和驅(qū)動(dòng)匹配(這里設(shè)備的vendor_id和virtio-pci的virtio_pci_id_table匹配),將struct device的driver指針指向驅(qū)動(dòng),然后調(diào)用pci總線的probe函數(shù),即pci_deivce_probe函數(shù)。這個(gè)函數(shù)再次將struct device強(qiáng)制轉(zhuǎn)換成struct pci_dev,將設(shè)置在設(shè)備中的driver結(jié)構(gòu)強(qiáng)制轉(zhuǎn)換為struct pci_derver。它再次校驗(yàn)這個(gè)驅(qū)動(dòng)能否支持這個(gè)設(shè)備,遞增設(shè)備的引用計(jì)數(shù),然后調(diào)用pci驅(qū)動(dòng)probe函數(shù)(即virtio-pci的probe函數(shù)virtio_pci_probe),傳入它應(yīng)該綁定到的struct pci_dev結(jié)構(gòu)體指針。這就進(jìn)入到了圖2中黃色部分的函數(shù)調(diào)用鏈了。

在開始梳理virtio_net初始化調(diào)用鏈前我們先看其對(duì)應(yīng)的結(jié)構(gòu)struct virtio_pci_device,將其展開得到圖3。

圖3

我們看到virtio_pci_device可以分為兩部分,一部分是和pci總線相關(guān)的設(shè)備對(duì)應(yīng)struct pci_dev,另一部分是和virtio總線相關(guān)的設(shè)備對(duì)應(yīng)struct?virtio_device。

virtio_pci_probe函數(shù)主要負(fù)責(zé)完成pci_dev部分的初始化,已經(jīng)virtio_device部分初始化,然后調(diào)用register_virtio_device函數(shù)。

register_virtio_device函數(shù)將virtio_device的設(shè)備總線設(shè)置為virtio總線,然后調(diào)用device_register將virtio_device對(duì)應(yīng)的設(shè)備添加到virtio總線上。這個(gè)添加總線的動(dòng)作,會(huì)觸發(fā)virtio總線的match函數(shù)即virtio_dev_match調(diào)用,同樣該函數(shù)會(huì)比較設(shè)備dev的pci id和驅(qū)動(dòng)id (virtio net的devid為1),如果匹配則virtio bus的probe函數(shù)virtio_dev_probe將被調(diào)用。其中又會(huì)調(diào)用對(duì)應(yīng)驅(qū)動(dòng)的probe函數(shù),即virtnet_probe。而virtnet_probe將會(huì)完成virtio net設(shè)備struct?virtio_device剩余部分的初始化。

到此,virtio net的初始化流程就已經(jīng)梳理清楚了。virtio net設(shè)備創(chuàng)建完成后也會(huì)分別出現(xiàn)在pci總線和virtio總線的drvices目錄下。

最后附上virtio的其他類型設(shè)備id:

點(diǎn)擊(此處)折疊或打開

#define VIRTIO_ID_NET????????1?/*?virtio net?*/

#define VIRTIO_ID_BLOCK????????2?/*?virtio block?*/

#define VIRTIO_ID_CONSOLE????3?/*?virtio console?*/

#define VIRTIO_ID_RNG????????4?/*?virtio rng?*/

#define VIRTIO_ID_BALLOON????5?/*?virtio balloon?*/

#define VIRTIO_ID_RPMSG????????7?/*?virtio remote processor messaging?*/

#define VIRTIO_ID_SCSI????????8?/*?virtio scsi?*/

#define VIRTIO_ID_9P????????9?/*?9p virtio console?*/

#define VIRTIO_ID_RPROC_SERIAL 11?/*?virtio remoteproc serial?link?*/

355定義virtio u id u caif-12/*virtio caif*/

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉