Я использую Ubuntu в качестве ОС в Virtual Box (виртуальная машина). И моя цель — перечислить все устройства 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));
Что с этим не так? Как я понимаю, программа терпит неудачу на последнем шаге.
Пожалуйста помоги!)
От Справочник по Ubuntu для этих типов функций.
Вы используете ioperm (2) или iopl (2), чтобы сообщить ядру
разрешить приложению пользовательского пространства получать доступ к портам ввода-вывода в
вопрос. Если этого не сделать, приложение получит
ошибка сегментации.
(Акцент мой)
Таким образом, вы должны установить правильное разрешение для вашей программы, чтобы предотвратить ошибку сегментации.
Подробнее о том, как установить разрешения доступа к низкоуровневому порту Вот
Других решений пока нет …