Boot Manager

Тема в разделе "WASM.BEGINNERS", создана пользователем Seraph, 30 дек 2006.

  1. Seraph

    Seraph New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2006
    Сообщения:
    5
    Необходимо написать Менеджер загрузки ОС. У меня уже есть некоторый код, но сильно сомневаюсь в его полезности и универсальности. И есть ряд вопросов по смежным темам.

    1) Собственно, сам код. Есть ли у кого-то есть элементарные примеры загрузчиков? Так сказать, для детей с отставанием в развитии. Пока мой загрузчик ограничивается перезаписью MBR, поэтому и примеры нужны подобного уровня.

    2) CHS и LBA. Не могу сказать, что присматривался во время переразбиений диска к таблицам, но формат LBA видел частенько, а вот CHS не припомню. Как часто таблицы записываются в CHS, и соответственно стоит ли включать в код загрузчика чтение в режиме CHS?

    3)Как из-под WinNT/2k/XP произвести перезапись MBR? У меня есть вариант с вызовом CreateFile() с "\\.\PHYSICALDRIVE0" в качестве имени файла. Есть ли другие удобные варианты?

    4)Можно ли писать побайтно или по одному слову? В случае с сектором как минимальной единицей записи возникает проблема затирания таблиц разделов: надо считать MBR, править код загрузки, записывать обратно. А в случае с секторами можно было бы перезаписать область MBR до таблицы и все.

    5)Совсем ламерский )) При трансляции компилятор создает *.com или *.exe файлы, но для MBR никакие надстройки не нужны. Какими ключами объяснить транслятору, что мне нужны машинные инструкции моих мнемоник и только они?

    P.S. Одним словом, вопросов много, много подводных (для меня) камней, а времени мало.
     
  2. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    ниче себе beginners...

    1) см. аттач
    писал давно, ничего не помню
    не знаю, насколько он элементарный, все равно других нет

    2) *пожатие плечами*
    у меня вроде CHS

    3) ничего приемлемого, кроме CreateFile, не знаю

    4) Магнитные харды устроены так, что работают как минимум с секторами (а на самом деле, скорее всего, с еще более крупными единицами, просто предоставляют интерфейс для секторов). Кроме того, протокол IDE, насколько я понимаю, тоже не позволяет передавать пакеты данных размером меньше 512. В любом случае, при записи байта через "\\.\PHYSICALDRIVE0" будет считан весь сектор, исправлен и перезаписан целиком. Возможно, существуют и исключения, точно не знаю. Только это, по-моему, лишние опасения: если таблица разделов не будет затерта в памяти, она либо запишется без изменений, либо не запишется вообще.

    5) com - это и есть bin, разница заключается толко в том, что линкер требует, чтобы смещение первого байта программы равнялось 100h. Так что, это смещение необходимо будет учитывать при обращении к переменным.
    Другой вариант - создавать exe и вырезать бинарный код с помощью exe2bin.

    ps: no warranty, естественно
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    2. В таблице разделов в любом случае хранятся параметры разделов и в LBA и в CHS. Если параметры раздела нельзя представить в формате CHS, то в соответствующих полях хранится максимальное значение для той трансляции, которая использовалась при разметке. В принципе, можно использовать только LBA, т.к. сейчас трудно найти BIOS, который не поддерживает LBA вызовы (CHS адресация позволяет адресовать макс. около 8 GiB), но хорошего тона ради неплохо бы иметь оба метода чтения.

    Я у себя сделал так: при инициализации в переменной сохраняется адрес ф-ии CHS чтения. Если BIOS умеет делать LBA вызовы, то он заменяется на адрес ф-ии LBA чтения. В ф-ии CHS чтения есть проверка, находится ли запрошенный на чтение сектор в "зоне досягаемости", и если нет, то выводится соответствующее сообщение об ошибке. Все вызовы ф-ии чтения сектора производятся косвенно по адресу в этой переменной.

    4. Речь идет об инсталляции загрузчика, как я понимаю? Меньше сектора, я думаю, никак не запишешь, поэтому читаешь сектор с MBR, копируешь свой код (первые 446 байт) и пишешь обратно.

    Про подводные камни: если загрузчик позволяет выбрать раздел, с которого будет происходить загрузка, то необходимо выставлять флаг активности для того раздела, загрузку с которого выбрал пользователь, иначе ОС потом не разберется, на каком разделе они живет.
     
  4. Seraph

    Seraph New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2006
    Сообщения:
    5
    Это для какого асма? Я так понимаю, megadeth.bin - оттранслированный рабочий код для mbr?

    А как тогда, пардон, читать и редактировать исходную ГЗЗ? Мне раньше нужно было только записывать в сектора, поэтому кроме CreateFile() ничего не использовал. Хочу попробовать непосредственно поставить твой mbr и сначала редактировать и тестить на виртуальной машине его, а уже потом править свой.

    В смысле для выбранного раздела 80h поставить в первый байт? А что насчет записи в реестре с "родным" для ОСи диском, разве Win не оттуда узнает имя своего диска? И аналогично для остальных. ?

    Еще раз P.S. про выбор раздела: вот тот код, который есть у меня. Даже как-то стыдно теперь показывать...
    Код (Text):
    1. use16
    2. ORG 7C00h
    3. CLD                    ; Copy from left to right (addresses are growing)
    4. MOV SI,7C00h           ; Source location
    5. MOV DI,7E00h           ; Target location
    6. MOV CX,200h            ; Sector length
    7. REP MOVSB              ; Copy
    8.  
    9. MOV SI, 1BEh           ; Go to the first partition
    10. MOV AX, CS             ; Set ES
    11. MOV ES, AX             ;
    12. MOV BX, buf            ; Buffer offset
    13. read_all_partitions:
    14.         MOV AX, 0201h             ; Read sector 1 from the disk
    15.         MOV DL, 80h               ; Read from the first disk
    16.         MOV DH, [SI+1]            ; Starting head number
    17.         MOV CX, [SI+2]            ; Starting sector and cylinder
    18.         INT 13h
    19.         JC error                  ; Read error
    20.  
    21.         CMP byte [SI], 80h
    22.         JZ LOAD_BOOT              ; This is a boot partition
    23.                                           ; Pass control to it
    24.  
    25.         ADD SI, 10h               ; Go to the next partition
    26.         CMP SI, 1EEh
    27.         JNA read_all_partitions   ; Read all partitions one by one
    28. ;show "no active partition" message and break
    29. load_boot:
    30. buf rb 512             ; 512-byte buffer
    31. JMP 0000:7C000h        ; Pass control to the boot sector
     
  5. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    x86?
    если я сам правильно сейчас понимаю, что тогда написал, bin - это откомиленный MEGADETH.OPC

    кажется, я неудачно выразился.. в смысле, пиши спокойно mbr и не беспокойся о таблице разделов
    насчет поставить мой mbr..
    эта штуковина работает следующим образом: в сектора 5 и 6 (считая с единицы) записываются исходные MBR, между которыми нужно сделать выбор. Если первый байт в секторе 4 равен 0, загружается mbr из сектора 5, иначе - 6. Затем в загруженный mbr (в памяти) копируется таблица разделов. Если при загрузке зажат ctrl+alt, используется другой mbr. Если ctrl+alt+shift, пользователю будет предложен выбор. Так что в сами разделы я не лезу..
    инсталляция, естественно, руками )

    гм.. это mbr?
    а зачем джамп в конце?
     
  6. Seraph

    Seraph New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2006
    Сообщения:
    5
    Нет, я в плане синтаксиса: tasm, masm, fasm, nasm...

    На boot-sector, который замещает в памяти mbr. У меня же пока только первичный загрузчик. Разве нет? )

    Я мануал почитал, не понял как раз этот момент: Если записывается сектор с твоей ГЗЗ, то исходная, как я понимаю затирается (в том числе и 1be-1fe, в данном случае нулями). У тебя сначала срабатывает свой код: грузить старую ГЗЗ или эту твою, после чего управление передается на сектор 0:0:1 или 0:0:Х по выбору пользователя. Так?

    Тогда несколько другой вопрос: что конкретно нужно сделать с этим бинарником? То есть куда его записать? Был бы бесконечно признателен за код после вызова CreateFile:
    Код (Text):
    1. mov eax,0
    2. push eax
    3. push dword FILE_ATTRIBUTE_NORMAL
    4. ...
    5. call CreateFile
    А вот что тут дальше?
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Да. Если честно, не понимаю, зачем это нужно, но иначе Винда, например, грузиться отказывается.

    По поводу кода.

    1. Ты копируешь себя на 0х7Е00, но никак это не используешь.
    2. 'MOV SI, 1BEh ; Go to the first partition'
    надо заменить на
    'add si, 0x1BE'
    3. Ты сначала читаешь с винчестера первый сектор раздела, а только потом смотришь, нужен ли он тебе.
    4. Не совсем понятно, куда у тебя будет указывать буфер.
    5. JMP 0000:7C000h Один ноль лишний, +не ясно, откуда здесь появится первый сектор активного раздела.

    Вообще, обычно делают немного по-другому: начальная часть делается базонезависимой и копирует остальную по какому-либо адресу (но не остаются на 0х7С00). Затем передают управление в скопированную часть, которая ищет активный раздел, если находит, читает его в 0:0x7C00 и прыгает, иначе сообщает об ошибке.
     
  8. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    tasm

    гм.. смотря чем записывать
    если 0x1be байт с помощью WriteFile в устройство "\\.\PHYSICALDRIVE0", то вроде бы не должна..
    проверять не хочу ))

    конкретно на 0:0:5 или на 0:0:6 (0:0:1 - сектор mbr с моим загрузчиком)

    знаешь, не увлекался... сам инсталлил дискедитом
    ну WriteFile дальше, в теории

    насчет джампа: ты же прыгаешь на буфер командой JZ LOAD_BOOT, а в буфере к этому моменту код boot-record
    управление до джампа просто не дойдет

    резюме:
    1. все, что написал Mika0x65
    2. убрать buf
    3. вместо
    Код (Text):
    1. MOV AX, CS             ; Set ES
    2. MOV ES, AX             ;
    3. MOV BX, buf            ; Buffer offset
    Код (Text):
    1. mov ax, 0
    2. mov es, ax
    3. mov bx, 07C00h
    не забудь к этому моменту передать управление своей копии
    4. добавь все таки какой-нить код вместо
    Код (Text):
    1. ;show "no active partition" message and break
     
  9. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    насчет инсталляции моего mbr
    использовалось все это так:

    1. ставим windows, текущий сектор 0:0:1 (первый сетор диска) копируем в 0:0:5
    2. ставим линух без установки lilo и прочих кривых bm
    3. копируем 0:0:1 в 0:0:6
    4. восстанавливаем сектор 0:0:1 таким, каким он был до линуха (можно и из сектора 0:0:5)
    5. записываем в 0:0:1 mbr (partition table не трогаем)
    6. в 0:0:4 записываем:
    в первый байт - 0
    со второго байта ASCIIZ строку с приглашением к выбору

    теперь при загрузке будет грузиться винда; если зажат alt+ctrl - linux, усли ctrl+alt+shift - появится приглашение с текстом из 0:0:4

    надеюсь, ничего не забыл... )
     
  10. Seraph

    Seraph New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2006
    Сообщения:
    5
    Вот теперь я твою задумку наконец понял ))
     
  11. Seraph

    Seraph New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2006
    Сообщения:
    5
    Всем спасибо за внимание. В итоге я переделывал загрузчик от win9x. Благодаря вашим советам многое понял и многое обошел еще до упирания в это лбом :0) Постараюсь в свободное время развить идею бутмэнэджера в широком смысле из своего загрузчика. Еще раз спасибо за советы )
     
  12. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Nouzui,
    вместо
    можно более коротко и лаконично:
     
  13. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Вообще-то нельзя -- es не кодируется для xor.
     
  14. s1lver

    s1lver New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2007
    Сообщения:
    14
    Привет всем !
    Сейчас пытаюсь написать boot manager под Windows ! У кого нибудь есть исходники ? Если есть не могли бы вы мне их выслать s1lver@aaanet.ru
    аська 54 58 317
     
  15. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Тут я уже советовал, что можно взять в качестве примера.
     
  16. s1lver

    s1lver New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2007
    Сообщения:
    14
    Не заметил ! сорри ! Сейчас посмотрю ... Это в яндексе исходники надо искать Boot easy я так понял ,да ? или где то на сайте это прога есть ?
     
  17. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Не обязательно.
    Для tasm как и для fasm и nasm можно сгенерировать чистый бинарник с любым начальным смещением.
    В начале кода для MBR пишеш вместо ORG 100h - ORG 7C00h.
    Компиляция:
    Код (Text):
    1. tasm /m mbr.asm
    2. tlink /t mbr.obj mbr.bin
    Всё. Т.е. если у tlink не указан выходной файл или указан с расширением *.com - он создаёт com файл и требует ORG 100h.
    Если же указать явно другое расширение для выходного файла, то можно использовать любой начальный адрес (ORG) в диапазоне 0..0FFFFh.
     
  18. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Я, возможно, название путаю, то ли BootEasy то ли EasyBoot... В общем, выкладываю исходники:

    Похоже аттачи не работают. Положил файл здесь. А здесь новая версия.
     
  19. DXP

    DXP New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    4