2015-11-11 45 views
-2

我使用Ubuntu作爲Virtual Box(虛擬機)中的操作系統。我的目標是列出使用C++代碼可以在系統中找到的所有pci設備。下面是它的一部分:爲什麼沒有訪問端口0xCF8?

#include <stdio.h> 
#include <string.h> 
#include <sys/io.h> 
#include <stdlib.h> 
#define NOT_SPECIFIED "Not specified" 

int main() 
{ 
    int i, busid, devid; 
    FILE * file = fopen("Pcibits.txt", "w+"); 
    for (busid = 0; busid < 256; busid++) 
    { 
     for (devid = 0; devid < 32; devid++) 
     { 
      unsigned int recvp, ven_id, dev_id, clid; 
      unsigned int sendp = (busid << 16) | (devid << 11) | ((unsigned int)0x80000000); 
      outl(sendp, 0x0CF8); 
      recvp = inl(0x0CFC); 
      char* str = new char[32]; 
      sprintf(str, "%d", recvp); 
      fwrite(str, sizeof(char), sizeof(str)/sizeof(char), file); 
      fclose(file); 
     } 
    } 
    return 0; 
}` 

但是用gdb我,像這樣的錯誤的鬥爭:

Traceback (most recent call last): File "/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19-gdb.py", line 63, in <module> 
    from libstdcxx.v6.printers import register_libstdcxx_printers 
ImportError: No module named 'libstdcxx' 

Program received signal SIGSEGV, Segmentation fault. 
0x000000000040075a in outl (__value=2256549650, __port=3320) 
    at /usr/include/x86_64-linux-gnu/sys/io.h:125 
125 __asm__ __volatile__ ("outl %0,%w1": :"a" (__value), "Nd" (__port)); 

有什麼不對呢?當我意識到程序失敗了。 請幫忙!)

+1

,*而不是[使用操作系統的功能](https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci)*? – DevSolar

回答

3

Ubuntu reference for these types of functions

您使用ioperm(2),或者IOPL(2)告訴內核 允許用戶空間應用程序訪問 問題的I/O端口。 未能執行此操作將導致應用程序收到 分段錯誤

(重點煤礦)

所以,你必須設定適當的許可程序,以避免分段錯誤。

查看更多關於如何如果你有Ubuntu的一個操作系統,爲什麼你想通過直接訪問硬件來解決操作系統設置低級別端口的訪問權限here

相關問題