Всем привет ! Из программы на ассемблере необходимо прочитать сектор HDD подключенного через SATA интерфейс. Пожалуйста, дайте ссылочку на литературу, или подскажите, через какие порты можно получить доступ к жесткому диску. Заранее благодарен
dess Читай википедию. http://wiki.osdev.ru/index.php/%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D0%B6%D0%B5%D1%81%D1%82%D0%BA%D0%B8%D0%BC%D0%B8_%D0%B4%D0%B8%D1%81%D0%BA%D0%B0%D0%BC%D0%B8_%D0%B8_%D0%B8%D1%85_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%D0%B0%D0%BC%D0%B8
...Не обязательно через порты, тем более, если существуют другие, более простые способы. Просто я думал, что порты - единственная возможность "поговорить" с хардом Сейчас пытаюсь прочитать сектор через хитрый LBA48, по совету wiki от Pavia, правда не совсем успешно - возвращается сектор заполненый кодом 07Fh, видимо я пока что-то не так делаю. Когда смогу достучаться до wiki.osdev.ru, обязательно гляну исходничек.
dess Что касается LBA48 то эмуляторы его плохо поддерживают. Борщ до определенного момента не поддерживал, но бит о его наличии возрощался. Квими тоже самое. Но борщ в последних версиях исправился и сделал поддержку LBA48(не проверял). VMWare вроде корректно эмулирует. С жесткими можно пообщаться также используя Int 13h функции с намирами от 40h. Называется BIOS Enhanced Disk Drive Services (EDD)
Боюсь, что доступ к функциям возможен только из реального режима, а доступ к харду должен осуществляться из защищенного режима. Если я правильно понял, то после начальной загрузки компьютера SATAвский Хард должен видеться через стандартные порты 1F0h, 170h (и так далее), но как от него получить данные я так и не понял.
dess SATA контроллер никому ничего не должен. Порты 1F0h, 170h будут если включен легасити режим. Настраивается в Биосе. Чтобы не мучиться у меня приведен код по поиску контроллера и считывания их портов. Это не так уж и трудно. Данные получаются при помощи посылки команд и четения через порт данных.
Partner К сожалению фишка в том, что код выполняется в защищенном режиме микропроцессора, а там, боюсь, таких "сладостей" нет Возможно там существуют сладости в виде ROM с 32-битным кодом, но я пока не в курсе.
Да-да-да-да-да..... Как раз сейчас я его и штудирую, спасибо за ссылочку ! Видимо пришло время разобраться с PCI, больно много на нем устройств завязано =) И тогда откроются двери в мир чудес... Короче, думаю оттуда я и дастану харды !
Нет никакой разницы. Этот способ работает в любом режиме. Единственная разница, что в кернел моде вместо CreateFile нужно вызывать NtCtreateFile.
Partner Это здорово, но опять-таки, kernel на столько самопальный, что пока-что не понимает таких вещей, как: CreateFile и NtCreateFile. Здесь, видимо, речь идет о некоторой стандартной операционке, которая специально обучена таким приёмам. В моём же случае всё только зарождается
Partner видимо нет. чел похоже свою ось пишет dess Ну так почему-бы не посмотреть на какой-нить уже существующий несложный пример. Их много. Каждый предложит свой. Я, например, предложу глянуть ядро план9 или инферно. Очень много полезного можно вытянуть из ядра линуха. Есть и другие открытые ядра (миних, кунх), концепции. Имхо писать свою ось имеет смысл только при наличии очень оригинальной и действительно стоящей концепции, иначе проще доработать или просто воспользоваться уже существующей. таково мое имхо
Браво !!! В самую точку ! Громко конечно сказано: "пишет свою ось", не ось, пока, а, так, недоразумение Но мне интересна тема написания осей, поэтому я экспериментирую, пытаюсь разобраться. Вот, для полного счастья не хватает жесткого общения с диском, ...простите, с жёстким диском общения. Короче сектора прочитать надо с HDD с SATA-вским интерфейсом. С ATA-вским разобрался, так компьютер сгорел. Не успел насладиться Так-что это не Виндовс, точно. А план9 и иже с ними я обязательно гляну на днях, если найду и разбирусь в сырцах. Концепции пока нет. Но я думаю, что что-нибудь придумаю Благодарю за совет !
dess Если с ATA разобрался, то с SATA разберешься быстро. SATA он эмулирует ATA. Просто многии не знают что у ATA есть режим Native. Суть в том что в режим Native - контроллер имеет другии порты, их нужно считать из PCI CFG и все. SATA Может работать в режиме Native ATA(порты надо считывать), Legacete ATA (порты известны 1F0h, 170h ). И третий режим SATA compatablety - совместимый, суть в том что порты 1F0h, 170h но диски перемешанны вместе SATA и PATA(ATA). При определении наличия дисков столкнулся с проблеммами пришлось городить трех уровневую систему проверки. Обноружились различия между SATA и ATA. Есть еще ACHI - так называемый настоящий SATA, но тут все подругому.
Уже неделю пытаюсь разобраться в теме, но пока безуспешно. С ATA разобрался быстро, благодаря Дзеновским исходникам, а вот SATA - блин - еще тот геморой... Уже и в PCI разобрался, и порты родные вытащил, и в БИОСе режимы менял, а всё одно, происходит ошибка таймаута выполнения команды или готовности данных. Причем исходники Кулакова из "Программирование на аппаратном уровне" прекрасно работают. А вот под себя переделать их не удается. А ведь цепочка проста: запрещаем прерывания, ожидаем освобождения канала, выбираем устройство, ожидаем готовность устройства, загружаем адрес, посылаем команду, ожидаем её выполнение, ожидаем готовность данных, читаем их и разрешаем прерывания !!! И всё !!! Но видимо в какой то момент я что-то не так делаю, возможно самую малость и в результате - таймаут.
dess SATA соблюдает стандарт ATA, но повидения их различается. Есть такая вещь как готовность устройства и готовность данных. Может быть данные не готовы, но устройство может принемать команды. С этим надо быть внимательно. Недостаточно проверки одного бита надо проверять нужные. Попробуй после тайм аута считать данне. Если слова одинаковые, то команда не выполнилась. Можешь код показать посмотим что нетак.