Прочитал вот эту статью http://www.wasm.ru/article.php?article=pipm02 Очень понравилось! Захотелось попробывать... Вот тут-то и столкнулся с проблемой - не могу попробывать, т.к. диск C:\ по умолчанию грузится Windows. Я так понимаю, что вначале процессор работает в реальном режиме, а потом, когда начинает грузится Windows, то Windows переводит процессор в защищённый режим и дальше в нём работает. Потом нашёл ещё одну статью http://www.codenet.ru/progr/os/ И опять проблема - всё это работает только с дискетки и то только, если использовать образ дискетки. Если просто тупо перекопировать файлы, то ничего не получится! Я так понимаю, что на дискетке или на диске C:\ есть какая-то загрузочная область... что-то смутно слышал об MBR (может оно?)... Как изменить эту область, чтобы грузился не Windows, а что-то своё!?
Meatcoins MBR - мастер бут рекорд. Первые 512 байт, которые биос загружает и выполняет. Как поменять? Записать. Из под винды вроде можно WinHex использовать -)
MBR по идее должна быть универсальна для любой ОС, а вот что действительно специфично для загрузки ОС, так это бут-сектор раздела диска. В принципе загрузка с жесткого диска отличается от загрузки со съемного носителя только наличием дополнительного этапа в виде выбора загрузочного раздела кодом MBR-загрузчика. В остальном все тоже самое. Можешь поэкспериментировать с моим загрузчиком для флоппика (см. juneos.narod.ru).
BIOS грузит MBR главную загрузачную запись. У каждого раздела также есть своя загрузочная запись. По идее MBR должен загружать загрузочную запись раздела и передовать ей управление. В бутсектор раздела лежит загрузчик ОС, в данном случии виндоувский. Если у тебя виндоус семейства NT(2k, XP, 2k3 ..). То можно прописать в Boot.ini Код (Text): [boot loader] timeout=10 default=F:\MyBoot.bin [operating systems] F:\MyBoot.bin="К примеру так" multi(0)disk(2)rdisk(1)partition(1)\MyBoot.bin="Или так" Где MyBoot.bin - образ бутсектора 512байт. Можно и просто записать бутсектор на раздел диска любой из утелит? Но тогда пропадет возможность загруски windows. Проблема загрузочного сектора является в том что его объем очень мал 512 байтт минус дополнительная информация
Pavia Насколько я помню, несколько секторов после загрузочного не используются (по крайней мере в FAT), поэтому можно писать и дальше, только в основном коде придется подгружать хвост. А вообще нормальный подход исповедует nt loader, размещая в бутсекторе код, который грузит FAT, ищет там ntldr и читает его первый сектор в память. А дальше он уже разбирается что ему делать Так что если автору очень нетерпится сделать чтото свое, то можно либо прописаться в boot.ini, либо перезаписать тупо ntldr своим кодом =) Либо записать свой бутсектор, который найдет нужный файл - достаточно просто затереть имя "ntldr______" (вместо _ пробелы) своим именем в формате 8.3. Или, если очень неймется, скомпилировать свой Формат FAT не так уж сложен, чтобы там можно было запутаться. Ой чтото понесло меня кудато) Закругляюсь
Я применил гибридный вариант: Скачал WinHex. Читает жесткий диск в бинарном виде. В самом начале находится $Boot, который и ответственен за загрузку ОС, как я понял. Попробывал следующее: Взял и изменил Boot.ini так: Код (Text): [boot loader] timeout=10 default=C:\bootcode.bin [operating systems] C:\bootcode.bin="К примеру так" multi(0)disk(0)rdisk(0)partition(1)\bootcode.bin="Или так" bootcode.bin взял с juneos.narod.ru Вроде грузится, но на экране вот это: Код (Text): Disk Error! Press ESC to reboot. _ Может быть это-из за того, что это загрузчик для флоппика... Есть ли загрузчик для жёстких дисков? Можно ли bootcode.bin использовать для загрузки с жёстких дисков? Надо полагать, что если в WinHex переписать первые 512 байт жесткого диска на bootcode.bin, то эффект будет такой же... Кстати вопрос: Есть исходник загрузчика. Как его откомпилировать в .bin??? MASM'ом, TASM'ом или всё равно??? Какие должны быть параметры командной строки??? Код (Text): ml /c bootcode.asm link bootcode.obj,,NUL,,, exe2bin bootcode.exe bootcode.com PAUSE
Мда! Если переписать первые 512 байт на диске с помощью WinHex, то эффект такой же! Если переписать первые 512 байт на дискетке на bootcode.bin, то всё это работает так: Код (Text): Disk boot failure! Press ESC to reboot. _
На самом деле это не проблема, т.к. большинство современных ФС подразумевают возможность дозагрузки бут-блока, о чем упомянул Great. К сожалению, в FAT32 может потребоваться переформатирование (или по крайней мере переразметка с помощью специальных утилит) раздела для сохранения бут-блока размером больше 512 байт. В некоторых ФС для бут-блока сразу отводится достаточный участок, чтобы сильно не беспокоиться о размещении в нем необходимого количества кода. Meatcoins, видимо я ввел тебя в заблуждение, но опубликованный загрузчик предназначен исключительно для 1,44-мегабайтного флоппика, о чем четко написано на странице для скачивания. Возможно, я все-таки опубликую загрузчик для FAT32, хотя делать этого не планировал. Для NTFS к сожалению сделать этого не смогу, потому что сам не использую эту ФС для загрузки своей ОС. Здесь более удачным будет вариант, предложенный Pavia. Сообщение Disk boot failure! Press ESC to reboot. появляется в случае отсутствия на дискете системных файлов или их неправильного формата. О сообщениях об ошибках написано здесь, а о формате загружаемых загрузчиком файлов здесь. В принципе сам бут-сектор (как MBR, так и бут-сектор отдельного раздела) содержит код, загружаемый и запускаемый с жесткого диска, поэтому разместив там свой код ты уже добъешься загрузки с жесткого диска. Если же ты хочешь загружать именно исполняемые файлы, то могу предложить простейший вариант для запуска COM-файла, но опять-таки пока только для флоппика. Для загрузки исполняемого файла формата COM его нужно разместить на дискете под именем june.fs вместе с файлом june.os, который можно получить из такого исходника, написанного под fasm. Код (Text): ; JUNE.OS stub ; runs JUNE.FS stub as COM file org 8000h mov ax, 830h xor bx, bx cli mov ss, ax mov sp, bx sti push bx mov ds, ax mov es, ax jmp 830h:100h rb 8300h-$ xor ax, ax mov ds, ax mov word [ds:472h], 1234h jmp 0FFFFh:0 rb 83FEh-$ dw 0AA55h Откомпилированный бинарник можешь взять здесь.
да, кстати, кому интересно, могу дать исходники бутсектора Win NT4 различных файловых систем. в личку
Great Конечно интересно!!! Phantom_84 А как откомпилировать bootcode.asm в bootcode.bin??? То есть если я напишу какую-то программулю и вставлю её с помощью WinHex в нулевой раздел жёсткого диска (MBR?), то мой код выполнится? Но этот код должен использовать прерывания, как в DOS, если он работает в реальном режиме. А почему только для флоппика? Мне просто не очень нравится с флоппика - размер ограничен 1.44M всего... Ещё много непонятного конечно для меня в этой теме... Код (Text): jmp 830h:100h Это прыжок в память после префикса программного сегмента PSP, на 83-й сегмент? Т.е. на точку входа com-программы? А почему тогда расширение com-программы не com, а fs (june.fs)? Для меня бы идеальным вариантом был бы загрузчик для жёстких дисков с исходниками для разных файловых систем!!! (FAT16, FAT32 и NTFS можно, если есть и ext2 и т.д.) Как я понял основной целью загрузчика является загрузить в память и передать управление основной программе или операционной системе.
Meatcoins Обычно созданием такого загрузчика и кончаются все проекты самодельных ОС. Вот только не пойму твою роль : ты типа тестер чужих разработок ? Загрузчики есть и исходники есть - ищи получше. Например исходники загрузчиков Линукса.
valterg И обычно по двум причинам: а) лень делать что-либо дальше; б) полное отсутствие представления, что же делать дальше (т.е. отсутствие внятного представления о том, из чего ось состоит, как она работает и т.д.). Сам по себе загрузчик, естественно, в этом не виноват Загрузчиков полно, но перед тем как нырять в чужие исходники, неплохо бы определиться, что ты там хочешь найти. Например, GRUB грузит чуть ли не что угодно и с чего угодно, но в результате он большой, и продраться через его код будет не так-то просто. Ну а какой-нибудь загрузчик, предназначенный исключительно для одного типа файловой системы, будет куда проще, и "въехать" в него намного легче. Meatcoins MBR -- это не нулевой раздел жёсткого диска, это вообще не раздел, а служебная запись, находящаяся в самом первом секторе диска. В ней содержится главный загрузчик и таблица разделов. Означенный загрузчик по таблице разделов определяет, какой раздел отмечен активным, и загружает в память первый сектор этого раздела, после чего передаёт управление на загруженный код. Вот этот-то код и будет загрузчиком раздела, учитывающим тип файловой системы, с которой ему приходится иметь дело. Подменить можно как загрузчик в MBR, так и загрузчик в первом секторе любого раздела. Но в первом случае ещё придётся выбирать, с какого раздела грузиться, а во втором -- просто грузиться из него. Лично мне кажется, что второй способ предпочтительнее, тем более что в MBR может быть установлен не штатный загрузчик, а, например, GRUB, который обладает куда большими возможностями, но способен выполнять и "тупую" загрузку первых секторов любых разделов (а не только активного). Наконец, если используется Windows, ничто не мешает сделать на диске два (или больше) раздела и попросить загрузчик Windows загружать при необходимости загрузочный сектор другого раздела, а не саму Windows. Достигается это простым добавлением соответствующей строчки в boot.ini. Кстати, загрузчик использует прерывания, но только не ДОСа (которого в памяти просто нет), а исключительно BIOSа. Именно с их помощью он осуществляет загрузку нужной программы в память.
Если речь идет о моем исходнике bootcode.asc, то при помощи fasm'а. Если о твоем, причем написанном не для fasm'а, то может потребоваться дополнительная обработка, например, с помощью exe2bin. Да, прерывания BIOS или же работать с аппаратурой напрямую, что в загрузочном коде делается редко. Потому что флоппик - устаревший носитель. Мне не жалко поделиться с народом устаревшими технологиями К тому же установка загрузчика на жесткий диск выполняется сложнее, а инсталлятор я еще не написал. В добавок я разделил некогда единый загрузчик на две версии - одна использует EDD, другая традиционный сервис - инсталлятор должен детектить наличие EDD и устанавливать либо одну версию, либо другую. А ты что много грузить собрался? Насчет моего кода не парься. Я сделал все за тебя. Ты вообще знаком с форматом COM-файлов? ??? Потому что мой загрузчик загружает файл именно с таким именем! Примерно так.
Правельно, зачем делать через пень колоду. Когда BIOS предостовляет универсальный способ доступа к любому насителу, с которого происходит загрузка. Через Int 13h. Да и не плохо бы еще вернуть управление BIOS'у в случии неудачной попытки загрузки. Тогда биос может попробовать загрузиться с другого источника.
Вообще-то всё началось с того, что я хотел написать что-нибудь, переводящее процессор в защищённый режим. А потом столкнулся с проблемой, заключающейся в том, что я не смогу это запустить! Вывод: Нужен загрузчик! Хотелось бы с исходниками! Хотелось бы для жёсткого диска! Не очень сложный с исходниками, чтоб разобраться... А "навороченный" можно использовать, чтоб грузить что-то своё...
Pavia, вообще-то существует соглашение, что при состоявшейся, но неудачной загрузке со съемных носителей нужно выполнять перезагрузку (int 19h), а при неудачной загрузке с фиксированных дисков (например, когда отсутствует активный раздел) - попытаться загрузиться со следующего устройства из цепочки, определенной с помощью BIOS Setup (int 18h). Если проблемы возникли уже на этапе загрузки модулей ОС или вторичного загрузчика, то и в этом случае рекомендуется перезапускать процесс загрузки (int 19h). Meatcoins, в сети можно найти множество готовых загрузчиков! Было бы что грузить! Более того правильнее всего, когда загружаемые модули никак не связаны с загружающим их загрузчиком, т.е. мне к примеру не нужно как-то видоизменять системные файлы, чтобы их загрузить с другого носителя, нужно всего-лишь использовать подходящий загрузчик. Поэтому для начала проще загружаться с флоппика, если конечно он у тебя есть (у меня например не на всех компьютерах есть флоппик), т.к. это не требует что-то менять на жестком диске, а со временем, когда загружаемая таким образом программа разовъется во что-то серьезное, ее без изменений можно загружать и с жесткого диска с помощью специального загрузчика. Если ты напишешь что-то стоящее, то я обещаю тебе, что легко поделюсь с тобой всеми своими загрузчиками!
Phantom_84 значит буду искать загрузчики... Что-то стоящее я буду долго писать... но за такие перспективы спасибо...
Meatcoins Ну так возьми исходники ReactOS - про ее загрузчик столько написано, что думаю сможешь разобраться. Только насколько я знаю, установить правильно защищенный режим непросто. Хотя если ты хочешь небольшую программу запустить, то это не так сложно. Ну и любые другие самодельные ОС, но лучше сильные проекты, чтобы побольше инфы было. ---------------------------------- Ну и не стоит забывать про ДОС. Там все-таки будет файл-менеджер и компиляторы нормальные. Не надо писать загрузчик, а можно сразу экпериментировать с защищенным режимом. Но лучше все это делать в виртуальной машине, чтоб не угробить диск ненароком.
Что ты понимаешь под словом правильно? Установить защищенный режим просто, а вот нормально, т.е. в полной мере, его использовать действительно непросто.
Попробую ещё ReactOS... Главное разобраться... тема-то интересная... Я практически рельный Windows не использую - у меня там минимум всего стоит - всё на WMware в основном! WMware - это вообще БЕШЕННАЯ штука!!!