Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Чтение базового адреса памяти пространства PCI устройства  (Прочитано 13723 раз)
0 Пользователей и 1 Гость смотрят эту тему.
O d d y
Гость
« : 16-09-2003 09:38 » 

Помогите правильно интерпретировать базовый адрес памяти B0003000h, на котрый отображается пространство регистров устройства.

Сначала приведу часть кода для чтения регистров PCI устройства:
IDEAL
P386
LOCALS
MODEL MEDIUM

SEGMENT sseg para stack 'STACK'
DB 400h DUP(?)
ENDS

DATASEG
VendorID      DW ? ;идентификатор изготовителя
DeviceID      DW ? ;идентификатор устройства
ClassCode     DD ? ;тип устройства
BaseAddress0  DD ? ;базовый адрес 0
BaseAddress1  DD ? ;базовый адрес 1
BaseAddress2  DD ? ;базовый адрес 2
BaseAddress3  DD ? ;базовый адрес 3
BaseAddress4  DD ? ;базовый адрес 4
BaseAddress5  DD ? ;базовый адрес 5
InterruptLine DB ? ;номер используемого прерывания IRQ
BusNumber     DB ? ;номер шины
DeviceNumber  DB ? ;номер устройства и номер функции
NoPCI  DB 12,18,"Система не поддерживает PCI USB",0
NoUSB DB 12,23,"Контроллер USB не найден",0
BadReg DB 12,28,"Неверный номер регистра",0
ENDS

CODESEG
;****************CUT**********************
PROC PCITest
; Опрос PCI-устройств
; Проверить наличие PCI BIOS
        mov     AX,0B101h
        int     1Ah
        jc      @@PCIBIOSNotFound
        cmp     EDX,20494350h
        jne     @@PCIBIOSNotFound
; Найти USB контроллер
        mov     AX,0B103h
        mov     ECX,0C0310h
        mov     SI,0
        int     1Ah
        jc      @@DeviceNotFound
        mov     [BusNumber],BH
        mov     [DeviceNumber],BL
; Получить идентификатор изготовителя
        mov     AX,0B109h ;читать слово
        mov     DI,0      ;смещение слова
        int     1Ah
        jc      @@BadRegisterNumber
        mov     [VendorID],CX
; Получить идентификатор устройства
        mov     AX,0B109h ;читать слово
        mov     DI,2      ;смещение слова
        int     1Ah
        jc      @@BadRegisterNumber
        mov     [DeviceID],CX
; Получить тип устройства
        mov     AX,0B10Ah ;читать двойное слово
        mov     DI,8      ;смещение слова
        int     1Ah
        jc      @@BadRegisterNumber
        shr     ECX,8
        mov     [ClassCode],ECX
; Получить базовый адрес 0
        mov     AX,0B10Ah ;читать двойное слово
        mov     DI,10h    ;смещение слова
        int     1Ah
        jc      @@BadRegisterNumber
        mov     [BaseAddress0],ECX
; Получить базовый адрес 1
        mov     AX,0B10Ah ;читать двойное слово
        mov     DI,14h    ;смещение слова
        int     1Ah
        jc      @@BadRegisterNumber
        mov     [BaseAddress1],ECX
; Получить базовый адрес 2
        mov     AX,0B10Ah ;читать двойное слово
        mov     DI,18h    ;смещение слова
        int     1Ah
        jc      @@BadRegisterNumber
        mov     [BaseAddress2],ECX
; Получить базовый адрес 3
        mov     AX,0B10Ah ;читать двойное слово
        mov     DI,1Ch    ;смещение слова
        int     1Ah
        jc      @@BadRegisterNumber
        mov     [BaseAddress3],ECX
; Получить базовый адрес 4
        mov     AX,0B10Ah ;читать двойное слово
        mov     DI,20h    ;смещение слова
        int     1Ah
        jc      @@BadRegisterNumber
        mov     [BaseAddress4],ECX
