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

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

  1. progos

    progos New Member

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

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

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

    diamond New Member

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

    progos New Member

    Публикаций:
    0
    Благодарю.
    То, что нужно.

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

    Pavia Well-Known Member

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

    Phantom_84 New Member

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

    Phantom_84 New Member

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

    Phantom_84 New Member

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

    progos New Member

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

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

    Phantom_84 New Member

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

    progos New Member

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

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

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

    Y_Mur Active Member

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

    Phantom_84 New Member

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

    Pavia Well-Known Member

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

    Pavia Well-Known Member

    Публикаций:
    0
    Это зависит от корявости разроботчиков. BIOS может и не увидить. Лично мой код и без перемычки видет диски.
     
  15. Phantom_84

    Phantom_84 New Member

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

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