国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux設備與驅動的手動解綁與手動綁定

Linux閱碼場 ? 來源:Linuxer ? 2020-08-03 16:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

眾所周知,Linux靠設備與驅動之間的match,來完成設備與驅動的bind,從而觸發驅動的probe()成員函數被執行。每個bus都有相應的match方法,完成match的總的入口函數是:

static inline int driver_match_device(struct device_driver *drv, struct device *dev){ return drv->bus->match ? drv->bus->match(dev, drv) : 1;}

而這個總的入口函數又會調用到各自不同總線的match函數,對于platform bus而言,它的match函數就是platform_match()

static int platform_match(struct device *dev, struct device_driver *drv){ struct platform_device *pdev = to_platform_device(dev); struct platform_driver *pdrv = to_platform_driver(drv); /* When driver_override is set, only bind to the matching driver */ if (pdev->driver_override) return !strcmp(pdev->driver_override, drv->name); /* Attempt an OF style match first */ if (of_driver_match_device(dev, drv)) return 1; /* Then try ACPI style match */ if (acpi_driver_match_device(dev, drv)) return 1; /* Then try to match against the id table */ if (pdrv->id_table) return platform_match_id(pdrv->id_table, pdev) != NULL; /* fall-back to driver name match */ return (strcmp(pdev->name, drv->name) == 0);}

從代碼可以看出,platform的driver和device之間的match有很多方法成立,比如設備的name和驅動的name相同:

strcmp(pdev->name, drv->name) == 0

比如,設備的名字出現在驅動的ID表中:

if (pdrv->id_table) return platform_match_id(pdrv->id_table, pdev) != NULL;

比如device tree里面的compatible字段與驅動的dt兼容性字段匹配:

if (of_driver_match_device(dev, drv)) return 1;

只要符合其中任意一種,driver和device都可以匹配上。

這種自動匹配非常簡單,實施起來也非常容易。

但是有時候,這種自動匹配并不一定是我們想要的。比如我們有時候就是希望XXX設備用YYY驅動,而不是用XXX驅動。工程中有手動匹配的需求,最典型的場景是VFIO的場景,想讓設備與內核空間原本綁定的驅動解綁,轉而采用內核空間的通用VFIO驅動,而VFIO驅動又提供了userspace駕馭設備的能力。

下面我們來從原理和實踐上演示這種手動的unbind和bind是怎么進行的。在《Linux設備驅動開發詳解》一書中,我們給出了一個簡單的globalfifo設備和globalfifo驅動:

globalfifo-dev.ko(增加platform_device的模塊):

static int __init globalfifodev_init(void){ int ret; globalfifo_pdev=platform_device_alloc("globalfifo",-1); ret = platform_device_add(globalfifo_pdev);... return 0; }module_init(globalfifodev_init);

globalfifo.ko(增加platform_driver的模塊):

static struct platform_driver globalfifo_driver = { .driver = { .name = "globalfifo", .owner = THIS_MODULE, }, .probe = globalfifo_probe, .remove = globalfifo_remove,}; module_platform_driver(globalfifo_driver);

由于其中的platform_driver和platform_device的name都是“globalfifo”,符合此行的匹配規則:

strcmp(pdev->name, drv->name) == 0

設備和驅動匹配成功,從sysfs也可以看出:

globalfifo的device和driver各自找到了對方。

現在我們來寫一個第三者driver,名字叫做globalxxx,然后我們想把globalfifo device的driver指向globalxxx。因此我們要完成2步:

unbind:解除globalfifo driver與globalfifo device的綁定

bind: 進行globalxxxdriver與globalfifo device的綁定

第三者globalxxx驅動代碼類似:

globalxxx.ko(增加platform_driver的模塊):

static struct platform_driver globalxxx_driver = { .driver = { .name = "globalxxx", .owner = THIS_MODULE, }, .probe = globalxxx_probe, .remove = globalxxx_remove,}; module_platform_driver(globalxxx_driver);

下面我們來完成第一步的unbind,這一步很簡單,跑到/sys/bus/platform/drivers/globalfifo目錄,把設備globalfifo的名字寫進去unbind文件:

當然我們也可以來回折騰著unbind,bind著玩:

這樣我們看到一堆的probe(每次設備和驅動bind成功,驅動probe都會執行),remove(每次設備和驅動unbind成功,驅動remove都會執行),最后處于unbind狀態。

現在我們來把globalfifo設備bind到globalxxx驅動:

綁定的時候提示錯誤!

綁定的時候提示錯誤!!

綁定的時候提示錯誤!!!

前面我們用globalfifo的driver去bind globalfifo的device的時候,是想怎么綁就怎么綁的,想綁多少次就綁多少次的!為什么換了globalxxx來綁就不行了呢?

愛情不是你想賣想買就能賣

讓我掙開 讓我明白

放手你的愛

我們來看看這個bind sysfs入口工作的函數bind_store():

