Вы находитесь на странице: 1из 10

Министерство образования Республики Беларусь

Учреждение образования

БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ

Факультет компьютерного проектирования

Кафедра инженерной психологии и эргономики

Дисциплина: интерфейсы информационных систем

Индивидуальная практическая работа №1

ИЗУЧЕНИЕ РАБОТЫ ЛОКАЛЬНОЙ ШИНЫ PCI.

Студент гр. 710901: Мешкова М.Ю.

Проверял: Силиков Н.И.

2020
Цель
Изучить способы адресации устройств PCI. Отработать метод oпроса, идентификации и
конфигурирования устройств. Составить структурную и функциональную схемы идентификации
периферийных устройств (по указанию преподавателя).

Теоретическая часть:
1)Для чего предназначена шина PCI? Какова ее роль в архитектуре современного ПК?
PCI (Peripheral Component Interconnect) – шина соединения периферийных компонентов, является
основной шиной расширения современных компьютеров.
Поначалу шина PCI вводилась как пристройка (mezzanine bus) к системам с основной шиной ISA,
став позже центральной шиной: она соединяется с системной шиной процессора
высокопроизводительным мостом (северным), входящим в состав чипсета системной платы.
2)Каковы основные характеристики шины PCI?
Шина является синхронной — фиксация всех сигналов выполняется по положительному перепаду
(фронту) сигнала CLK. Номинальнойчастотой синхронизации считается 33 МГц; начиная с
версии 2.1, допускается повышение частоты до 66 МГц при поддержке всех устройств на шине
(режимPCI-66). Номинальная разрядность шины данных — 32 бита, спецификация определяет
возможность расширения разрядности до 64 бит. При частоте шины 33 МГц
теоретическаяпропускная способность достигает 132 Мбайт/с для32-битнойшины и 264
Мбайт/с для64-битной;при частоте синхронизации 66 МГц – 264 и 528 соответственно.
3)Что такое устройство PCI?
С устройствами PCI процессор может взаимодействовать командами обращения к памяти
(MOV и т.д.) и портамввода-вывода(IN/OUT), адресованным к областям, выделенным каждому
такому устройству при конфигурировании. Устройства могут вырабатывать запросы
маскируемых и немаскируемых прерываний.
4)Каким образом выполняется доступ к устройству PCI со стороны центрального процессора?
Мосты электрически отделяют интерфейсные сигналы одной шины от другой, соединяя их
логически; главный мост соединяет главную шину с ядром системы (процессором и памятью).
Каждая шина имеет свойномер шины (PCI bus number). Шины нумеруются последовательно;
главная шина имеет нулевой номер.
5)Поддерживают ли устройства PCI обмен по механизму DMA?
Понятия каналов DMA для шины PCI нет, но агент шины может сам выступать в роли
задатчика, поддерживая высокопроизводительный обмен с памятью (и не только) и не занимая
ресурсов центрального процессора.
6)Для чего устройства PCI должны поддерживать возможность перемещения ресурсов в пределах
общего пространства памяти и ввода-вывода?
и перемещать все занимаемые ресурсы в пределах доступного пространства адресации. Это
позволяет обеспечивать бесконфликтное распределение ресурсов для многих устройств
(функций). Для управления устройствами рекомендуется вместо портовввода-выводапо
возможности использовать ячейки памяти
7)Отображается ли конфигурационное пространство устройств PCI на общее пространство памяти
и ввода-вывода?
Одно и то же функциональное устройство может быть сконфигурировано по-
разному,отображая свои регистры либо на пространство памяти, либо на пространствоввода-
вывода.Драйвер может определить текущую настройку, прочитав содержимое регистра
базового адреса устройства. Драйвер также может определить и номер запроса прерывания,
который используется устройством.
8)Какой программный механизм позволяет провести конфигурирование устройств?
В стандарт PCI заложены возможности автоматического конфигурирования системных
ресурсов (пространств памяти и ввода-выводаи линий запроса прерываний). Автоматическое
конфигурирование устройств (выбор адресов и прерываний) поддерживается средствами BIOS и
ориентировано на технологию PnP. Стандарт PCI определяет для каждого слота
конфигурационное пространство размером до 256 регистров(8-битных),не приписанных ни к
пространству памяти, ни к пространствуввода-вывода.Доступ к ним осуществляется по
специальным циклам шины
9)Какие поля имеются в конфигурационном пространстве устройств PCI?
Конфигурационное пространство устройства начинается со стандартного заголовка, в котором
содержатся идентификаторы производителя, устройстваи его класса, а также описание требуемых
и занимаемых системных ресурсов.
После заголовка могут располагаться регистры, специфичные для устройства; они могут занимать
адреса конфигурационного пространства в пределах 40-FFh.
Перечисленные ниже поля идентификации допускают только чтение.
Device ID – идентификатор устройства, назначаемый производителем.
Vendor ID – идентификатор производителя микросхемы PCI, назначенный PCI SIG.
Идентификатор 0xFFFF является недопустимым; это значение должно возвращаться
при чтении конфигурационного пространства несуществующего устройства.
Revision ID – версия продукта, назначенная производителем. Используется как
расширение поля Device ID.
Header Type – тип заголовка (биты 6:0), определяющий формат ячеек в диапазоне 0x10-
0x3Fи несущий признак многофункционального устройства (если бит 7=1). На рисунке
приведен формат заголовка типа 0, относящийся именно к устройствам PCI. Тип 01
относится к мостамPCI-PCI;тип 02 относится к мостам шины CardBus.
Class Code — код класса, определяющий основную функцию устройства, а иногда и его
программный интерфейс. Старший байт (адрес 0x0B) определяет базовый класс,
средний — подкласс, младший — программный интерфейс (если он стандартизован).
10)В каких случаях необходимо обращение к устройствам PCI с помощью конфигурационного
цикла и географической адресации?
Часто для слотов используются убывающие номера устройств, начиная с 20. Группы соседних
слотов могут подключаться к разным шинам; на каждой шине PCI нумерация устройств
независимая (могут быть и устройства с совпадающими номерами dev, но разными номерами
шин). Устройства PCI, интегрированные в системную плату, используют ту же систему
адресации. Их номера «запаяны намертво», в то время как адреса карт расширения можно
изменять перестановкой их в разные слоты. Одна карта PCI может содержать только одно
устройство шины, к которой она подключается, поскольку ей в слоте выделяется только одна
линия IDSEL. Если на карте размещают несколько устройств (например,4-портоваякарта
Ethernet), то на ней приходится устанавливать мост
Исходный код программы

