[問題] 關於driver的一段程式

看板C_and_CPP (C/C++)作者 (43米的深海)時間16年前 (2009/06/30 14:29), 編輯推噓2(2011)
留言13則, 4人參與, 最新討論串1/1
第一個問題是: 最近在看kernel下的程式,有一行不甚了解,就是下列紅色註記if(drv->probe)這裡, 想請教大家一下,它這段code的意思是: drv是platform_driver的結構,如果它去存取probe指標函式時, 成功就執行 drv->driver.probe = platform_drv_probe; 這段code 嗎? 那成功是代表什麼意思? 第二個問題是: 下面這個struct裡包含有probe和remove的函式指標, 為什麼它們前面都要加一點呢? static struct platform_driver davincifb_driver = { .probe = davincifb_probe, .remove = davincifb_remove, .driver = { .name = MODULE_NAME, .owner = THIS_MODULE, }, }; struct platform_driver { int (*probe)(struct platform_device *); ........ 以下省略 }; static int platform_drv_probe(struct device *_dev){ struct platform_driver *drv = to_platform_driver(_dev->driver); struct platform_device *dev = to_platform_device(_dev); return drv->probe(dev); } device_driver struct platform_driver { int (*probe)(struct platform_device *); .........以下省略 }; int platform_driver_register(struct platform_driver *drv) { drv->driver.bus = &platform_bus_type; if (drv->probe) drv->driver.probe = platform_drv_probe; ....... 主程式中有一段程式碼是呼叫上面這函式,如下 platform_driver_register( &davincifb_driver ); 所以,以我的理解,這段if(drv->probe)應該會執行davincifb_probe 這隻程式. 不知道對不對.... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.22.20.210

06/30 15:29, , 1F
如果這是C/C++, 最簡單的看法就是下面這樣....
06/30 15:29, 1F

06/30 15:30, , 2F
如果 drv->probe 不等於0 // 不管是指標是整數還是什麼
06/30 15:30, 2F

06/30 15:31, , 3F
把 platform_drv_probe 的值 assign 給
06/30 15:31, 3F

06/30 15:31, , 4F
drv->driver.probe //不管是數是指標還是函數指標.
06/30 15:31, 4F

06/30 15:33, , 5F
這部份的code只做值的assign, 沒有invoke func call來.
06/30 15:33, 5F

06/30 15:33, , 6F
#1A9osaTI 這篇文章有說到為什麼要加那個 .
06/30 15:33, 6F

06/30 16:41, , 7F
所以if (drv->probe)這段code只是assign函式名稱嗎?
06/30 16:41, 7F

06/30 16:43, , 8F
感謝james大大的文章,不過還是不太清楚,用了只是加快
06/30 16:43, 8F

06/30 16:44, , 9F
定位速度而已嗎? 目的是減少driver的搜尋時間?
06/30 16:44, 9F

06/30 17:06, , 10F
自問自答一下....第二個問題我找到答案了...
06/30 17:06, 10F

06/30 17:07, , 12F
2017.aspx 上下二個網址要合併
06/30 17:07, 12F

07/01 00:14, , 13F
很像是 pci 的driver
07/01 00:14, 13F
文章代碼(AID): #1AIR2rQx (C_and_CPP)
文章代碼(AID): #1AIR2rQx (C_and_CPP)