爲什麼大多數設備驅動程序中的每個函數都是靜態的?由於靜態函數在文件範圍之外不可見。那麼,這些驅動程序功能如何被用戶空間應用程序調用?Linux設備驅動程序中的靜態函數
回答
記住比在C中一切都是地址。這意味着如果你有地址,你可以調用一個函數。內核有一個名爲EXPORT_SYMBOL
的宏就是這樣做的。它導出一個函數的地址,以便調用驅動函數而不必放置頭聲明,因爲這些函數有時在編譯時不知道。在這種情況下,靜態限定符僅用於確保它們僅通過此方法調用,而不是從可能包含該驅動程序代碼的其他文件調用(在某些情況下,包含驅動程序代碼頭並直接調用它們並不是一個好主意) 。
編輯:既然有人指出我沒有覆蓋用戶空間。
驅動程序函數通常不直接通過用戶空間調用(SYSCALL指令的x86實現除外,它有時會執行一些小技巧來保存上下文切換)。所以這裏的static關鍵字沒有區別。它僅在內核空間上有所不同。正如@Cong Wang指出的那樣,函數通常放置在函數指針的結構中,以便可以通過簡單地指向這個結構的結構(比如file_ops,調度器,文件系統,網絡代碼等)來調用它們。
「通過此方法調用」。此方法是什麼。你的意思是EXPORT_SYMBOL宏? –
@Sibrajas是的,這主要是爲了確保您不依賴動態驅動程序(它並不總是可用)。 –
這個「答案」是假的,但票數最多?!驅動程序中的導出符號只能由其他內核例程使用,並且不能從用戶空間訪問。僅僅因爲你「知道」地址並不意味着用戶空間程序可以訪問該地址。Linux是使用MMU的受保護內核。 – sawdust
因爲這些靜態功能不應該被用於直接以外的模塊。它們被模塊中的其他函數調用,其中可以是ioctl或任何回調函數的接口。這就是爲什麼他們可以從用戶空間調用,他們只是在呼叫路徑。
看一看網絡虛設模塊:
dummy_dev_init()顯然是靜態的:
static int dummy_dev_init(struct net_device *dev)
{
dev->dstats = alloc_percpu(struct pcpu_dstats);
if (!dev->dstats)
return -ENOMEM;
return 0;
}
但它是一個回調 - )> ndo_init(註冊該網絡設備時被調用。
static const struct net_device_ops dummy_netdev_ops = {
.ndo_init = dummy_dev_init,
.ndo_uninit = dummy_dev_uninit,
.ndo_start_xmit = dummy_xmit,
.ndo_validate_addr = eth_validate_addr,
.ndo_set_rx_mode = set_multicast_list,
.ndo_set_mac_address = eth_mac_addr,
.ndo_get_stats64 = dummy_get_stats64,
.ndo_change_carrier = dummy_change_carrier,
};
很明顯,沒有人應該直接調用dummy_dev_init()。
內核擁有數千個模塊,它們(或曾經是)所有的目標文件,通過類似於鏈接的過程動態加載 - 或者實際上鍊接到可執行文件中。你能想象如果它們全都導出所有函數名稱,那麼會有多少名稱衝突,除非指定了static
,否則默認的C行爲也是如此。
用戶空間應用程序不能直接調用驅動程序功能,但有other ways進行交互。
通過直接調用它們,我的意思是編譯時調用某個特定驅動程序的方法,而無需執行ioctl或將自己註冊爲某個設備或某些設備。總是可以只做一個頭部或外部函數並刪除靜態關鍵字:P –
- 1. Linux設備驅動程序中的靜態函數?
- 2. Linux設備驅動程序
- 3. Linux設備驅動程序中的內聯函數
- 4. 設備驅動程序在linux中
- 5. Linux i2c-設備驅動程序module_i2c_driver()
- 6. IOCTL Linux設備驅動程序
- 7. Linux網絡設備驅動程序
- 8. Linux設備驅動程序,程序啓動的地方?
- 9. 平臺設備/驅動程序vs i2c設備/驅動程序
- 10. 將虛擬PCI設備與linux設備驅動程序接口
- 11. 創建設備文件:Linux設備驅動程序
- 12. Linux設備驅動程序字符設備「子目錄」
- 13. Linux中設備驅動程序檢測的過程
- 14. Linux設備驅動程序的最簡單驅動程序新手
- 15. 在Linux設備驅動程序的簡單程序
- 16. Linux設備驅動程序 - 線程化IRQ處理程序
- 17. 在linux中的設備驅動程序中打開設備節點
- 18. 如何使用android/linux電源驅動程序註冊設備驅動程序?
- 19. Linux設備驅動程序:將標誌傳遞給驅動程序
- 20. Wince設備驅動程序
- 21. Windows設備驅動程序
- 22. scull設備驅動程序
- 23. 關於Linux設備驅動
- 24. 如何啓動linux系統和設備驅動程序編程
- 25. linux中的C++設備驅動程序開發
- 26. Linux內核設備驅動程序中的filp_open
- 27. Linux中的設備驅動程序開發
- 28. Linux中的USB串行驅動程序和設備名稱
- 29. 只能使用其設備文件訪問Linux中的設備驅動程序?
- 30. MongoDB Java驅動程序3.0 - 用於彙總的靜態函數
可能的重複:http://stackoverflow.com/questions/12917198/linux-device-driver-program-where-the-program-starts/12923107#12923107你忽略了這些靜態函數的一些是事實在*操作*結構中使用,它允許通過標準驅動程序接口(例如文件操作)間接訪問這些靜態例程。 – sawdust