在Linux系統中,可以通過以下方法讀取PCIe寄存器:
lspci
命令:lspci
命令是一個用于顯示PCI總線上所有設備信息的實用程序。要查看特定設備的寄存器,可以使用lspci -v
或lspci -vv
命令。這些命令將顯示設備的詳細信息,包括其配置空間寄存器。
例如,要查看設備ID為0x1234的設備寄存器,可以運行:
lspci -v -s 0x1234
PCIe config
工具:PCIe config
是一個用于讀取和寫入PCIe設備配置空間的實用程序。要使用此工具,需要安裝pcitool
軟件包。在Debian或Ubuntu系統上,可以使用以下命令安裝:
sudo apt-get install pcitool
然后,可以使用pciconfig
命令讀取特定設備的寄存器。例如,要查看設備ID為0x1234的設備寄存器,可以運行:
sudo pciconfig -s 0x1234
mmap
系統調用:可以通過mmap
系統調用將PCIe設備的配置空間映射到進程的虛擬地址空間,然后直接訪問寄存器。以下是一個示例代碼:
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <linux/pci.h>
#include <linux/pcieport_types.h>
int main(int argc, char *argv[]) {
int fd;
struct pci_dev *pdev;
u32 *reg_base;
u32 reg_value;
if (argc != 2) {
printf("Usage: %s <PCI device ID>\n", argv[0]);
return -1;
}
pdev = pci_get_device(atoi(argv[1]));
if (!pdev) {
printf("Failed to find PCI device with ID %s\n", argv[1]);
return -1;
}
fd = open("/dev/pci", O_RDWR);
if (fd < 0) {
perror("Failed to open /dev/pci");
return -1;
}
if (ioctl(fd, PCIMAP, (void *)pdev) < 0) {
perror("Failed to map PCI device");
close(fd);
return -1;
}
reg_base = (u32 *)pdev->resource[0].start;
reg_value = readl(reg_base + 0x10); // Read the value of register at offset 0x10
printf("Register value: 0x%x\n", reg_value);
munmap((void *)pdev, pdev->resource[0].end - pdev->resource[0].start + 1);
close(fd);
pci_dev_put(pdev);
return 0;
}
這個程序接受一個PCI設備ID作為參數,使用ioctl
系統調用將設備映射到虛擬地址空間,然后讀取指定偏移量的寄存器值。請注意,這個示例僅適用于具有單個配置空間的設備。對于具有多個配置空間的設備,需要根據設備的實際情況進行調整。