1) «pci_c_header.h
typedef struct _PCI_VENTABLE
{
unsigned short VenId ;
char * VenShort ;
char * VenFull ;
} PCI_VENTABLE, *PPCI_VENTABLE ;
//Непольный список вендоров!!!!!!!!!
PCI_VENTABLE PciVenTable [] =
{
{ 0x0033, "", "Paradyne Corp." } ,
{ 0x003D, "well", "master" } ,
……
};
// Use this value for loop control during searching:
#define PCI_CLASSCODETABLE_LEN
(sizeof(PciClassCodeTable)/sizeof(PCI_CLASSCODETABLE))

char * PciCommandFlags [] =
{
"I/O Access",
"Memory Access",
"Bus Mastering",
"Special Cycles",
"Memory Write & Invalidate",
"Palette Snoop",
"Parity Errors",
"Wait Cycles",
"System Errors",
"Fast Back-To-Back",
"Reserved 10",
"Reserved 11",
"Reserved 12",
"Reserved 13",
"Reserved 14",
"Reserved 15"
};

// Use this value for loop control during searching:


#define PCI_COMMANDFLAGS_LEN (sizeof(PciCommandFlags)/sizeof(char *))

char * PciStatusFlags [] =
{
"Reserved 0",
"Reserved 1",
"Reserved 2",
"Reserved 3",
"Reserved 4",
"66 MHz Capable",
"User-Defined Features",
"Fast Back-To-Back",
"Data Parity Reported",
"",
"",
"Signalled Target Abort",
"Received Target Abort",
"Received Master Abort",
"Signalled System Error",
"Detected Parity Error"
};

// Use this value for loop control during searching:


#define PCI_STATUSFLAGS_LEN (sizeof(PciStatusFlags)/sizeof(char *))
char * PciDevSelFlags [] =
{
"Fast Devsel Speed", // TypeC
"Medium Devsel Speed", // TypeB
"Slow Devsel Speed", // TypeA
"Reserved 9&10"
};

// Use this value for loop control during searching:


#define PCI_DEVSELFLAGS_LEN (sizeof(PciDevSelFlags)/sizeof(char *))

2) «main.cpp»:
#include "pci_c_header.h"
#include <iostream>
#include <Windows.h>
#include <tchar.h>
#include <iostream>

using namespace std;

