天天看點

Linux 裝置驅動模型的裝置資源管理實作淺析裝置資源管理實作的基礎裝置資源管理的實作

    上一章我們分析了regmap子系統,本章我們讨論一下linux裝置驅動模型的裝置資源管理,linux裝置資源管理雖然是一個小子產品,卻起到了一個很大的功能,那就是裝置資源的自動釋放功能。目前新版的核心中各裝置驅動子產品基本上都提供了基于裝置資源管理的接口。

     裝置資源管理也可以了解為裝置相關的資源垃圾回收功能,裝置資源管理的實作雖然不複雜,卻真的是解決了一個很大的問題,具體來說就是,在沒有裝置資源管理時,我們在裝置驅動的probe接口中,需要進行記憶體的申請,并且各裝置驅動子產品自行維護申請的記憶體資源(在裝置驅動解除安裝時進行記憶體資源的釋放操作),這樣的話每一個裝置驅動程式都存在了大量的記憶體資源的釋放操作(在remove接口中将申請的記憶體資源釋放掉),而裝置資源管理出來以後,各裝置驅動子產品隻需要在probe接口中調用支援裝置資源管理的接口實作記憶體的申請即可,而無需關注記憶體的釋放,這樣的話remove接口就完全不需要關注記憶體的釋放,且無需關注記憶體的釋放以及裝置的登出等等。

裝置資源管理實作的基礎

    在進行裝置資源管理的實作前,我們先看下裝置驅動模型的引用計數功能。裝置驅動模型主要借助kobject的kref實作引用計數功能,針對struct device、kobject、kref等結構體的關聯如下:

       struct device借助于其struct kobject kobj成員的kref,即可實作對struct device的引用計數功能。

Linux 裝置驅動模型的裝置資源管理實作淺析裝置資源管理實作的基礎裝置資源管理的實作

    而裝置驅動模型就是借助struct device這種引用計數機制,實作針對struct device的資源自動釋放功能。如下圖所示,當我們調用device_unregister登出device時,完成裝置與device、bus的解綁之後,即調用put_device完成對device引用計數減一,當引用計數為0後即調用kobject_release進行資源的釋放,而針對裝置驅動模型而言,其最終會調用struct kobj_type device_ktype.release接口,即接口device_release接口,而在device_release接口中dev->release、dev->type->release接口進行資源的釋放(如針對platform device則會調用platform_device_release進行platform device相關的資源釋放)。

Linux 裝置驅動模型的裝置資源管理實作淺析裝置資源管理實作的基礎裝置資源管理的實作

    而裝置資源管理子產品也是借助上述機制,隻是在上圖的基礎上增加了對申請的裝置資源的釋放接口,如下圖總紅色标注的部分即為裝置資源管理的釋放接口。這就是裝置資源管理子產品申請的資源自動釋放的基礎。

Linux 裝置驅動模型的裝置資源管理實作淺析裝置資源管理實作的基礎裝置資源管理的實作

裝置資源管理的實作

      為了支援裝置資源管理,在struct device中增加了連結清單頭成員devres_head,該連結清單中存儲了所有該裝置申請的資源(此處主要指通過裝置資源管理接口devres_alloc、devres_add申請并添加到該連結清單上的資源)。同時又建立了兩個資料結構struct devres_node、struct devres,其中struct devres_node主要實作将申請的裝置資源加入到的devres_head連結清單上,并提供該資源的釋放接口,而struct devres則主要定義了struct devres_node類型的節點變量、以及零長度數組data,而data即為申請的記憶體首位址,該指針會傳回給應用子產品使用。如下圖即是struct device、struct devres_node、struct devres的關聯。

Linux 裝置驅動模型的裝置資源管理實作淺析裝置資源管理實作的基礎裝置資源管理的實作

      裝置資源管理子產品提供接口devres_alloc用于裝置資源的申請(根據傳遞的申請記憶體大小,申請struct devres,并将申請成功的記憶體資源的首位址struct devres->data傳回給使用者)、而devres_add則實作将通過devres_alloc申請的資源加入到struct device的devres_head連結清單中。該子產品也提供了devm_kmalloc接口進行記憶體的申請(該接口申請到記憶體後,則使用者不用關注記憶體的釋放工作,當然使用者也可以調用接口devm_kfree手動釋放)。

      而裝置資源子產品申請的資源在什麼時候釋放呢?,在上面我們已經介紹了,即device release時,調用devres_release_all接口釋放連結清單devres_head上所有的資源。

    本章我們主要分析了裝置資源管理子產品的實作流程,借助裝置驅動模型的引用計數即裝置釋放流程,裝置資源管理子產品的實作就水到渠成了。雖然實作起來不複雜,但該子產品的出現确實讓裝置驅動的開發更簡便了,從此在裝置驅動開發中,涉及到記憶體資源申請時,再也無需關注申請資源的釋放操作了。以上就是本篇文章的主要内容。

繼續閱讀