日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Linux讀取PCIeBAR(linuxreadpciebar)

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

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)公司推出沙依巴克免費(fèi)做網(wǎng)站回饋大家。

PCIe BAR是標(biāo)志PCIe設(shè)備內(nèi)存地址的寄存器,它告訴主機(jī)操作系統(tǒng)設(shè)備內(nèi)存的基地址和大小。每個(gè)PCIe設(shè)備通常都有多個(gè)BAR,因?yàn)樗鼈兛赡苄枰成涠鄠€(gè)內(nèi)存區(qū)域。在Linux內(nèi)核中,我們可以使用設(shè)備樹和pci_resource_start()函數(shù)來(lái)訪問(wèn)PCIe設(shè)備的BAR。下面是如何使用這些工具讀取設(shè)備之一個(gè)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);

“`

此代碼包含一個(gè)設(shè)備樹的片段,該片段定義了一個(gè)PCIe設(shè)備。節(jié)點(diǎn)包含廠商ID、設(shè)備ID和之一個(gè)BAR的基地址和大小。在probe()函數(shù)中,我們使用pci_iomap()函數(shù)將BAR映射到內(nèi)核中的虛擬地址。然后,我們可以使用dev_mem指針來(lái)讀取和寫入該內(nèi)存區(qū)域。

PCIe設(shè)備的BAR可能是32位或64位。如果是64位,我們需要使用pci_resource_len()和pci_resource_flags()函數(shù)來(lái)訪問(wèn)設(shè)備的高32位BAR。設(shè)備樹中的reg屬性可以指定高32位BAR的值。

在移除設(shè)備驅(qū)動(dòng)程序時(shí),我們使用pci_iounmap()函數(shù)釋放BAR映射。這很重要,因?yàn)槊總€(gè)PCIe設(shè)備只有一定數(shù)量的BAR可供使用。如果不釋放映射,可能會(huì)降低系統(tǒng)性能。

相關(guān)問(wèn)題拓展閱讀:

  • 如何在64位的Linux系統(tǒng)上使用匯編和C語(yǔ)言混

如何在64位的Linux系統(tǒng)上使用匯編和C語(yǔ)言混

編譯和鏈接的時(shí)候使用的指令:(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

匯編語(yǔ)言用na編寫并用na編譯器編譯,而C語(yǔ)言用的是gcc編譯,這些都沒有問(wèn)題,但是在鏈接的時(shí)候出錯(cuò)了,提示如下:

ld: i386 architecture of input file `foo.o’ is incompatible with i386:x86-64 output

google了一下,意思就是na 編譯產(chǎn)生的是32位的目標(biāo)代碼,gcc 在64位平臺(tái)上默認(rèn)產(chǎn)生的是64位的目標(biāo)代碼,這兩者在鏈接的時(shí)候出錯(cuò),gcc在64位平臺(tái)上默認(rèn)以64位的方式鏈接。

這樣在解決的時(shí)候就會(huì)有兩種解決方案:

讓gcc 產(chǎn)生32位的代碼,并在鏈接的時(shí)候以32位的方式進(jìn)行鏈接

在這種情況下只需要修改編譯和鏈接指令即可,具體如下:

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 請(qǐng)自行查閱gcc (man gcc)

如果你是高版本的gcc(可能是由于更新內(nèi)核造成的),可能簡(jiǎn)單的使用-m32 的時(shí)候會(huì)提示以下錯(cuò)誤(使用別人的歷程,自己未曾遇到):

> 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

此時(shí)應(yīng)該就沒有什么問(wèn)題了。

編譯和鏈接的時(shí)候使用的指令:(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

匯編語(yǔ)數(shù)如言用na編寫并用na編譯器編譯,而C語(yǔ)言用的是gcc編譯,這些都沒有問(wèn)題,但是在鏈接的時(shí)候出錯(cuò)了,提示如下:

ld: i386 architecture of input file `foo.o’ is incompatible with i386:x86-64 output

google了一下,意思就是na 編譯產(chǎn)生的是32位的目標(biāo)代碼,gcc 在64位平臺(tái)上默認(rèn)產(chǎn)生的是64位的目標(biāo)代碼,這兩者在鏈接的時(shí)候出錯(cuò),gcc在64位平臺(tái)上默認(rèn)以64位的方式鏈接。

這樣在解決的時(shí)候就會(huì)有兩種解決方案:

讓gcc 產(chǎn)生32位的代碼,并在鏈接的時(shí)候以32位的方式進(jìn)行鏈接

在這種情況下只需要修滑正改編譯和鏈接指令即可,具體如下:

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 請(qǐng)自行查閱gcc (man gcc)

如果你是高版本的gcc(可能是由于更新內(nèi)核造成的),可能簡(jiǎn)單的使用-m32 的時(shí)候會(huì)提示以下錯(cuò)誤(使用別人的歷程,自己薯讓啟未曾遇到):

> 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

此時(shí)應(yīng)該就沒有什么問(wèn)題了。

編譯和鏈接的時(shí)候使用的指令:(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

匯編語(yǔ)言用na編寫并用na編譯器編譯,而C語(yǔ)言用的是gcc編譯,這些都沒有問(wèn)題,但是在鏈接的時(shí)候出錯(cuò)了,提示如下:

ld: i386 architecture of input file `foo.o’ is incompatible with i386:x86-64 output

google了一下,意思就是na 編譯產(chǎn)生的是32位的目標(biāo)代碼,gcc 在64位平臺(tái)上默認(rèn)產(chǎn)生的是64位的目標(biāo)代碼,這兩者在鏈接的時(shí)候出錯(cuò),gcc在64位平臺(tái)上默認(rèn)以64位的方式鏈銀缺蠢接。

這樣在解決的時(shí)候就會(huì)有兩種解決方案:

讓gcc 產(chǎn)生32位的代碼,并在鏈接的時(shí)候以32位的方式進(jìn)行鏈接

在這種情況下只需要修改編譯和鏈接指令即可,具體如下:

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 請(qǐng)自行查閱gcc (man gcc)

如果你是高版本的gcc(可能是由于更新內(nèi)核造成的扮枯),可能簡(jiǎn)單的使用-m32 的時(shí)候會(huì)提示以下錯(cuò)誤(使用別人的歷程,自己未曾遇到):

> 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è)計(jì),網(wǎng)站建設(shè)公司,網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì),1500元定制網(wǎng)站優(yōu)化全包,先排名后付費(fèi),已為上千家服務(wù),聯(lián)系電話:13518219792


文章題目:Linux讀取PCIeBAR(linuxreadpciebar)
新聞來(lái)源:http://www.5511xx.com/article/djpgcie.html