Определить загрузочный жесткий диск

Тема в разделе "WASM.OS.DEVEL", создана пользователем progos, 21 окт 2008.

  1. progos

    progos New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    4
    Вот, собственно, возник такой вопрос.
    БИОС запускает лоадер с устройства, которое он каким-либо образом определил подходящим для загрузки (неважно каким).
    Для того, чтобы считать сектора именно с этого устройства(с которого загружен бут-сектор), можно вызвать int 13h, передав в DL (0х80).

    А как определить Primary/Secondary шину и Master/Slave именно этого жесткого диска, для дальнейшей работы, скажем, через ATA PIO?
    Или как определить, какое это устройство из PCI?

    Заранее спасибо.
     
  2. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Функция 48h прерывания 13h (в возращаемой структуре, называемой DPTE).
    http://www.phoenix.com/NR/rdonlyres/19FEBD17-DB40-413C-A0B1-1F3F560E222F/0/specsedd30.pdf
    (либо справочник Ральфа Брауна)
     
  3. progos

    progos New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    4
    Благодарю.
    То, что нужно.

    А насколько эта вещь используется ОС'ями?
    Есть ли альтернативы?
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    progos
    Если учесть что это спецификация 96года, то до нее явно использовалось что-то другое. Вернее до нее был бардак.
     
  5. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Я лично использую, а для флоппика просто проверяю последний задействованный (не раскрученный!) дисковод, т.к. в большинстве вариантов BIOS реализация опции swap floppy выполнена именно за счет смены номеров дисководов из-за того, что загружаемые ОС часто считают номер загрузочного дисковода равным 0x00, но почему-то никак не 0x01. Хотя это не очень-то и актуально, но тем не менее. Раньше видимо все было просто, каналы определялись по номерам 0x80, 0x81, 0x82, 0x83, но только для жестких дисков, или вообще загрузочным мог быть только "первый" диск. Если номер "слишком большой", то скорее всего это оптический диск, причем опять-таки самый первый. В этом плане ситуация и сейчас не сильно-то изменилась.
     
  6. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Кстати, неверно считать, что загрузочный диск всегда имеет номер 0x80. Еще сравнительно недавно можно было встретить ситуации, когда BIOS делает все правильно, а mbr-загрузчик, будучи загруженным с диска 0x81, пытается продолжить загрузку с диска 0x80.
     
  7. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Да, чтобы окончательно все было понятно, 0x81 - это secondary master. И лишь когда secondary master не обнаружен, но обнаружен primary slave, можно сделать предположение, что c этим номером BIOS связал именно его.
     
  8. progos

    progos New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    4
    Phantom_84
    Хмм... в принципе да, но не совсем.
    Если поставить приоритет загрузки для, скажем, secondary slave, то именно он будет поставлен на 0х80.
    А если BIOS не посчитает его загрузочным, и пойдет дальше (некоторые BIOS дальше первого винчестера вообще не проверяют), то тогда возможно и будет другой номер.
    Хотя кто знает:)

    Кстати, загрузчик WinXP ориентируется на загрузку с 0х80 (если это прописано в mbr).
    Надо посмотреть, откуда себя продолжают грузить linux'овые лоадеры.
     
  9. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Ну мастер без слэйва может быть вообще не виден. Я когда-то специально разбирался с этим вопросом. В результате пришел к выводу, что для BIOS порядок дисков таков: primary-master/secondary-master/primary-slave/secondary-slave, а номера присваиваются последовательно для найденных устройств именно в данном порядке. Кроме того BIOS предоставляла выбор загрузочного диска только из двух возможных даже при наличии 4 дисков. Я лично моделировал ситуацию, когда загрузочный диск был под номером 0x81. Сейчас ситуация немного другая, но зато появились новые средства для определения загрузочного диска. Про mbr-загрузчик WinXP мне не рассказывай, мой предпоследний пост в значительной степени относился именно к нему. Он примитивен - это факт. Его создатели не долго думая решили, зачем обременять его чрезмерной логикой, если всю эту логику можно запихнуть в ntldr, только им видимо фантазии не хватило, чтобы представить ситуации, при которых проблемой может оказаться загрузка самого ntldr'а.
     
  10. progos

    progos New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    4
    Да я и не спорю, что он примитивен.
    Но согласись, что большинство производителей ориентируется именно на microsoft.
    Следовательно, на деле все это дело будет работать в большинстве случаев.
    Хотя, конечно же, лучше все сделать по умному, чем ориентироваться на это.

    Большое спасибо всем за ответы.

    *Ушел разбираться с правильными bootloader'ами*
     
  11. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Это лечится установкой перемычек на самом диске - сделано чтобы согласовать нагруженность шины одним/двумя девайсами.
     
  12. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Y_Mur, это понятно, кстати, я опечатался - конечно я хотел сказать: "слэйв без мастера".
     
  13. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Phantom_84
    Там собственно проблем нету. MBR грузит с первичного диска ntldr. Первичный диск это то на котором MBR код передает BIOS при загрузке, ntldr грузится при помощи прерываний биоса. А дальше в загрузчике просто прописан диск с которого грузить OS. Не важно в каком формате важно, что он грубо определяет номер диска и его контроллер канал. Собственно не мучуются с определением а просто прописали код.
     
  14. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Это зависит от корявости разроботчиков. BIOS может и не увидить. Лично мой код и без перемычки видет диски.
     
  15. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Как работает ntldr и как в boot.ini описываются физические диски и разделы, я в курсе. Я как раз и говорю, что mbr-загрузчик, загружающий ntldr, способен загрузить его тоько с первичного раздела.

    Это хорошо, но если BIOS не сделает диск видимым, он по определению не может быть загрузочным.