Написание загрузочного сектора CD

Тема в разделе "WASM.ASSEMBLER", создана пользователем hakerkirik, 24 июл 2008.

  1. hakerkirik

    hakerkirik New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2005
    Сообщения:
    28
    Ситуация такова. Мне надо представить прогу в виде загрузчика, т.е. влепить ее в загрузочные сектора CD. Прога, по ходу своей работы, обращается к файлам на CD, которые имеют объем около 3 МБ.
    И у меня возникло несколько вопросов:
    1) Сколько реально секторов считывает BIOS с диска в ОЗУ? Экспериментальным путем выснил, что больше чем 512 или 2048 байт. Просто, сама прога будет занимать около 10 КБ.
    2) Каким путем мне прочитать файлы, которые находятся на диске?
    3) Во многих доках читал, что, необходимо перемещать загрузчик (если его часть находиться на дискете) "повыше" в ОЗУ, т.е. где-то по адресу 1000h. А зачем? Почему не грузить его сразу после главного загрузчика, т.е. в 7E00h?
    Пока все вопросы.
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    1) Указывается. Читаем specscdrom.pdf.
    2) Через BIOS int 13h
    3) Это твое дело, MS так ниже грузит. Перемещают чтобы можно было загрузить загрузочный сектор с другого раздела по адрессу 7с00h
     
  3. hakerkirik

    hakerkirik New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2005
    Сообщения:
    28
    Спасибо за ответ. А можно подробнее по поводу вопроса № 1... Я почитал ту доку. Но есть сомнения, то ли я нашел :)
    Мне нужно создать на CD некий Booting Catalog, тобишь загрузочный каталог, который будет содержать, кроме всего прочего, кол-во загружаемых секторов в память.
    А вот как его создать? И можно ли прописать его прямо в проге, т.е. записываю я свой бу-сектор, а в нем по такому-то смещению этот самый каталог.
    Объясните, пожалуйста.
     
  4. hakerkirik

    hakerkirik New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2005
    Сообщения:
    28
    Хм, это случайно не опция, которая в Неро называется "Число загрузочных секторов" при выборе DVD-Boot? Если так, то тогда всё понятно.
    Да, и еще одно. Где должна стоять метка 0АА55h в случае, если загрузчик будет иметь размер больше 2048 байт?
     
  5. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    1) теоретически 0xFFFF 512-байтных секторов. Реально - сколько уместится в базовую память. Число этих секторов как раз определяется соотв. опцией Nero.
    2) уже ответили + знание CDFS.
    3) не совсем понял. Но загрузчик или его часть нужно перемещать только в том случае, когда он занимает то место, где должен находиться вновь загружаемый код. Например, мой CD-загрузчик имеет размер 2 Кб и загружается BIOS по физ. адресу 0x7C00. Однако файл, который загружает этот загрузчик, должен быть загружен по физ. адресу 0x8000, поэтому прежде чем выполнить загрузку файла, я перемещаю вторую половину загрузчика размером 1 Кб.

    По последнему вопросу: для повышения совместимомости я размещаю сигнатуру и под границей 512 байт, и под границей 2 Кб. В твоем случае я бы разместил сигнатуру еще и в конце загрузчика, сколько бы секторов он не занимал.
     
  6. hakerkirik

    hakerkirik New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2005
    Сообщения:
    28
    Phantom_84, спасибо. С сигнатурами разобрался.
    Возникла еще одна проблема. Дело в том, что загрузчик по ходу своей работы должен грузануть ОС Виндовс, т.е., как я понял, мне надо его переместить, из 0000:7C00 по адресу, скажем 1000:0000. Но вот возникла некоторая сложность. Ведь у меня в начале загрузчика стоит ORG 7C00h, и когда я перемещаю свой загрузчик по адресу 1000:0000, то на самом деле все адреса, джампы и т.п. будут иметь смещение не 0000 а 7C00h, т.е. 1000:7C00. Как мне это дело исправить?
     
  7. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Как ты собрался грузить Винды и откуда?

    По вопросу:
    Код (Text):
    1. org 0x7C00
    2. ; здесь перещаешь
    3. jmp 0x1000:0
    4. relimagebase: org 0
    5. ; перемещаемая часть
    6. relimagesize=$
    7. org relimagebase+relimagesize ; восстанавливаем физ. адресацию
    8. rb 0x83FE-$
    9. dw 0xAA55
    Это только пример. Кроме того, ты должен учитывать, что CD-загрузчик обычно стартует по адресу 0x7C0:0. Хотя я не полагаюсь на это и сразу делаю jmp 0:physaddr. Мне так комфортнее, но это не обязательно, так как данные ты можешь адресовать в сегменте с нулевой базой, а в коде использовать только команды передачи управления, использующие относительную адресацию.
     
  8. hakerkirik

    hakerkirik New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2005
    Сообщения:
    28
    Ну, винду буду грузить с харда. Там тоже через 7С00 получается.
    По поводу кода. Зачем нужна вот эта строчка?
    Код (Text):
    1. org relimagebase+relimagesize ; восстанавливаем физ. адресацию
     
  9. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    дальше идет настройка размера бинарника с помощью rb, а там используется адресация относительно 0x7C00, определенного первым org'ом. "Эта строчка" не является обязательной, просто без нее rb будет выглядеть сложнее, чем просто rb 0x83FE-$.
     
  10. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Кстати чтобы грузить Винды с харда, не обязательно выполнять перемещение CD-загрузчика, т.к. и MBR-загрузчик, и загрузчик раздела изначально всегда имеют размер 512 байт, а CD-загрузчик практически всегда больше 512 байт, поэтому ты можешь загрузить загрузчик жесткого диска поверх первых 512-байт CD-загрузчика. В моем случае выполнять перемещение тоже было не обязательно - в "затираемой" части можно разместить инициализационный код, который бы уже отработал к моменту загрузки файла.
     
  11. hakerkirik

    hakerkirik New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2005
    Сообщения:
    28
    Phantom_84, спасибо, учту.