PCI-E、sysfs 和使用者 ID 權限異常
在我們的 3.X 系列核心上,專有的 PCI-Express 設備具有專有的核心驅動程序。我們在搜尋 PCI 功能時看到了一些奇怪的錯誤。我找不到任何很棒的文件 - 有誰知道核心驅動程序是否可以控制
sysfs
/procfs
基於使用者 ID 公開哪些數據?具體來說,此呼叫在供應商的實用程序中失敗:
c = pci_find_cap(mdev->pdev, VENDOR_EXT_CAP_ID, PCI_CAP_EXTENDED);
經過大量探勘後,我可以使用 setpci 來複製失敗
VENDOR_EXT_CAP_ID
。我看到的是:
- FS 權限授予使用者和 root 讀取權限。
- 打開文件“config”
sysfs
並讀取$data
.$data
對於使用者和$data
root是不同的。我看不到很多關於這如何可能的文件,我們也沒有與供應商良好的升級路徑。有沒有人見過這個?
是的,核心驅動程序可以根據使用者 ID 和/或基本上核心可以訪問的任何資訊來控制它在 sysfs/procfs 中公開的數據。
當您從 procfs 或 sysfs 讀取某些內容時,用於讀取資訊的系統呼叫基本上會結束呼叫相應驅動程序中的函式。該函式可以查看呼叫讀取操作的使用者空間程序的所有資訊,並且當然可以基於此修改其輸出,或者基於核心可以訪問的任何其他資訊。
在特定情況下
/sys/bus/pci/devices/<PCI device ID>/config
,任何讀取它的嘗試都將在文件中的函式pci_read_config()``drivers/pci/pci-sysfs.c
中結束,該函式將檢查呼叫使用者空間程序是否具有 CAP_SYS_ADMIN 功能(在大多數情況下意味著使用者是root
)。如果使用者沒有該能力,該函式會將可讀的 PCI 配置數據限制在前(dev->cfg_size)
字節(CardBus 上為 128 字節)。在核心版本 2.6.5 及更低版本中,限制曾經是 256 字節,但在 2.6.6 中它被收緊為
(dev->cfg_size)
. 在現代系統上,(dev->cfg_size)
根據所討論的設備,往往是 64 或 256 字節。你可以用一個簡單的
lspci -v
. 如果您以 root 身份執行它,您將看到每個設備的 PCI/PCIe 功能。但是如果你以普通使用者的身份執行它,你會得到:Capabilities: <access denied>