static ssize_t bind_store(struct device_driver *drv, const char *buf, size_t count){ ... dev = bus_find_device_by_name(bus, NULL, buf); if (dev && dev->driver == NULL && driver_match_device(drv, dev)) { err = device_driver_attach(drv, dev); if (err > 0) { /* success */ err = count; } else if (err == 0) { /* driver didn't accept device */ err = -ENODEV; } } ...}

看起來,如果要強行bind,仍然需要device_driver_attach()成立,否則內核會返回-ENODEV錯誤:

} else if (err == 0) { /* driver didn't accept device */ err = -ENODEV; }

根據前文對platform_match()的代碼分析,globalxxx driver和globalfifo device確實八竿子都打不著!!沒有任何匹配因子。

下面我們來把globalxxx的代碼稍微改一下,通過ID表來增加一個匹配因子:

static const struct platform_device_id globalxxx_ids[] = { { .name = "globalfifo", }, {}};MODULE_DEVICE_TABLE(platform, globalxxx_ids); static struct platform_driver globalxxx_driver = { .driver = { .name = "globalxxx", .owner = THIS_MODULE, }, .id_table = globalxxx_ids, .probe = globalxxx_probe, .remove = globalxxx_remove,}; module_platform_driver(globalxxx_driver);

rmmod和insmod globalxxx.ko

然后重新bind:

現在globalfifo device可以在globalxxx和globalfifo這2個driver里面進行自由地bind和unbind!

看到這里,客官們一定覺得這太特么狗血了!不是說可以自由地綁定第三者嗎?為嘛還要求這個第三者驅動與這個原先的設備匹配呢?這有嘛意思呢?

別忘了,在platform_match中還有這么一行:

if (pdev->driver_override) return !strcmp(pdev->driver_override, drv->name);

設備完全可以自由地宣布她喜歡的第三者driver,哪怕這個第三者driver和她本身完全沒有任何的匹配因子,操作的入口就是driver_override sysfs文件。

我們完全可以保留globalxxx驅動的原樣

static struct platform_driver globalxxx_driver = { .driver = { .name = "globalxxx", .owner = THIS_MODULE, }, .probe = globalxxx_probe, .remove = globalxxx_remove,};

不去增加任何的id_table,而換做到globalfifo device里面去寫driver_override文件,宣布globalxxx driver可以匹配globalfifo device。

這樣之后,哪怕globalxxx driver和globalfifo device八竿子打不著,也是可以驅動globalfifo device的。工程里面如果我們想用VFIO的方式來驅動一個設備,就可以這樣做:

echo vfio-platform > driver_override

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 驅動
    +關注

    關注

    12

    文章

    1954

    瀏覽量

    88522
  • Linux
    +關注

    關注

    88

    文章

    11758

    瀏覽量

    219009
  • 函數
    +關注

    關注

    3

    文章

    4417

    瀏覽量

    67502