char* getVendorName(int ven_id) {


for (int i = 0; i < PCI_VENTABLE_LEN; i++) {
if (ven_id == PciVenTable[i].VenId) {
return PciVenTable[i].VenFull;
}

}
}

int getRes(int i, int j, int k, int r) {


int res = 0;
int res1 = 0x80000000;
res1 += i << 16;
res1 += j << 11;
res1 += k << 8;
res1 += r << 2;
//printf("%d\n", res1);
//system("pause");
_asm
{
mov dx, 0CF8h
mov EAX, res1
out dx, EAX
mov dx, 0CFCh
in eax, dx
mov res, eax
}
return res;
}

char* getDeviceName(int ven_id, int device_id) {


for (int i = 0; i < PCI_DEVTABLE_LEN; i++) {
if ((ven_id == PciDevTable[i].VenId) && (device_id == PciDevTable[i].DevId)) {
return PciDevTable[i].ChipDesc;
}

}
return "Undefined";
}

void printClassInfo(int baseclass, int subclass, int proginf){


//printf("%d | %d | %d\n", baseclass, subclass, proginf);
for (int i = 0; i < PCI_CLASSCODETABLE_LEN; i++) {
if((PciClassCodeTable[i].BaseClass == baseclass) &&
(PciClassCodeTable[i].SubClass == subclass) &&
(PciClassCodeTable[i].ProgIf == proginf)) {

char *bclass = PciClassCodeTable[i].BaseDesc;


//printf("%d %d %d\n", baseclass, subclass, proginf);
char *sclass = PciClassCodeTable[i].SubDesc;
char *pinf = PciClassCodeTable[i].ProgDesc;
char* result = new char[strlen(bclass) + strlen(sclass) + strlen(pinf) + 1];
printf("%s %s %s\n", bclass, sclass, pinf);
return;
}
}
}

int main() {
//printf("Es8Eee\n");
char *format_body =
"---------------------------------------\
\n%d:%d:%d\nVendor ID: %#0x | %s \nDevice ID: %#0x | %s\n";

HANDLE h = CreateFileA("\\\\.\\giveio", GENERIC_READ, 0, NULL,


OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (h == INVALID_HANDLE_VALUE) {
printf("Couldn't access GIVEIO driver\n");
printf("GIVEIO driver must be loaded first\n");
system("pause");
return -1;
}

int device, vendor;


for (int i = 0; i < 256; i++) {
//printf("%d\n", i);
for (int j = 0; j < 32; j++) {
//printf("%d\n", j);
for (int k = 0; k < 8; k++) {
//printf("%d\n", k);
int res = getRes(i,j,k,0);
device = res >> 16;
vendor = res & 65535;
if(vendor != 65535){
//printf("Bus number: %d | Device number: %d
printf(format_body, i,j,k,vendor,getVendorName(vendor), device,
getDeviceName(vendor, device));
int res2 = getRes(i,j,k,0x3);
int header = (res >> 16) & 255;
if (header != 0){
int res3 = getRes(i,j,k, 0x2);
int classcode = res3 >> 8;
int progif = classcode & 255;
classcode = classcode >> 8;
int subclass = classcode & 255;
classcode = classcode >> 8;
int basicclass = classcode & 255;
printClassInfo(basicclass, subclass, progif);

int res4 = getRes(i,j,k, 7);


int iobase = res4 & 255;
int iolimit = (res4 >> 8) & 255;
printf("I/O Base: %d; I/O Limit: %d\n", iobase, iolimit);

int res5 = getRes(i,j,k,15);


int interruptpin = (res5 >> 8) && 255;
char *outstr;
switch(interruptpin){
case 0:
outstr = "Not used";break;
case 1:
outstr = "INTA#";break;
case 2:
outstr = "INTB#"; break;
case 3:
outstr = "INTC#";break;
default:
outstr = "RESERVED#";break;
}
printf("Interrupt Pin: %s\n", outstr);
} } } }}
system("pause");
}

Как результат работу программы:

-------------------------
0:0:0
Vendor ID: 10DE Nvidia Corp
Device ID: 01E0 Realtek AC'97 Audio
-------------------------
0:0:1
Vendor ID: 10DE Nvidia Corp
Device ID: 01EB nForce2 Memory Controller
….
Вывод
В ходе выполнения практического задания была разработана программа для опроса и
идентификации устройств PCI. Были изучены основные функциональные особенности методы
работы PCI.

Вам также может понравиться