Как определить активный hdd ?

Тема в разделе "WASM.OS.DEVEL", создана пользователем JucED, 12 фев 2011.

  1. JucED

    JucED New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2010
    Сообщения:
    23
    Здравствуйте, примерно год назад уже задавал этот вопрос здесь (Как определить активный hdd ?) мне сказали использовать Get drive parameters (ah 48h, int 13h). Но вот в vmware у меня эта функция не работала.
    Есть ли другой способ? При чем желательно и для sata.
     
  2. JucED

    JucED New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2010
    Сообщения:
    23
    может есть какие служебные адреса памяти в которых хранится вся эта информация? или из cmosa их вытащить можно?
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Что значит активный HDD?
     
  4. JucED

    JucED New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2010
    Сообщения:
    23
    ну тобишь тот, с которого будет происходить загрузка ОС.
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    JucED
    При загрузке в dl передается код для int 13h.
     
  6. JucED

    JucED New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2010
    Сообщения:
    23
    Да я не о том)) Мне нужно определить где диск находится физически (master\slave....).
     
  7. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    JucED
    Как сделано в виндоусе. Все просто при установки ОС в файл Boot.ini записывается на какой диск была поставлена ОС.
    В линуксе нечто подобное.
     
  8. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    У SATA вообще нету Master/Slave - там ты что хочешь узнать?
     
  9. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    cppasm
    SATA с точки зрения программиста имеет интерфейс аналогичный АТА.
    Встречаются SATA контроллеры которые держат только мастер. А есть и те которые и мастер и слейв.

    Так что физически у SATA нет Master/Slave. А вот программно Master/Slave как раз таки есть, но не во всех контроллерах.
     
  10. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Они есть только в режиме эмуляции ATA (IDE).
    В режиме Native SATA (AHCI) нету там Master/Slave.
     
  11. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Расскажи поподробнее. Лично я работаю с SATA-дисками через обычный PCI IDE-интерфейс. Pavia прав, четырехпортовые контроллеры держат мастер/слейв на обоих каналах, двухпортовые - только мастер на двух каналах. Автору в принципе не нужно знать про "Native SATA", если он не собирается через него работать. Основная цель связать номер загрузочного диска BIOS с его физическим размещением, чтобы можно было к нему обращаться напрямую, по прежнему как к загрузочному устройству. Я как раз использую подобное связывание. Сразу хочу сказать, что действительно основным средством является функция 48h, но далеко не единственным. Можно например давать команды через BIOS, а потом анализировать, отразились ли эти команды на состоянии регистров устройств, и если да, то каких именно. Один товарищ на буржуйском форуме даже предлагал в качестве одной из проверок на соответствие сравнивать записанные/прочитанные данные. Но я конечно до такого маразма опускаться не собираюсь и вам не советую. Одно могу сказать, это вполне реализуемо. О совершенствовании метода идентификации загрузочного диска (не только PATA/SATA харда) готов разговаривать с заинтересованными людьми.
     
  12. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    А что вы скажете про 6 и 8 портовые? :)
    Если для SATA контроллера в BIOS стоит режим ATA/IDE - то да, всё как обычно, программируется через I/O он аналогично ATA.
    А если выставлен режим AHCI (родной режим для SATA контроллера), он через I/O программируется совсем по другому, и там нет вообще понятий Master, Slave и т.д.
    На уровне BIOS (int 13h) различий в работе с ними нету, но если координаты диска нужны для прямой работы с ним - то работать с ATA и SATA надо совсем по-разному.
     
  13. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Аналогично :)
    Так кто спорит. Но повторяю, суть вопроса не в этом. И то, о чем говорю я, и то, о чем говорите вы, - это все уровень прямого взаимодействия с аппаратурой. Если автор готов работать с диском в AHCI-режиме, пусть выставляет соответствующую опцию в BIOS Setup, ищет на шине соответствующий контроллер и работает с ним. Функция 48h поддерживает интерфейс "SATA". Если нет поддержки в конкретной реализации EDD, можно использовать дополнительные методы проверки на соответствие, о чем я говорил ранее. Если я введу поддержку AHCI на уровне драйверов, может, расширю и процедуру поиска загрузочного устройства среди устройств, работающих в AHCI-режиме. Пока в этом просто нет смысла. К тому же, если устройство будет идентифицироваться через функцию 48h, мне и добавлять ничего не нужно, т.к. дисковые драйверы для каждого устройства возвращают во многом аналогичную по формату структуру, что и функция 48h, - ядро в процессе поиска лишь выполняет побитовое сравнение всей структуры. SATA-устройства на контроллере нумеруются последовательно. Функция 48h поддерживает в том числе и мультиплекс.
     
  14. JucED

    JucED New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2010
    Сообщения:
    23
    Я вот тоже пробовал такие способы как отправка всяких разных команд диску, и если приходил ответ - устройство присутствует, а вот с поиском активного (того, который 0) посложнее получается, уже даже начинал делать самодельный mbr в котором приоритеты загрузки берутся не из bios, а прописаны в самом mbr. Вообще есть проект файловой системы, сейчас вот сижу вспоминаю как все эти дела программируются, а то забросил на целый год... Осталось только в PM до конца все вспомнить и начну реализовывать)
     
  15. JucED

    JucED New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2010
    Сообщения:
    23
    Вот смотри - пишу я к примеру свой mbr, если мне нужен активный диск (нулевой) я пишу в al 80h (насколько я помню 80h или 0). А если я не могу использовать int13h т.к. перехожу в защищенный режим, тогда мне нужно знать адреса портов именно того диска, на котором находится этот самый mbr, я находил только такие выходы:
    1) зная где висит мой IDE туда и обращался, но если я воткну диск в другой шлейф то этот mbr работать не будет.
    2) самый смешной - прога в mbr спрашивает у пользователя где висит диск))))))
    3) перед переходом в PM считывал mbr с активного диска средствами int 13h, менял сигнатуру на 00AAh, потом считывал со всех дисков mbr не используя int13h (через порты), и там, где сигнатура изменена на 00AAh диск активный. Сохранял адреса портов этого диска и дальше понеслось поехало...
     
  16. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    JucED
    Запиши уникальный код его и ещи. К примеру в качестве уникального можно взять label a partition который создает fdisk
     
  17. JucED

    JucED New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2010
    Сообщения:
    23
    Нене, так не получится, я же все делаю с нуля, отбрось все существующие ос и mbr. Тогда можно вытаскивать серийный номер диска (не тома, а диска), но это опять же int13h функция 48h которая не фурычит у меня на vmware.....

    А еще вопрос не по теме - можно ли изменять tss0 ? А то у меня идея такая: сперва mbr запускает так сказать ядро ФС, оно переводит процессор в PM, грузит все модули файловой системы (она у меня модульная), настраивает idt .... И получится что tss0 это будет вот это так называемое ядро ФС и получится что операционная система будет не главное задачей. А так если изменить tss0 то можно его перестроить на ядро ОС....

    И еще: кому надо - могу выложить неплохой учебник по ассемблеру, там подробненько рассказывается про защищенный режим + много листингов с пояснениями. Авторы П. И. Рудаков, К. Г. Финогенов, ЯЗЫК АССЕМБЛЕРА: УРОКИ ПРОГРАММИРОВАНИЯ. Хотя наверное он уже у всех есть))
     
  18. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Всё получится. Вы что не можете radom создать? Использовать функцию запись и чтения с диска?
    Через int 13h функция 02h, читаете 5 сектор(для примера) в котором лежит уникальный ID диска.
    Переходим в защищенный читаем чрез порты 5 сектор с дисков сравниваем.

    Конечно можно.
    Это ни как несвязанные вещи.
     
  19. JucED

    JucED New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2010
    Сообщения:
    23
    Это получится что-то вроде того, о чем я писал:
    Такой загрузчик будет абсолютно независим от установленных в биос приоритетов, приоритеты загрузки можно будет хранить в самом mbr. Такое то я уже делал.
    Спасибо за ответы, буду еще раз пробовать дергать функцию 48h.
     
  20. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    0 - это не то (хотя там тоже много нюансов). Не нужно забывать, что при отсутствии активного раздела на первом в цепочке загрузочных устройств диске номер действительно загрузочного диска может отличаться от 80h, что не учитывают многие MBR-загрузчики.

    Во многих ОС так и делается - прописывается какое-нибудь обобщенное имя загрузочного диска непосредственно на диске, а когда ты захочешь подсоединить его к другому разъему, нужно предварительно отредактировать это имя ))) И еще не факт, что после этого все заработает нормально. Тебе нужно передавать номер загрузочного диска BIOS из первичного загрузчика вторичному загрузчику или ядру, которые бы по этому номеру средствами реального режима строили обобщенную структуру (или имя, но это будет хуже), которая бы и использовалась для идентификации загрузочного устройства в защищенном режиме. Запоминать порты - это менее универсальный путь, хотя когда функция 48h дает неполную информацию, приходится в реальном режиме и поиск на PCI выполнять и порты сравнивать.