; Получить базовый адрес 5
        mov     AX,0B10Ah ;читать двойное слово
        mov     DI,24h    ;смещение слова
        int     1Ah
        jc      @@BadRegisterNumber
        mov     [BaseAddress5],ECX

; Получить номер используемого устройством
; прерывания IRQ
        mov     AX,0B108h ;читать байт
        mov     DI,3Ch    ;смещение байта
        int     1Ah
        jc      @@BadRegisterNumber
        mov     [InterruptLine],CL

; *************************CUT******************
@@BadRegisterNumber:
@@DeviceNotFound:
@@PCIBIOSNotFound:

ENDP PCITest
ENDS

END

;***************Результат***************************
;
;BusNumber     00h
;DeviceNumber  13h
;VendorID      0E11h
;DeviceID      A0F8h
;ClassCode     0C0310h
;BaseAddress0  00h
;BaseAddress1  00h
;BaseAddress2  00h
;BaseAddress3  00h
;BaseAddress4  B0003000h  ! Я шокирован!
;BaseAddress5  00h
;InterruptLine 09h
;
;*********************************************

; * pointer = getbaseptr(BaseAddress4);
;   IOSpace = pointer;

(BaseAddress4 specifies upper 20 bits of the 32 bit starting base adress.
This represents a maximum of 4-KB addressing space for the operation registers)

По адресу BaseAddress4 должен находиться  Revision register и,
как сказано в спецификации, всегда должен иметь значение 00000010h,
но при чтении линейного базового адреса IOSpace выводятся какие-то левые коды.
Пожалуйста!
Помогите правильно интерпретировать базовый адрес памяти B0003000h,
промучился с ним уже черти сколько и не знаю, как до него достучаться.
  Ха-ха-ха
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 16-09-2003 11:08 » 

Нужно переключиться в защищенный режим - из реального этот адрес недоступен.
При обращении из реального DS:ESI=0000h:0B0003000h получится DS*16+ESI&0xffff = 03000h
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Anonymous
Гость
« Ответ #2 : 16-09-2003 13:23 » 

А что если использовать линейную адресацию, не переходя в защищенный режим, т.е. если отменить предел сегмента GS?
Ведь можно изменить содержимое теневого регистра GS разрешить линейную адресацию через него 4 Gb памяти в реальном режиме.
Или в данном случае этот адрес можно описывать только в дескрипторе для GDTR, а при прямой линейной адресации он не будет совпадать?

P.S. Вообще-то я пробовал через GS обращатся по этому адресу, но там одни FF Жаль  Надеюсь, что просто сделал что-то не правильно, иначе придется лезть в защищенный режим в котором я не гу-гу. Молчу
Записан
o d d y
Гость
« Ответ #3 : 16-09-2003 13:24 » 

ЗЫ предыдущее сообщение - мое
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 16-09-2003 13:51 » 

Как ты будешь изменять теневой GS, если в реальном режиме ты не можешь этого сделать? - в этом случае в него записывается не из GDT/LDT, а фиксированные значения. Из реального режима ты никак не можешь обратится за пределы 0..0x10FFEF (0xFFFF0 + 0xFFFF) - так уж задумано.
Воспользуйся любым dos-extender-ом (dos4g[w],dos32, и т.п.).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimitry
Гость
« Ответ #5 : 21-09-2003 04:53 » 

Можно и из реального. Это недокументированная возможность. Нужно сделать следующее: открыть линию A20, переключиться в защищённый режим, изменить GS(Поставить ему предел 4Gb), после чего вернуться в RM. Далее при записи в GS уже в реальном режиме будут меняться база, а предел останется 4Gb. Пишем в GS 0(уже в RM) и обращаемся GS:[EDI] по линейному адресу!
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 21-09-2003 18:06 » new

Интересная вешь. Полистал доку - ни чего не документорованного здесь нет - после переключения PM->RM теневая часть не меняется. А вот использовать 4Г сегмент в RM ни где не предлогали, но и не запрещали (что важнее).

Если мы переключимся в PM, то и прочитать можно оттуда сразу...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines