新聞中心
PCIe(Peripheral Component Interconnect-Express)是一種高速串行接口標準,它被用于連接計算機主板和各種外部設(shè)備,例如顯卡、網(wǎng)卡、存儲設(shè)備等。為了提高系統(tǒng)性能,PCIe設(shè)備通常將一部分內(nèi)存映射到PCIe總線上,以便在主機和設(shè)備之間進行數(shù)據(jù)交換。在Linux系統(tǒng)中,為了正確使用PCIe設(shè)備,我們需要首先了解如何讀取PCIe BAR(Base Address Register)。

公司主營業(yè)務(wù):成都網(wǎng)站設(shè)計、做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出沙依巴克免費做網(wǎng)站回饋大家。
PCIe BAR是標志PCIe設(shè)備內(nèi)存地址的寄存器,它告訴主機操作系統(tǒng)設(shè)備內(nèi)存的基地址和大小。每個PCIe設(shè)備通常都有多個BAR,因為它們可能需要映射多個內(nèi)存區(qū)域。在Linux內(nèi)核中,我們可以使用設(shè)備樹和pci_resource_start()函數(shù)來訪問PCIe設(shè)備的BAR。下面是如何使用這些工具讀取設(shè)備之一個BAR的基地址的示例代碼:
“`
#include
#include
static void __iomem *dev_mem;
static int probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{
struct resource *r;
u64 mem_start, mem_len;
r = &pdev->resource[0];
mem_start = r->start;
mem_len = resource_size(r);
dev_mem = pci_iomap(pdev, 0, 0);
if (!dev_mem) {
dev_err(&pdev->dev, “pci_iomap fled\n”);
return -ENODEV;
}
printk(KERN_INFO “BAR0 start %#llx, size %#llx\n”, mem_start, mem_len);
return 0;
}
static void remove(struct pci_dev *pdev)
{
pci_iounmap(pdev, dev_mem);
}
static struct pci_device_id ids[] = {
{PCI_DEVICE(0x1234, 0x5678)},
{0},
}
MODULE_DEVICE_TABLE(pci, ids);
static struct pci_driver drv = {
.name = “mydriver”,
.id_table = ids,
.probe = probe,
.remove = remove,
}
module_pci_driver(drv);
“`
此代碼包含一個設(shè)備樹的片段,該片段定義了一個PCIe設(shè)備。節(jié)點包含廠商ID、設(shè)備ID和之一個BAR的基地址和大小。在probe()函數(shù)中,我們使用pci_iomap()函數(shù)將BAR映射到內(nèi)核中的虛擬地址。然后,我們可以使用dev_mem指針來讀取和寫入該內(nèi)存區(qū)域。
PCIe設(shè)備的BAR可能是32位或64位。如果是64位,我們需要使用pci_resource_len()和pci_resource_flags()函數(shù)來訪問設(shè)備的高32位BAR。設(shè)備樹中的reg屬性可以指定高32位BAR的值。
在移除設(shè)備驅(qū)動程序時,我們使用pci_iounmap()函數(shù)釋放BAR映射。這很重要,因為每個PCIe設(shè)備只有一定數(shù)量的BAR可供使用。如果不釋放映射,可能會降低系統(tǒng)性能。
相關(guān)問題拓展閱讀:
- 如何在64位的Linux系統(tǒng)上使用匯編和C語言混
如何在64位的Linux系統(tǒng)上使用匯編和C語言混
編譯和鏈接的時候使用的指令:(AMD處理器,64位操作系統(tǒng))
編譯鏈接指令
1 na -f elf foo.s -o foo.o
2 gcc -c bar.c -o bar.o
3 ld -s -o foobar bar.o foo.o
匯編語言用na編寫并用na編譯器編譯,而C語言用的是gcc編譯,這些都沒有問題,但是在鏈接的時候出錯了,提示如下:
ld: i386 architecture of input file `foo.o’ is incompatible with i386:x86-64 output
google了一下,意思就是na 編譯產(chǎn)生的是32位的目標代碼,gcc 在64位平臺上默認產(chǎn)生的是64位的目標代碼,這兩者在鏈接的時候出錯,gcc在64位平臺上默認以64位的方式鏈接。
這樣在解決的時候就會有兩種解決方案:
讓gcc 產(chǎn)生32位的代碼,并在鏈接的時候以32位的方式進行鏈接
在這種情況下只需要修改編譯和鏈接指令即可,具體如下:
32位的編譯鏈接指令
1 na -f elf foo.s -o foo.o
2 gcc -m32 -c bar.c -o bar.o
3 ld -m elf_i386 -s -o foobar foo.o bar.o
具體的-m32 和 -m elf_i386 請自行查閱gcc (man gcc)
如果你是高版本的gcc(可能是由于更新內(nèi)核造成的),可能簡單的使用-m32 的時候會提示以下錯誤(使用別人的歷程,自己未曾遇到):
> In file included from /usr/include/stdio.h:28:0,
> from test.c:1:
> /usr/include/features.h:323:26: fatal error: bits/predefs.h: No such file or directory
> compilation terminated.
這應(yīng)該是缺少構(gòu)建32 位可執(zhí)行程序缺少的包,使用以下指令安裝:
sudo apt-get install libc6-dev-i386
此時應(yīng)該就沒有什么問題了。
編譯和鏈接的時候使用的指令:(AMD處理器,64位操作系統(tǒng))
編譯鏈接指令
1 na -f elf foo.s -o foo.o
2 gcc -c bar.c -o bar.o
3 ld -s -o foobar bar.o foo.o
匯編語數(shù)如言用na編寫并用na編譯器編譯,而C語言用的是gcc編譯,這些都沒有問題,但是在鏈接的時候出錯了,提示如下:
ld: i386 architecture of input file `foo.o’ is incompatible with i386:x86-64 output
google了一下,意思就是na 編譯產(chǎn)生的是32位的目標代碼,gcc 在64位平臺上默認產(chǎn)生的是64位的目標代碼,這兩者在鏈接的時候出錯,gcc在64位平臺上默認以64位的方式鏈接。
這樣在解決的時候就會有兩種解決方案:
讓gcc 產(chǎn)生32位的代碼,并在鏈接的時候以32位的方式進行鏈接
在這種情況下只需要修滑正改編譯和鏈接指令即可,具體如下:
32位的編譯鏈接指令
1 na -f elf foo.s -o foo.o
2 gcc -m32 -c bar.c -o bar.o
3 ld -m elf_i386 -s -o foobar foo.o bar.o
具體的-m32 和 -m elf_i386 請自行查閱gcc (man gcc)
如果你是高版本的gcc(可能是由于更新內(nèi)核造成的),可能簡單的使用-m32 的時候會提示以下錯誤(使用別人的歷程,自己薯讓啟未曾遇到):
> In file included from /usr/include/stdio.h:28:0,
> from test.c:1:
> /usr/include/features.h:323:26: fatal error: bits/predefs.h: No such file or directory
> compilation terminated.
這應(yīng)該是缺少構(gòu)建32 位可執(zhí)行程序缺少的包,使用以下指令安裝:
sudo apt-get install libc6-dev-i386
此時應(yīng)該就沒有什么問題了。
編譯和鏈接的時候使用的指令:(AMD處理器,64位操作系統(tǒng))
編譯鏈接指令
1 na -f elf foo.s -o foo.o
2 gcc -c bar.c -o bar.o
3 ld -s -o foobar bar.o foo.o
匯編語言用na編寫并用na編譯器編譯,而C語言用的是gcc編譯,這些都沒有問題,但是在鏈接的時候出錯了,提示如下:
ld: i386 architecture of input file `foo.o’ is incompatible with i386:x86-64 output
google了一下,意思就是na 編譯產(chǎn)生的是32位的目標代碼,gcc 在64位平臺上默認產(chǎn)生的是64位的目標代碼,這兩者在鏈接的時候出錯,gcc在64位平臺上默認以64位的方式鏈銀缺蠢接。
這樣在解決的時候就會有兩種解決方案:
讓gcc 產(chǎn)生32位的代碼,并在鏈接的時候以32位的方式進行鏈接
在這種情況下只需要修改編譯和鏈接指令即可,具體如下:
32位的編譯鏈接指令
1 na -f elf foo.s -o foo.o
2 gcc -m32 -c bar.c -o bar.o
3 ld -m elf_i386 -s -o foobar foo.o bar.o
具體的-m32 和 -m elf_i386 請自行查閱gcc (man gcc)
如果你是高版本的gcc(可能是由于更新內(nèi)核造成的扮枯),可能簡單的使用-m32 的時候會提示以下錯誤(使用別人的歷程,自己未曾遇到):
> In file included from /usr/include/stdio.h:28:0,
> from test.c:1:
> /usr/include/鋒陪features.h:323:26: fatal error: bits/predefs.h: No such file or directory
> compilation terminated.
這應(yīng)該是缺少構(gòu)建32 位可執(zhí)行程序缺少的包,使用以下指令安裝:
sudo apt-get install libc6-dev-i386
關(guān)于linux read pcie bar的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
創(chuàng)新互聯(lián)網(wǎng)絡(luò)推廣網(wǎng)站建設(shè),網(wǎng)站設(shè)計,網(wǎng)站建設(shè)公司,網(wǎng)站制作,網(wǎng)頁設(shè)計,1500元定制網(wǎng)站優(yōu)化全包,先排名后付費,已為上千家服務(wù),聯(lián)系電話:13518219792
當前題目:Linux讀取PCIeBAR(linuxreadpciebar)
文章轉(zhuǎn)載:http://www.fisionsoft.com.cn/article/djpgcie.html


咨詢
建站咨詢
