Да мне что-то так показалось ночью. Я корректирую начальный адрес раздела в дескрипторе, когда это необходимо, чтобы он действительно был абсолютным, как и в дескрипторе первичного раздела. В смысле ты загрузил BS в память, и поменял там значения в "области данных BIOS"? Или прям на винте меняешь. Откровенно нет желания сейчас копаться по форматам BS для разных OS. Ты уверен, что для FAT12/FAT16/FAT32/NTFS/EXT2 этот "начальный адрес раздела" живет в одном и том же месте? Или ты проверяешь тип раздела предварительно? Мыло в профиле, пейджеры, что-то давненько не использую. И возвращаясь к ранее тобой написанному. Ты говорил, что у тебя универсальный код в MBR/BS живет. Вот этого я очень не понял. Расшифруй.
"Область данных BIOS" - это BDA. Я корректирую BPB. В памяти естественно. На винте это делать не вполне корректно (противоречит формату расширенного раздела типа 5 и вложенным в него разделам), более затратно и грозит дополнительными ошибками. Тип раздела естественно проверяю, текущее значение проверяю. В FAT/NTFS поле HiddenSectors находится по смещению 1Ch. Но этот загрузчик я пока не выкладывал, поэтому не нужно об этом много говорить. Возможно, со временем поддержку расширенных разделов я включу и в Alter. Не совсем так. abcd008 сказал, что использует указатель DS:SI в первичном загрузчике. Я сказал, что откуда он его возьмет, если первичный загрузчик установлен на цельном устройстве (не разбитом на разделы диске), и что у меня первичные загрузчики могут устанавливаться и в раздел, и на цельное устройство - да, по сути в MBR, но это все равно не MBR-загрузчик, а обычный первичный загрузчик. Все благодаря Boot Spec. и этому фрагменту кода: Код (Text): cmp byte [7DFFh],88h je @f mov dh,0 @@:
если вопрос в том каковы минимальные требования для того чтобы биос загрузил и передал управление коду, то как я помню - это наличие сигнатуры и (а может и не помню - активного раздела в таблице) какогонибудь кода вот пример (копирнул загрузчик от Грейта чтоб просто строку выводил) бинарный код (на выходе фасма) надо расширить до 512 и в конце добавить сигнатуру Код (Text): format binary use16 jmp near start BootSeg equ 07c0h _message db 'HELLO BOOT WORLD :)',0 start: xor ax, ax mov ss, ax mov sp, 7c00h push BootSeg pop ds mov si, _message call FPrint sti jmp $ FPrint: lodsb ; Get next character or al,al jz FPrintDone mov ah, 14 ; Write teletype mov bx, 7 ; Attribute int 10h ; Print it jmp FPrint FPrintDone: ret
нет. здесь вопросы посложнее. и у половины из нас уже есть полноценные mbr. уже работающие. здесь скорее решаем нюансы.
Не совсем так. abcd008 сказал, что использует указатель DS:SI в первичном загрузчике. Я сказал, что откуда он его возьмет, если первичный загрузчик установлен на цельном устройстве (не разбитом на разделы диске), и что у меня первичные загрузчики могут устанавливаться и в раздел, и на цельное устройство - да, по сути в MBR, но это все равно не MBR-загрузчик, а обычный первичный загрузчик. Все благодаря Boot Spec. и этому фрагменту кода: cmp byte [7DFFh],88h je @f mov dh,0 @@: -а где эта спецификация. ты вроде говорил что сам ее придумал? а если вторичный загрузчик будет твой. а mbr оригинальный(MS). то получится что он не поймет что у тебя за BR у него же сигнатура не 55AAh, а 5588h(или AA88h неважно). получится что он не передаст ему управление?
В общем это я и имел ввиду. Ой, а давай заранее договоримся вот это и подобное опускать. Сколько я помню твою терминологию, "первичное устройство".... У тебя обычный BOOT Сектор. Я думал универсальный, или комбинированный. Вот это место, чуть по подробней. sn0w Нет, вопрос далеко не в том.
В основном, я. Суть интерфейса между MBR-загрузчиком (stage 0) и первичным загрузчиком (stage 1) можно понять из этих выкроек (см. ниже). Второй интерфейс описывает взаимодействие первичного загрузчика и ядра/вторичного загрузчика. При необходимости буду цитировать и дальше. Ты так и не догнал... "Моя" ветка, пост #9. "Цельное устройство"? Универсальный загрузчик я так и называю. Здесь имеется в виду универсальность в плане своего размещения, а не совмещения функций двух различных загрузчиков. См. выше ))) Проверяю валидность значения, переданного в dh.
То есть ты в конец сектора пихаешь не 55AA, а 5588? По моему тебе правильно намекают, что ты большие грабли себе зарываешь. Стоит сменить код в MBR на более другой, и загрузка с твоих разделов пойдет лесом. Да и BIOS может смело послать сектор с такой сигнатурой так далеко в лес, что станет грустно.
я допер сигнатура у него нормальная 55aah. а мбр при записи в dh-отличного от нуля числа (раздела),заменяет в загруженном образе BR (в памяти а не на диске) последний байт на 88h. Молодец) возьму на вооружение. а то я тоже разделы нумерую так же. но только передаю их пока ядру. а не мбэром в BR.
Во. "Молодец)" Только давайте все-таки писать 0AA55h (или 55h, 0AAh). Может быть и ноль (Boot Spec. это допускает). Когда от MBR-загрузчика передается в качестве валидного значения ноль, ядро будет считать загрузочным активный раздел. Точнее ядро сразу точно этого не знает, а определяет, т.к. 0 может означать две вещи - загрузку с цельного устройства или загрузку с активного раздела.
а кто-нибудь читал multi boot specification. на разных сайтах пишут что линух и еще много подобных систем ей соответствуют. и загрузчик grub тоже. но проблема в том что не в grub(в одном нашол), а в линух вообще негде нет magic number 0xe85250d6 я пробовал и местами менять, один фиг нету. вот и не пойме зачем призывать ей пользоваться, если сами не используют?
у меня две спецификации. одна 2009, другая 2010. и у них разные MAGIC. но не в том дело. я нашел эту сигнатуру только в grub. а в образе linux (и в исходниках) ее нет. мне бы пример какой, для полного понимания реализации.
посмотрел исходники grub и linux. при тесте на активность раздела они делают flag and 7fh. и если 0 то не активный, а 80 то активный. то есть они пользуются проверкой бита а не числа. зато при создании и записи пишут точные числа 80 или 0(без операции or)
вот мой MBR. кто хочет смотрите. заодно отпишитесь как работает. сам проверял на трех машинах, ошибок не нашел. некоторые фрагменты могут показаться странными, но все делалось для того чтоб код влез до 1AFh по документации можно и больше. но многие программы и системы редактируют пространство mbr с адреса 1b0h для своих нужд. но все что мне было надо, я впихнул) для лучшей наглядности код лучше смотреть из под DOS Navigator(в досе или винде) или AkelPad (виндовс) в обычном блокноте теряется выравнивание и плохо понимается текст.
ОК, посмотрю. Только давай так: я буду тестить твой загрузчик, а ты мой. Скоро в "своей" теме выложу для тестирования новую редакцию Alter'а с задержкой при ожидании. Мы пока сами ее тестим. В основном на ноутах )))
Нет. Только фрагмент, осуществляющий задержку. Если боишься за свой комп, можешь потестить на чужих )))