原文標題:宋寶華:Linux設備與驅動的手動解綁與手動綁定

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    變頻器手動旁路與自動旁路的優缺點比較

    變頻器作為現代工業控制中不可或缺的設備,其旁路功能的設計直接影響系統的可靠性和靈活性。手動旁路與自動旁路是兩種常見的配置方案,它們在應用場景、成本控制、安全性能等方面存在顯著差異,需要根據實際需求進行選擇。以下從工作原理、技術特點、適用場景等維度展開詳細對比分析。
    的頭像 發表于 02-27 17:03 ?262次閱讀
    變頻器<b class='flag-5'>手動</b>旁路與自動旁路的優缺點比較

    從RK3576 Linux SDK手動適配RK3568,省下時間又省錢

    基于 RK3568 開發物聯網設備,但官方 SDK 申請還在排隊,于是決定從已有的 RK3576 Linux SDK 手動適配,最終成功編譯出 RK3568 的鏡像。今天就來拆解這個適配過程,告訴你 “為什么要這么操作”,以及背
    的頭像 發表于 02-02 17:17 ?1325次閱讀
    從RK3576 <b class='flag-5'>Linux</b> SDK<b class='flag-5'>手動</b>適配RK3568,省下時間又省錢

    全自動vs手動:哪種芯片燒錄機更適合你的工廠產線?

    本文系統對比了全自動與手動芯片燒錄機的核心差異。全自動設備適用于大批量、單一型號的穩定生產,以高投入換取超高產能、極致良率與完整追溯能力。手動設備則憑借極低的切換成本與投入,完美適配小
    的頭像 發表于 01-09 10:39 ?1742次閱讀
    全自動vs<b class='flag-5'>手動</b>:哪種芯片燒錄機更適合你的工廠產線?

    【免費送書】成為硬核Linux開發者:《Linux 設備驅動開發(第 2 版)》

    Linux系統的設備驅動開發,一直給人門檻較高的印象,主要因內核機制抽象、需深度理解硬件原理、開發調試難度大所致。2021年,一本講解驅動開發的專著問世即獲市場青睞,暢銷近萬冊——這便
    的頭像 發表于 11-18 08:06 ?1397次閱讀
    【免費送書】成為硬核<b class='flag-5'>Linux</b>開發者:《<b class='flag-5'>Linux</b> <b class='flag-5'>設備</b><b class='flag-5'>驅動</b>開發(第 2 版)》

    原理圖手動連線太繁瑣,自動連線來救場!

    原理圖繪圖中有比較多且繁瑣的操作,還極其容易出錯。比如:1.逐條網絡命名:在原理圖中為大量重要的電源、時鐘、差分對網絡手動添加有意義的名稱(如DDR_DQ[0],PCIe_CLK100M_P),極其
    的頭像 發表于 11-10 18:30 ?658次閱讀
    原理圖<b class='flag-5'>手動</b>連線太繁瑣,自動連線來救場!

    如何判斷電能質量在線監測裝置時鐘模塊需要進行手動校準?

    判斷電能質量在線監測裝置時鐘模塊是否需要手動校準,核心是識別 “ 自動同步失效 ” 或 “ 時鐘偏差超出對應精度等級允許范圍 ” 兩類場景,結合裝置狀態提示、數據對比、功能異常等直觀信號,按 “先查
    的頭像 發表于 10-15 17:52 ?668次閱讀

    無人機自動巡檢系統:從手動操作到智能化的技術變革

    ? ? ? ?無人機自動巡檢系統:從手動操作到智能化的技術變革 ? ? ? ?在無人機技術發展過程中,其操控方式經歷了從完全依賴飛手手動操作到逐步實現自動化、智能化巡檢的重大飛躍。早期手動飛行模式
    的頭像 發表于 09-11 13:16 ?703次閱讀

    阿圖什小臺式測徑儀的自動模式與手動模式分別是什么?

    ”指示設備對電機轉速的控制方式,分為“手動模式M”和“自動模式A”。 模式切換方法 在主界面下按“模式”按鍵,設備在自動和手動模式間切換。 “自動模式A”下,
    發表于 07-29 15:01

    API讓電商“飛”起來,告別手動操作

    ? 在當今快節奏的電商環境中,手動處理訂單、更新庫存或管理客戶數據不僅耗時耗力,還容易出錯。許多商家因此陷入效率瓶頸,影響業務增長。幸運的是,API(應用程序編程接口)技術為電商自動化提供了強大支持
    的頭像 發表于 07-16 10:31 ?428次閱讀
    API讓電商“飛”起來,告別<b class='flag-5'>手動</b>操作

    季豐電子推出低高溫手動探針臺設備

    為滿足客戶對低溫測試的要求,季豐電子成功自研了低高溫手動探針臺,目前已在季豐張江FA投入使用,該機臺填補了傳統常規型手動探針臺無法實現低溫測試環境的空白。
    的頭像 發表于 06-05 13:38 ?904次閱讀

    harmony OS NEXT-雙向數據綁定MVVM以及$$語法糖介紹

    保持同步的機制,當數據發生變化時,UI自動更新;反之,當用于通過UI代碼操作修改數據時,數據模型也會同步更新,這種機制簡化了開發,減少了手動DOM或UI組件的代碼量,舉個簡單的例子,比如輸入框和變量的綁定,用戶輸入變量更新,變量在其他地方修改時輸入框的內容也發生變化
    的頭像 發表于 04-29 16:52 ?1248次閱讀

    視覺運控一體機在DELTA并聯機械手動態跟隨抓取的應用

    正運動DELTA并聯機械手動態跟隨抓取解決方案
    的頭像 發表于 04-29 10:34 ?761次閱讀
    視覺運控一體機在DELTA并聯機械<b class='flag-5'>手動</b>態跟隨抓取的應用

    Princetel 推出新的手動電纜卷筒在線配置器

    新的數字工具使工程師能夠配置和下載手動電纜卷筒的 3D CAD 模型 Princetel 成立于 2000 年,是一家垂直一體化公司,專門設計和制造光纖旋轉接頭 (FORJ)、按訂單生產的電氣滑環
    發表于 04-18 15:41

    手動檢測的終結者:機器人氣密性測試設備來襲

    在制造業的精密檢測領域,氣密性測試一直是保證產品質量的關鍵環節。然而,傳統的手動檢測方法存在效率低下、誤差較大等問題,已經無法滿足現代工業對高質量和高效率的追求。隨著科技的進步,機器人氣密性測試設備
    的頭像 發表于 04-16 14:50 ?699次閱讀
    <b class='flag-5'>手動</b>檢測的終結者:機器人氣密性測試<b class='flag-5'>設備</b>來襲

    TPS3808 低靜態電流監控器,具有可編程延遲和手動復位功能數據手冊

    TPS3808 系列微處理器監控電路可監控 0.4 V 至 5 V 的系統電壓,當 SENSE 電壓降至預設閾值以下或手動復位 (MR) 引腳降至邏輯低電平時,觸發漏極開路 RESET 信號。在
    的頭像 發表于 04-11 14:52 ?1371次閱讀
    TPS3808 低靜態電流監控器,具有可編程延遲和<b class='flag-5'>手動</b>復位功能數據手冊