为什么没有访问端口0xCF8?

时间:2015-11-11 09:38:54

标签: c++ linux gdb pci

我使用ubuntu作为Virtual Box(虚拟机)中的操作系统。我的目标是列出使用c ++代码可以在系统中找到的所有pci设备。以下是其中的一部分:

#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 个答案:

答案 0 :(得分:3)

来自Ubuntu reference for these types of functions

  

使用ioperm(2)或iopl(2)告诉内核   允许用户空间应用程序访问I / O端口   题。 如果不这样做,将导致应用程序接收   分段错误

(强调我的)

因此,您必须为程序设置适当的权限,以防止出现分段错误。

详细了解如何设置低级别端口访问权限here