Здравствуйте. Перечитал кучу ссылок и литературы на васме, осдев.вики но так и не достиг ясности. Мне надо разобраться с этим вопросом в приложении к 1 конкретной машине. Приведу описание известных данных о манише: 1. Южный мост ICH8 2. Сата контроллер висит на B01fh:F2 3. Приведу что мне выдала программа PCI DUMP: Bus 00 Device 1f Function 02 Vendor: 8086 Intel Corporation Device: 2820 82801H (ICH8 Family) 4 port SATA IDE Controller Revision: 02 Device class: 01 Mass Storage Device subclass: 01 Device subvendor: 103c Device subsystem: 2801 Base Address 0: 00001108 I/O Base Address 1: 00001118 I/O Base Address 2: 00001110 I/O Base Address 3: 0000111c I/O Base Address 4: 000010e0 I/O Base Address 5: 000010f0 I/O Interrupt line: 05 Interrupt pin: 02 INT#B Min_Gnt: 00 MaxLat: 00 Cache line size: 00 Latency timer: 00 Header type: 00 BIST: 00 I/O: 1 Mem: 1 BusMast: 1 Special: 0 MemInv: 0 4. А теперь из моих наблюдений: а. В матплате всего 3 SATA порта и 1 PATA(IDE) б. программа поиска IDE HDD находит саташный хард на 1 канале, 0 диск (хард подключен 1) в. при попытке поиграть настройками BIOS винда загружает только в режиме эмуляции IDE. Вроде все отметил, что вспомню допишу или если нужны дополнительные данные, пишите, постораюсь ответить. В связи со всем выше перечисленным возникают вопросы: 1. Что за значения в барах? 2. Всегда ли харды будут видеться на портах иде? 3. Как правильнее обращаться к харду?
Базовые адреса в пространстве портов в/в. А дальше смотри спецификацию на PCI IDE или Datasheet на ICH8 Не не всегда если выбрать RAID или AHCI. То будут седеть на портах RAID и AHCI. А да про какие порты IDE речь устаревшие или родные? А как неправильно? Я считаю что в Линуксе идет правильное обращение.
На днях затрагивали этот вопрос. 4-портовый контроллер в IDE-режиме эмулирует два канала по два диска. В AHCI-режиме IDE не видно вообще. Если ты ставил винду в IDE-режиме, то в AHCI-режиме она уже не запустится. В IDE-режиме естественно можно использовать режим совместимости и естественный PCI IDE-режим, причем на разных каналах может быть по-разному, хотя не уверен, что это можно контролировать в BIOS Setup. BIOS Setup обычно просто предлагает три возможных режима работы SATA - AHCI, естественный PCI IDE-режим и режим совместимости для 4 портов (если портов больше, то дополнительные будут работать уже в естественном режиме). Какие значения в барах AHCI-контроллера, я не знаю. Читай соответствующую спецификацию. Могу рассказать только про PCI IDE.
Ну в биос есть раздел SATA Emulation и там всего 2 значения IDE и RAID, но винду на рейд я точно не ставил)) а про AHCI там ни слова. То есть у меня будт харды на IDE портах?
Это унаследованные(устаревшие) порты IDE. Они не обязаны быть в системе. Вначале читаешь из BAR'ов смотришь что там лежит. Если нули, то это значит что данное устройство использует особые порты. Если нули то используешь унаследованные порты 1f0 и тд. А вот если не нули, то пользуешcя значение из BAR'ов. А да. Первые 4 BAR'а могут быть 0. А вот 5 отвечающий за Bus Mastering при этом будет не нулевым. Ну его лучше использовать так как тебе будет доступен UDMA.
почитай книгу: "Интерфейсы устройств хранения:ATA, SATA и другие" М. Гук там очень хорошо и почти все написано.
На самом деле нужно использовать байт программного интерфейса: установленный бит 0/2 - естественный режим для 1/2 канала (адреса регистров берутся из баров), установленный старший бит - возможность использовать блок BMI-регистров.
Phantom_84 вся проблема в том что перестали писать нормальные книги. нам повезло мы успели попасть в то время когда все писали и про все. а сейчас нормальную книгу по ассемблеру не купишь, если есть то хуже и тоньше чем старая. а цены вообще поражают почти под косарь за книгу... уже несколько лет как ассемблер 64бита поддерживает и не одной книги. только документация и словарь англо-русский.
1) В BAR'ах обычно адреса портов пишутся. 2) Не всегда. 3) Работать с устройством надо через порты, указанные в BAR'ах. Приведи для SATA/IDE контроллеров дамп из Евереста (прогоню этот дамп через свой парсер).
Байт программного интерфейса - младший байт в коде класса. Блок BMI-регистров используется для обмена данными через DMA. Адрес блока хранится в конфигурационном пространстве по смещению 0x20 при условии, что старший бит байта программного интерфейса установлен. Например, когда байт программного интерфейса равен 0x80, для обоих каналов действует режим совместимости (используются стандартные адреса для первого/второго канала - 0x1F0-0x1F7, 3F6h/0x170-0x177, 376h) и имеется возможность использовать блок BMI-регистров. Если ты используешь PIO-обмен, то последний блок тебе без надобности. Остается только определить, нужно ли использовать стандартные адреса командных и управляющих регистров или их следует брать из баров.
Ну я сдампил нужные значения: 08h: 02 8a 01 01 то есть получается что SATA эмулирует IDE и надо искать на портах IDE?
08h: 02 8a 01 01 Code (Text): +------------+-------------+-------------+--------------+---+ |31 24|23 16|15 8|7 0| № | +------------+-------------+-------------+--------------+---+ +------------+-------------+-------------+--------------+---+ | Class Code |Revision ID | 08| +------------+-------------+-------------+--------------+---+ Class Code=01018a Class Code (Код класса) –он описывает типе устройства состоит из трех частей Code (Text): +---------------+--------------+---------------------+ |23 16|15 8|7 0| +---------------+--------------+---------------------+ |Base Class Code|Sub Class Code|Programming Interface| +---------------+--------------+---------------------+ Base Class Code – базовый класс сокращенно BCC. Sub Class Code - под класс сокращенно SCC. Programming Interface – интерфейс сокращенно PI. Class Code следующий 0101xxh. это IDE контролер(или SATA который эмулирует IDE) Code (Text): +---+---+---+----------------------------------------+ |BCC|SCC|PI | Тип | +---+---+---+----------------------------------------+ |01h|00h|00h|SCSI контролер | + +---+---+----------------------------------------+ | |01h|xxh|IDE контролер смотри рисунок | + +---+---+----------------------------------------+ | |02h|00h|Контролер гибких дисков | + +---+---+----------------------------------------+ | |03h|00h|IPI контролер | + +---+---+----------------------------------------+ | |04h|00h|RAID контролер | + +---+---+----------------------------------------+ | |05h|00h| | + +---+---+----------------------------------------+ | |06h|01h|SATA контролер | + +---+---+----------------------------------------+ | |80h|00h|Устройство массовой памяти другого типа | +---+---+---+----------------------------------------+ Надо сказать, что Programming Interface (PI) имеет сложную структуру. Code (Text): +----+------+----------+----------------------------+ |Бит | Тип | Значение | Описание | +----+------+----------+----------------------------+ | 7 | RO | 1 | Bus Master | +----+------+----------+----------------------------+ |6:4 | RO | 0 | Зарезервировано | +----+------+----------+----------------------------+ | | | | Поддерживаемый тип | | 3 | RO | 1/0 | вторичного канала | | | | | 1-поддерживаются оба типа | | | | | 0-поддерживаются один тип | +----+------+----------+----------------------------+ | | | | Установленный режим | | 2 | RW/RO| 1/0 | вторичного канала | | | | | родной /усторевший | +----+------+----------+----------------------------+ | | | | Поддерживаемый тип | | 1 | RO | 1/0 | первичного канала | | | | | 1-поддерживаются оба типа | | | | | 0-поддерживаются один тип | +----+------+----------+----------------------------+ | 0 | RW/RO| 1/0 | Режим первичного канала | | | | | родной /усторевший | +----+------+----------+----------------------------+ Смотрим у нас PI=8Ah=10001010b Bus Master стоит бит 1. Это значит что устройство поддерживает захват шины PCI или другими словами оно у нас поддерживает DMA PCI. Когда контроллер сам пишет в память компьютера или читает из неё. Также это означает что в 5 BAR регистре PCI лежит базовый адрес Bus Master Base Address. Его можно, я бы даже сказал нужно задействовать. 3 и 1 бит говорят что контроллер поддерживает 2 режима устаревший и родной на обоих каналах. А вот 2 и 0 бит сброшены в 0 говорят о том, что выбран устаревший режим на обоих каналах. Если контролер находиться в устаревшем режиме, то для доступа к каналам используется используются следующие порты: Первичный канал: порты команд 01F0h-01F7h Порт контроля 03F4h+2 прерывание IRQ14 Вторичный канал: порты команд 0170h-0177h порт контроля 0374h+2 прерывание IRQ15 У порта контроля базовым считается адрес 03F4h. А сам регистр находиться по смещению +2. Если бы в PI биты 0 и 2ой были 1, то он бы работал в родном режиме PCI IDE. Если контролер находиться в родном режиме, то соответствующие порты читаются из конфигурационного пространства PCI. Code (Text): +-------+---------+-------------------------------------------------+ |10h-13h| PCMD_BAR| Primary Command Block Base Address | | | | Базовый адрес портов команд первичного канала | +-------+---------+-------------------------------------------------+ |14h-17h| PCNL_BAR| Primary Control Block Base Address | | | | Базовый адрес порта контроля первичного канала | +-------+---------+-------------------------------------------------+ |18h-1Bh| SCMD_BAR| Secondary Command Block Base Address | | | | Базовый адрес портов команд вторичного канала | +-------+---------+-------------------------------------------------+ |1Ch-1Fh| SCNL_BAR| Secondary Control Block Base Address | | | | Базовый адрес порта контроля вторичного канала | +-------+---------+-------------------------------------------------+ |20h-23h| BM_BASE | Bus Master Base Address | | | | Базовый адрес регистров для режима захвата шины | +-------+---------+-------------------------------------------------+