devm_xxx機制【轉】

来源:https://www.cnblogs.com/linhaostudy/archive/2019/04/20/10740362.html
-Advertisement-
Play Games

前言 devm是內核提供的基礎機制,用於方便驅動開發者所分配資源的自動回收。參考內核文檔devres.txt。總的來說,就是驅動開發者只需要調用這類介面分配期望的資源,不用關心釋放問題。這些資源的釋放會在device對象銷毀時自動釋放。 devres使用 不同的內核模塊提供了對應的devm_xxx接 ...


前言

devm是內核提供的基礎機制,用於方便驅動開發者所分配資源的自動回收。參考內核文檔devres.txt。總的來說,就是驅動開發者只需要調用這類介面分配期望的資源,不用關心釋放問題。這些資源的釋放會在device對象銷毀時自動釋放。

devres使用

不同的內核模塊提供了對應的devm_xxx介面,如下(不僅僅這些):

MEM
  devm_kmalloc()    
  devm_kzalloc()
  devm_kcalloc()
  devm_kmalloc_array()
  devm_kstrdup()
  devm_kfree()

IIO
  devm_iio_device_alloc()
  devm_iio_device_free()
  devm_iio_trigger_alloc()
  devm_iio_trigger_free()
  devm_iio_device_register()
  devm_iio_device_unregister()

IO region
  devm_request_region()
  devm_request_mem_region()
  devm_release_region()
  devm_release_mem_region()

IRQ
  devm_request_irq()
  devm_free_irq()

DMA
  dmam_alloc_coherent()
  dmam_free_coherent()
  dmam_alloc_noncoherent()
  dmam_free_noncoherent()
  dmam_declare_coherent_memory()
  dmam_pool_create()
  dmam_pool_destroy()

PCI
  pcim_enable_device()  : after success, all PCI ops become managed
  pcim_pin_device() : keep PCI device enabled after release

IOMAP
  devm_ioport_map()
  devm_ioport_unmap()
  devm_ioremap()
  devm_ioremap_nocache()
  devm_iounmap()
  devm_ioremap_resource() : checks resource, requests memory region, ioremaps
  devm_request_and_ioremap() : obsoleted by devm_ioremap_resource()
  pcim_iomap()
  pcim_iounmap()
  pcim_iomap_table()    : array of mapped addresses indexed by BAR
  pcim_iomap_regions()  : do request_region() and iomap() on multiple BARs

REGULATOR
  devm_regulator_get()
  devm_regulator_put()
  devm_regulator_bulk_get()
  devm_regulator_register()

CLOCK
  devm_clk_get()
  devm_clk_put()

PINCTRL
  devm_pinctrl_get()
  devm_pinctrl_put()

PWM
  devm_pwm_get()
  devm_pwm_put()

PHY
  devm_usb_get_phy()
  devm_usb_put_phy()

SLAVE DMA ENGINE
  devm_acpi_dma_controller_register()

SPI
  devm_spi_register_master()

內核提供了devres_xxx的機制,並基於devres_xxx又給出了devres group機制。devres group主要用於處理初始化的時候,有多種資源類型需要初始化,每種資源類型的初始化又由多個devres_xxx資源申請組成的情況,將這些devres_xxx按類別組合成group,這樣在需要顯示釋放某一類的資源時,調用devres group的api即可實現。內核給出的例子:

if (!devres_open_group(dev, NULL, GFP_KERNEL))//啟動group
    return -ENOMEM;

  acquire A;//申請資源A
  if (failed)
    goto err;

  acquire B;//申請資源B
  if (failed)
    goto err;
  ...

  devres_remove_group(dev, NULL);//如果一切順利,那麼關掉group
  return 0;

 err:
  devres_release_group(dev, NULL);//如果出錯,那麼釋放掉啟動group後所有申請的資源
  return err_code;

實現原理

具體的實現很簡單,當然我們應該也能猜測到。在分配記憶體的時候,會分配比我們要求大的空間,空間的前面部分用於存放實現devres機制的數據結構,然後返回的是用戶期望的空間的指針(該指針是實際分配的空間指針的devres結構的偏移)。

struct devres_node {
    struct list_head        entry;//通過該成員,掛接到device的devres鏈表上
    dr_release_t            release;//對應的資源釋放回調
};

struct devres {
    struct devres_node      node;
    /* -- 3 pointers */
    unsigned long long      data[]; /* guarantee ull alignment *///實際的數據部分
};

devres採用零長數組的方式實現。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Linux的用戶是以組為單位,每個用戶都屬於某一個組,而用戶組的許可權,是指某個用戶對某個文件(文件夾)的操作許可權,這裡涉及用戶組的概念。 其中root用戶擁有全Linux系統中最高的許可權,比任何其他用戶的許可權都高,可以修改任意文件和用戶。 用戶組的作用:就用於標識同一種類型的用戶,這樣可以給一組用戶 ...
  • 1.vim編輯器 vim操作命令 --在命令模式下進行 底線命令模式: 2.用戶管理和文件目錄許可權 linux下麵的用戶及許可權: root用戶: 超級管理員, 相當於QQ群裡面的群主 普通用戶: 可以做一些簡單的操作, 如果需要做系統服務相關的操作,需要授權 3.文件許可權詳解 4.sudo命令用法 ...
  • You believe it or not there is a feeling, lifetime all not lost to time. 在Linux上部署Web項目 這個是普通的web項目,若是其他項目如大數據,則要安裝下hadoop集群和kms、hdfs、hive等插件後才可用在該環境基 ...
  • 4 How Interrupts work 與遵循樹的自然結構的地址範圍轉換不同, 中斷信號可以起源於或者終止於板卡上的任何設備。 與設備樹中自然表示的設備定址不同,中斷信號的表示獨立於設備樹節點之間的連接。通常用下麵的四個屬性來描述一個中斷連接: interrupt-controller - 一個 ...
  • 主要用途:用於內部網路和網路服務供應商自動分配IP地址給用戶 用於內部網路管理員作為對所有電腦作集中管理的手段 使用場景:自動化安裝系統 解決IPV4資源不足問題 DHCP共有八種報文: 常見的為前四種報文 DHCP DISCOVER:客戶端到伺服器 DHCP OFFER :伺服器到客戶端 DHCP ...
  • Linux 用戶及許可權詳解 用戶 , 組 ,許可權 安全上下文(secure context); 許可權: r,w,x 文件: r : 可讀,可以使用類似cat 等命令查看文件內容。 w : 可寫,可以編輯或刪除此文件; x : 可執行,eXcutable, 可以命令提示符下當做命令提交給內核運行; 目 ...
  • 實驗一:創建kickstart文件實現用網路來進行半自動化安裝系統 1. 安裝圖形化工具來製作應答文件 yum install system-config-kickstart 也可參考/root目錄下自帶的 anaconda-ks.cfg 文件,進修修改。 註:6系統和7系統為各自不同的應答文件,需 ...
  • 操作系統將記憶體按照頁的進行管理,在需要的時候才把進程相應的部分調入記憶體。當產生缺頁中斷時,需要選擇一個頁面寫入。如果要換出的頁面在記憶體中被修改過,變成了“臟”頁面,那就需要先寫會到磁碟。頁面置換演算法,就是要選出最合適的一個頁面,使得置換的效率最高。頁面置換演算法有很多,簡單介紹幾個,重點介紹比較重要的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...