Снова про MBR: загрузка с USB/CD

Тема в разделе "WASM.NT.KERNEL", создана пользователем SunGod, 20 сен 2009.

  1. SunGod

    SunGod New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2009
    Сообщения:
    23
    Добрый день.
    Я гуглил по вопросу сабжа, но увы нагуглил только обрывочные сведенья, хотя вопрос тут уже формулировали.

    Вопрос такого рода: в биосе выставлена загрузка с некоторого носителя - НЕ с харда: USB-флешка, CD-ROM дисковода, флопика, наконец.
    Биос грузит с этого устройства код загрузчика, первые 512 байт и передает ему управление.
    Я прочел пару тем здесь, на этом форуме - пришли к выводу что номер диска для INT 13h биос кладет в DL, более того, что он хардам присваивает заранее известные номера, 80 - тому с которого грузят, например.

    Но это касалось хардов. Не подскажете, как обстоят дела с флешками, сидиромами и флоппи?

    То есть предположим я разместил код загрузчика в первых 512 байтах флешки. Биос поддерживает загрузку с флешки. Как из загрузчика работать с ее содержимым? Насколько я знаю, биос флешку представляет как хард, значит можно при помощи INT13? Как быть с "геометрией", ведь у флешки нет секторов.
    И главное - какой, все же, номер передавать в интеррапт при загрузке с флешки, какой - с флоппи, и какой - при загрузки с CD.

    Заранее благодарен.
     
  2. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    SunGod

    Просто попробуй все подряд: 0,1... 80h,81h... Каким-то и прочтешь свой же сектор - so you have found it -?
     
  3. SunGod

    SunGod New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2009
    Сообщения:
    23
    Мда, не лучший выход)
    Однако, я уже нагуглил ответ, кажется......
    Меня смутило то что в эмуляторе (бокс) при загрузке с флоппи в DL был 00, и я решил что для флоппи туда ничего не передается =)
    Цитирую одну статью:

    То есть то что там был 00 это не опровержение правила, подтверждение =/
    Осталось как нибудь проверить что там будет при работе с USB-флешкой и CD.

    А все же, если с флешкой работать тем же 13м интерраптом, то как быть с геометрий, подскажите - это мне кажется каким то нелогичным действием - вычислять адрес в несуществующей геометрии, чтобы потом код биоса его обратно привел к обычному адресу во флешке.

    P.S. Что то не вижу кнопки "редактировать", здесь есть возможность отредактировать свое сообщение?
     
  4. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    El Torito Bootable CD-ROM Format Specification:
     
  5. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    у int 13 есть функция GetDeviceParameters, которая тебе для чего хочешь вернет и количество секторов и др параметры.
     
  6. SunGod

    SunGod New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2009
    Сообщения:
    23
    reverser
    Очень ценная информация, спасибо!

    max7C4
    То есть ко флешке все таки обращаться как к харду? Ну, грубо говоря, биос при ините выбирает геометрию для эмулируемого "харда", и мне надо в инт13 передавать адреса в формате CHS (или в каком?).

    Или же при работе с флешкой ИНТ13 может принять параметры с учетом того что обращаюсь я все таки к флешке - допустим, обычные смещения от начала в регистрах, вместо цилиндров и прочего?
     
  7. Quatre_R_Winner

    Quatre_R_Winner Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    66
    1. Хоть загрузочный сектор и размещается по физическому адресу 07C00h управление не всегда передаётся по виртуальному адресу 0000h:7C00h. На некоторых биосах адрес может быть 07C0h:0000h что неправильно, но факт. Особенно этот глюк любит выскакивать при эмуляции с CD и это следует учитывать.
    2. В DL и правда передаётся номер загрузочного диска, НО не на всех биосах это происходит всегда. В частности этот способ вообще определён только для загрузки с CD как с эмуляцией так и без, но при загрузки в винтов, флопиков и флэшек этот способ может не прокатить.
    3. Флэшка эмулируется в зависимости от режима в биосе (USB-HDD или USB-FDD если есть) или от наличия MBR (почитай таблицы разделов) - тоесть либо 00h для эмуляции как флоп или 80h при эмуляции как винт и на DL закладыватся не стоит (знаем - обжигались)
    4.Есть EDD функции 13h прерывания биоса которые работают с LBA адресами, но опять же глюк - буквально 3 дня назад наткнулся на мать, которая при запуске с флэхи через старые функции (<40h) видела флэшку а через EDD (>40h) видела винт. Тоесть с флэхой стоит работать старыми функциями или писать универсальный вариант.

    А вообще стоит покурить маны:
    EDD - BIOS Enhanced Disk Drive Specification
    и уже предложенный El Torito

    А ещё приходится собирать инфу о глюках,ибо ,к сожелению, в компьютерах редко что работает как надо, тк биосописатели не любят придерживаться стандартов. К примеру полностью реализованного El Torito, да ещё и без багов мною не замечено.
     
  8. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    248
    Я считывал с флешки функцией 42h прерывания 13h (LBA чтение(все секторы пронумерованы от 0 до последнего сектора по порядку (сектор 512 байт)))
    Читай статью Криса "MBR своими руками"
    Код (Text):
    1. ;с первого диска(флешка должна быть выставлена 1ой)
    2. mov dl,80h
    3. lea si,[lba]
    4. ;читаем
    5. mov ah,42h
    6. int 13h
    7. ;если ошибка, то выводим сообщение об ошибке
    8. jc error
    9. ;структура для LBA чтения
    10. lba:
    11. ; +----------------------------------------------------------------------------------+
    12. ; | СМЕЩЕНИЕ   ТИП                         НАЗНАЧЕНИЕ                                |
    13. ; |                                                                                  |
    14. ; |   00h     byte                      размер структуры                             |
    15. ; |   01h     byte                      зарезервировано                              |
    16. ; |   02h     word                   сколько секторов читать                         |
    17. ; |   04h     dword        адрес буфера в формате сегмент(word):смещение(word)       |
    18. ; |   08h     qword             стартовый номер сектора для чтения                   |
    19. ; |   10h     qword  хвост 64 битного адреса (используется при 32х битном FFFF:FFFF) |
    20. ; +----------------------------------------------------------------------------------+
    21. db 10h
    22. db 00h
    23. dw 01h
    24. dd 00008600h
    25. dq 01h
    26. dq 00h
    В результате 2й сектор с флешки (1й-MBR) будет считан по адресу в памяти 0000:8600h
     
  9. Quatre_R_Winner

    Quatre_R_Winner Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    66
    Дополнение для вноса ясности:
    Старые функции (AH<40h) 13h прерывания работают только через CHS адресацию независимо от типа носителя.
    EDD функции (AH>40h) 13h прерывания работают только с LBA адресами. При этом они не могут работать с флопиками, но могут работать с CD и флэш (последнее не на всех биосах).
    При этом в любом случае CD доступно только одно - то с которого происходит загрузка, а все остальные только через порты или дрова. И то если только загрузка с CD. А вот с флэш ситуация зависит от биоса. Может видеть все, а может только загрузочную.
    П.С. Редактирование вроде отменили.
     
  10. SunGod

    SunGod New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2009
    Сообщения:
    23
    Большое спасибо за ответы, буду читать и эксперементировать.
    Да, такой вопрос - допустим, я копирую код начального загрузчика из мбр по адресу 00600.
    Во всех примерах что я видел, сегментные регистры ставят в 0000.
    Могу я поставить, допустим, CS = 60, чтобы работать со смещениями относительно начала моего кода сразу? Или тут какой то принципиальное, скрытое пока от меня, ограничение?

    ИМХО так удобнее, CS = 60 => CS:0000 = 600, можно сразу работать в своем сегменте...
     
  11. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    делай что хочешь. за тобой ни кто не наблюдает. можешь хоть хард форматнуть, хоть проц повесить.
     
  12. Quatre_R_Winner

    Quatre_R_Winner Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    66
    Просто с CS=0000h удобнее, хотя бы потому что сразу можно обращаться к данным биос по 400h.
    На счёт
    да кто вам такое сказал?
     
  13. SunGod

    SunGod New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2009
    Сообщения:
    23
    Может не совсем точно выразился - у флешки нет механических ограничений - у харда они же обусловлены все таки его конструкцией... Я скорее имел в виду цилиндры/головки, а не просто разбиение памяти на блоки.
     
  14. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    У харда давно эти данные ничего общего с реальной геометрией не имеют.
     
  15. Quatre_R_Winner

    Quatre_R_Winner Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    66
    Pavia прав. С реальной геометрией эти цифры уже ничего общего не имею. Сам факт геометрии эмулируется для совместимости и без него нельзя. Для старых функций геометрия всё равно нужна ибо без неё нельзя потом пересчитать CHS в LBA.
     
  16. SunGod

    SunGod New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2009
    Сообщения:
    23
    Эх, опять совместимость... Как можно жить в этом жестоком мире, где проц последней модели до сих пор совместим с самым первым 8086 =/

    Не знал. Ну ладно, цилиндры так цилиндры, попробую пообщаться с флешкой через 13й интеррапт, всем большое спасибо!
     
  17. linkmaze

    linkmaze New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2007
    Сообщения:
    60
    Может быть поможет. Загрузочную Флэшку я делал копируя загрузочный сектор с загрузочной дискеты, но не весь а только код загрузчика (т.е. первые два байта и начиная с того адреса куда указывает jmp до конца сектора), данные о структуре диска и о разделах оставлял те которые были на флэшке после форматирования (флэшка 2GB,форматируется в FAT и только в FAT т.к. с другой файловой системой загрузчик с дискеты не разберется).
    Если плюс ко всему скопировать все файлы с дискеты то после всех этих манипуляций при загрузке с флэшки загружалась DOS.
     
  18. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    linkmaze
    садист и мазахист
    не проще было нормально взять загрузчик с FAT32 партишина
    да и FAT12 вроде бы не тянет 2 Гб. У нее же вроде бы ограничения ок 64 Мб
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    linkmaze
    Хм, а как загрузчик с дискеты (где FAT12) читал без запинок таблицу размещения файлов флешки, которая скорее всего отформатирована в FAT32? Хотя он мог её и не трогать, если там загрузчик читает только первый сектор файла, который записан в directory entry.
    Но все равно лучше было взять с раздела fat32 или нагуглить:)
     
  20. linkmaze

    linkmaze New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2007
    Сообщения:
    60
    Что под руками было с того и делал. А флэшка точно отформатирована в фат и также точно работала.