• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • LINUX設備驅動模型分析之五 總線-設備-驅動模塊總結

    前面幾篇文章我們對bus-device-driver模型進行了單獨介紹,本篇文章我們對這三部分進行總結,同時對之前文章中未細化的部分進行詳細說明。

    bus-device-driver相關結構體關聯

    如下圖是包含bus-device-driver的關聯圖,我們根據該流程圖再次進行一下說明。

     

    1.devices_kset集合說明

    內核系統中在device模塊的初始化接口中,創建了一個kset類型的全局變量devices_kset

    該kset類型的全局變量,通過list成員集合了所有系統中已創建的device類型對應的kobject變量,

    系統中依附在所有類型總線上的device,均會通過其對應的kobject變量,鏈接至devices_kset鏈表上。即通過devices_kset可找到系統中所有已創建的device。這一層關系和具體的bus-device-driver綁定沒有關聯。

    2.bus_kset集合說明

    內核系統中在bus模塊初始化接口中,創建了一個kset類型的全局變量bus_kset。該全局變量

    會將系統中所有已注冊的總線類型對應的kobject鏈接在一起,通過該系統變量可以查看系統中所有已注冊的總線類型。

    3.bus->p->driver_kset集合說明

    該變量和以上兩個全局變量略有不同,該變量依附于具體的總線類型,僅在具體的總線變量創建時,方會創建該變量,該變量會將所有注冊進其依附總線的驅動對應的kobject鏈接在一起。

    4.bus->p->device_kset集合說明

    該變量主要是總線變量的成員變量,系統中主要使用該kset對應的kobject以及與具體設備變量對應的kobject,這兩個kobject相互創建鏈接子目錄。(針對bus->p->device_kset與device類型變量對應的kobject的鏈接關系,沒有在上面圖中畫出)

    5.bus->p->klist_devices

    該變量主要用于將所有注冊至該總線上的device類型變量鏈接在一起,通過該變量可以查看該總線上當前已注冊的設備。

    6.bus->p->klist_drivers

    該變量主要用于將所有注冊至該總線上的device_driver類型變量鏈接在一起,通過該變量可以查看該總線上當前已注冊的驅動。

    總線類型通過klist_devices、klist_drivers,可以找到該總線上所有已注冊的設備與驅動

    7.device_driver->p->klist_devices

    該變量主要用于鏈接所有已和該驅動綁定的設備,當進行設備與驅動的綁定或者解綁前,可通過遍歷該鏈表確認執行操作的設備是否已在綁定列表中。

    bus-device-driver的一些說明

    下面我們主要是針對bus-device-driver再進行一些補充說明。

    bus-device-driver的綁定操作

    1. 當系統中完成一個device的注冊時,當完成device-bus相關的綁定(包括device、bus_type、kobject等綁定),會遍歷該總線上所有已注冊的驅動(通過遍歷鏈表bus->p->klist_drivers實現),若該device與已注冊的驅動匹配(如設備名稱與驅動名稱匹配等,匹配函數一般由總線類型變量中的match函數指針提供,如platform總線的match函數為platform_match),則再完成device-driver的綁定操作,并調用驅動的probe函數,完成對device的探測。對應函數為bus_probe_device、device_attach、__device_attach、driver_bound等。
    2. 當系統中完成一個driver的注冊時,在完成driver-bus相關的綁定后,也會遍歷該總線上所有已注冊的設備(通過遍歷鏈表bus->p->klist_devices實現),針對未進行device-driver綁定的設備,若device與該driver匹配,則完成device-driver的綁定操作,并調用驅動的probe函數,完成對device的探測。對應函數為driver_attach、__driver_attach、driver_probe_device、driver_bound等。

    這也是總線變量中的klist_drivers、klist_devices變量的作用。

    1. 針對device結構體、driver結構體,一般會被嵌入更大的結構體中,用以實現具體總線類型的設備與驅動,如platform總線(platform_device、platform_driver)、i2c總線(i2c_client、i2c_driver、i2c_adapter)、pci總線(pci_dev、pci_driver)等。

    而針對總線注冊與注銷接口、設備注冊與注銷接口、驅動注冊與注銷接口,也就是實現上面所說的關聯罷了。

    kobject的釋放

    我們知道kset、device、driver、bus_type類型的變量,均使用kobject->kref作為引用計數

    使用,而針對kobject的釋放也是通過該引用計數實現,當引用計數為0時,則釋放該kobject,同時也會根據kobject->kobj_type->sysfs_ops->release接口,實現對kobject所嵌入的內存的釋放操作。其處理流程如下所示

    而針對kobject->kobj_type而言,針對bus_type,其定義如下,release接口為device_release;針對bus_type,其對應kobj_type定義如下,并沒有為bus_type創建特定的release接口。

    static void device_release(struct kobject *kobj)
    {
    	struct device *dev = kobj_to_dev(kobj);
    	struct device_private *p = dev->p;
    
    	/*
    	 * Some platform devices are driven without driver attached
    	 * and managed resources may have been acquired.  Make sure
    	 * all resources are released.
    	 *
    	 * Drivers still can add resources into device after device
    	 * is deleted but alive, so release devres here to avoid
    	 * possible memory leak.
    	 */
    	devres_release_all(dev);
    
    	if (dev->release)
    		dev->release(dev);
    	else if (dev->type && dev->type->release)
    		dev->type->release(dev);
    	else if (dev->class && dev->class->dev_release)
    		dev->class->dev_release(dev);
    	else
    		WARN(1, KERN_ERR "Device '%s' does not have a release() "
    			"function, it is broken and must be fixed.\n",
    			dev_name(dev));
    	kfree(p);
    }
    
    static const void *device_namespace(struct kobject *kobj)
    {
    	struct device *dev = kobj_to_dev(kobj);
    	const void *ns = NULL;
    
    	if (dev->class && dev->class->ns_type)
    		ns = dev->class->namespace(dev);
    
    	return ns;
    }
    
    static struct kobj_type device_ktype = {
    	.release	= device_release,
    	.sysfs_ops	= &dev_sysfs_ops,
    	.namespace	= device_namespace,
    };
    
    static struct kobj_type bus_ktype = {
    	.sysfs_ops	= &bus_sysfs_ops,
    };
    

     

     

    至此我們完成了設備驅動模型(bus-device-driver)的分析,下一篇文章我們將以platform總線為主介紹具體的總線及其設備與驅動的實現。

    版權聲明:本文為lickylin原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/lickylin/article/details/102825859

    智能推薦

    【Linux筆記】總線設備驅動模型

    之前的筆記有分享【Linux筆記】程序設計思想:分層、分離、抽象,按照這樣的思想來設計我們的程序可以更容易寫出耦合性低、獨立性強、可重用性強的代碼。 Linux內核中更是存在著更多的分離、分層思想的代碼,platform平臺設備驅動就是用了這樣的思想。本篇筆記我們一起來學習一下platform驅動框架。 Linux引入platform的原因 對于 Linux 這樣一個成熟、龐大、 復雜的操作系統,...

    Linux SPI總線設備驅動模型詳解

    轉載自:http://blog.csdn.net/u014106791/article/details/52301671 Linux系統中有很多條總線,如I2C、USB、platform、PCI等。 以spi為例,假如有M種不同類型CPU,N中不同SPI外設,在寫裸機驅動的時候” /> Linux SPI總線設備驅動模型詳解 原創 2016年08月24日 16:42:10 隨著技...

    LINUX設備驅動模型分析之四 設備模塊相關(DEVICE)接口分析

         本系列文章涉及sysfs文件系統的內容,如需要了解sysfs的內容,請參考之前寫的sysfs相關的文檔。       我們已經完成了總線、驅動模塊相關接口的分析,本章我們主要對設備模塊進行分析。在上面兩章的分析中,我們知道注冊在總線上的驅動模塊對應的kobject是通過bus->p->drivers_kset匯聚至一...

    linux設備驅動模型之——platform虛擬總線

    文章目錄 什么是platform虛擬總線 platform組成 什么是platform虛擬總線 platform總線:linux內核用于管理片上資源的虛擬總線。它不像usb總線、PCI總線、 I2C、SPI 那樣真實存在的。 在計算機中有這樣一類設備,它們通過各自的設備控制器,直接和CPU連接,CPU可以通過常規的尋址操作訪問它們(或者說訪問它們的控制器)。這種連接方式,并不屬于傳統意義上的總線連...

    LINUX字符設備驅動模塊分析(三)RTC設備驅動模型分析

          前面的幾篇文章中,我們介紹了字符設備驅動模型以及在字符設備驅動模型基礎上實現的混雜設備驅動模型、i2c通用字符設備驅動模型、spi通用字符設備驅動模型,這三種設備驅動模型既有相似處。本篇我們介紹rtc設備驅動模型。   rtc設備驅動模型的架構 我們首先介紹下rtc設備驅動模型的架構,然后再詳細說明各部分的內容。  ...

    猜你喜歡

    LINUX字符設備驅動模塊分析(二)混雜設備驅動模型分析

          在結束了對字符設備驅動模型的分析之后,我們分析linux設備驅動中使用字符設備驅動模型的框架,本篇我們介紹混雜設備驅動模型。        linux系統中設計了一個混雜字符設備驅動模型,系統中任何類型的設備均可以使用該驅動模型的接口,實現字符設備的創建。混雜字符設備驅動模型簡化了字符設備驅動的創建接口,只需要調用m...

    神奇的Batch Normalization 如果一個模型僅訓練BN層會是什么樣的

    您可能會感到驚訝,但這是有效的。 ? 最近,我閱讀了arXiv平臺上的Jonathan Frankle,David J. Schwab和Ari S. Morcos撰寫的論文“Training BatchNorm and Only BatchNorm: On the Expressive Power of Random Features in CNNs”。 這個主意立刻引起了...

    用Python實現校園通知更新提醒

    前言 這個項目實已經在一個月前已經完成了,一直都想寫一篇博客來總結這個過程中遇到的一些問題。但最近一個月來都比較忙,所以一直拖到了現在。 首先說說起因吧,我沒事的時候,總喜歡依次點開學校主頁、教務處、圖書館以及學院的網站,看看有沒有什么新通知,雖然大多與我無關。恰逢最近正在學Python,經常聽到別人說用Python寫爬蟲很簡單,但自己尚未接觸過爬蟲。于是抱著試一試的心態看了幾篇關于Python爬...

    spring_ioc相關_第一章

    1 spring是一站式框架,在javaee的三層結構中,每一層都提供不提并的解決技術 web層:springMVC service層:spring的ioc dao層:spring的jdbcTemplate 2 javaee為避免兩個類之間出現耦合,則把對象的創建交給spring進行管理,spring的ioc操作:(1)ioc的配置文件方式;(2)ioc注解方式 3 ioc的底層原理使用技術(1)...

    【Python+OpenCV】視頻流局部區域像素值處理-一種特征提取方法

    參考我之前寫的處理圖片的文章:Python+OpenCV實現【圖片】局部區域像素值處理(改進版) 開發環境:Python3.6.0 + OpenCV3.2.0 任務目標:攝像頭采集圖像(例如:480*640),并對視頻流每一幀(灰度圖)特定矩形區域(480*30)像素值進行行求和,得到一個480*1的數組,用這480個數據繪制條形圖,即在逐幀采集視頻流并處理后“實時”顯示采...

    精品国产乱码久久久久久蜜桃不卡