| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm: Общие вопросы > Диспетчер загрузки ОС |
| Автор: Fant87 18.10.2010, 19:45 |
| Здравствуйте, возник вопрос о написании диспетчера загрузки ОС на TASM. Смысл такой: 1) Вставляем флешку, на которой находится наша программа 2) В биосе выбираем загрузку с флешки 3) Запускается меню выбора того, что загрузить (ОС с винчестера или что нибудь еще), пути для запуска можно прописывать сразу. подскажите пожалуйста какую либо литературу по этому вопросу или может кто-то уже это делал и поделится исходником. |
| Автор: iff 18.10.2010, 22:03 | ||
Когда мы в БИОСе выбираем загрузку с флэшки, то загружается соответственна ОС, которая записана на флешке, в ее "загрузочном секторе". Для этого ненужен никакой диспетчер ОС - для этого нужен БИОС (который понимает флешки) и сама флеш-карта, на которой записана ОС. |
| Автор: Fant87 18.10.2010, 23:00 |
| Я наверно не так объяснил. Наверно вы знаете комплекс для "реанимации" PC :Live CD или Live USB, так вот при выборе загрузки с флешки или диска, она сначало выводит список того, что можно загрузить, а именно: непосредственно винду с диска или с HDD, так же можно выбрать запуск каких либо программ. Еще пример, при установке Windows, на некоторых сборках тоже делают выбор что запустить, установку windows или какую нибудь программу. Так вот мне и надо, что бы при загрузке флешки было меню выбора запуска установленной на HDD Windows либо каких-то программ. Я больше не знаю как объяснить. |
| Автор: iff 24.10.2010, 10:30 | ||
Эти программы написаны я так понимаю под ДОС. Значит тогда вам нужно будет писать ДОС-совместимую операционную систему... Или взять флешку, средствами виндовс сделать из нею загрузочный диск MS-DOS, далее записать на неё те программы, которые будут выбираться из меню, затем пишем диспетчер загрузки, а в файл AUTOEXEC.BAT последними строками дописываем:
Что-бы пользователь имел дело только с диспетчером. А теперь самое главное как же его написать: 1) Что каксается организации вывода меню на экран, то с этим проблем не будет. Я даже видел исходник такой программы где-то. Там применюются в основном ф-ции прерываний 10h и 16h. 2) Загрузка программы. Для этого используйте ф-цию 4Bh прерывания int 21h 3) Выполнить загрузку с какого либо диска. с этим посложнее... Вот например int 19h выполняет загрузку ОС, но по-моему с только с диска, который был выбран для загрузки в БИОС. |
| Автор: Logree 24.10.2010, 11:15 |
| не нужно так заморачиваться: http://ru.wikipedia.org/wiki/LILO http://ru.wikipedia.org/wiki/GRUB |
| Автор: iff 24.10.2010, 16:31 |
| Это всё конечно хорошо, но человек хочет сам написать |
| Автор: Fant87 24.10.2010, 19:00 |
| Да, мне надо самому написать, просто это тема курсового проекта. На счет меню, нету сложности, я уже его практически реализовал, сложность составляет только с запуском выбранной ОС. |
| Автор: iff 24.10.2010, 19:15 |
| А с запуском программы из меню нет сложности? Т.е. программа написана "под BIOS", в том смысле что в ней не используются сервисы ДОС? |
| Автор: Fant87 26.10.2010, 14:56 |
| Эх, узнал я как надо и оказалось, все мои наработки можно выкинуть. Нужно: 1) Написать код с помощью функций BIOS, который будет перекидывать на адрес в файловой системе, где загрузчик ОС 2) Записать этот код в загрузочный сектор флешки Нужно теперь разобраться, как найти адрес загрузчика ОС. Ну а чтобы протестировать, надо понять, как записать в загрузочный сектор Преподаватель сказал: код просмотреть через редактор, найти где начинается код функций, скопировать эти 0-и и 1, а потом как-то записать их в загр. сектор. Но вроде на СИ я видел такое. |
| Автор: iff 26.10.2010, 17:56 |
| Где загрузчик? В загрузочной записи. В ней данные со смещением 00h содержат инструкцию перехода к загрузчику, сам же загрузчик начинается со смещения 3Eh и может продолжаться до 1FFh. Т.е. фактически вам нужно перейти к выполнению команд записанных с адресом 00 (смещение команды, передающей управле6ние загрузчику). Загрузочная запись находится в самом начале диска (сторона 0, дорожка 0, сектор 1). Но вам нужно будет сначало загрузочную запись прочитать в оперативную память, регистр cs преровнять к тому сигменту оперативной памяти, куда считали запись, а регистр ip преровнять н 0000. НО. думаю что в БИОС есть уже прерывание и функции которые могут выполнить загрузку ОС с како-го либо диска и вам не придется все писать самим. |
| Автор: Fant87 28.10.2010, 01:52 | ||
| Да, есть прерывания, выполняющие загрузку, но как оказалось, мне до них еще далеко. Пробовал вывести обычное сообщение при загрузке, но для этого надо перевести как минимум в bin, а это чего-то не получается утилита exe2bin пишет, что не удается преобразовать файл, пробовал смотреть другие топики, та все примеры на nasm, а он сразу в bin кодирует. Может подскажете, что мне сделать, чтобы всё таки как-то запустить код написанный на TASM или может ошибка в коде и поэтому exe2bin ругается. Вот код:
Думаю есть еще варианты, как записать загрузочный в загрузочный сектор, но понятных объяснений я нигде так и не нашел. |
| Автор: Logree 28.10.2010, 04:57 | ||
| 1. при написание загрузщика у вас НЕТ ПРЕРЫВАНИЙ DOS!!! откуда там ему взяться? 2.
почитайте любую тему по "напсанию собственной оси" + про MBR. |
| Автор: Logree 29.10.2010, 20:48 |
| автору нужно уточнить тему у преподавателя... что это за "остальные программы" под чем они должны запускаться и т д. |
| Автор: Fant87 29.10.2010, 22:57 | ||
| Я всё уточнил, программы запускать не надо, необходимо только запустить диспетчер и выбрать какую ОС грузить. С запуском маленькой программы (выводящей букву) я справился. Вот только возникают вопросы: 1) Как сделать, чтобы загрузчик запустил еще один загрузчик с флешки, так как мне кажется, что если делать интерфейс, то не поместится в 512 байт 2) Как сделать выбор загрузки ОС, а именно: можно ли,чтобы BIOS нашел все ОС на дисках и потом как-то это вывести или как-то управлять вызовом ОС, а именно выбором диска поиска загрузочного сектора. Еще преподаватель сказал, что можно грузить адреса загрузчиков из файла, ток вот как это сделать и где взять эти адреса я не пойму. Я пока нашел только 2-а вроде подходящий прерывания: 1) int 18h - оно продолжает поиск загрузчиков на других носителя, но она не подходит, так как может надо выбрать не следующий диск, а последний например. 2) int 19h -это вроде подходит, только я не нашел описания как им пользоваться, нашел только то, что если после прерывания не находит загрузочный сектор, то вызывает int 18. Вот что получилось при попытке записаться в загр сектор:
Получается при загрузке выводится А, потом идет ожидания нажатия любой клавиши, а далее загрузка с другого носителя. |
| Автор: Logree 30.10.2010, 16:02 | ||||
| эта программа работает? вы наверное пытались запустить ее из под винды? чтаем внимательно http://ru.wikipedia.org/wiki/Главная_загрузочная_запись особенно алгоритм загрузки у M$/
Биос не ищет ос, он перебирает устройства в порядке приоритета указанного в его настройках, и ищет в конце первого сектора сигнатуру 55AA, если он её находит то он этот загрузочный сектор записывает в память по адресу 0000h:7c00h, и передаёт туда управление( грубо jmp 0000h:7c00h) на этом роль биоса заканчиваетя теперь выполняется программа записанная в загрузочном секторе. погугли "Enhanced Disk Drive"+ советую почитать http://ru.osdev.wikia.com/wiki/Диски_и_файловые_системы.
преподаватель бредит. |
| Автор: iff 30.10.2010, 19:54 | ||
| 1. int 18h - вызывает интерпретатор BASICA (если он есть, а есть, точнее был, он толька на фирменных компьютерах IBM) 2.Вы начинаете писать загрузчик сразу со смещения 0, а следовало бы писать со смещения 3Eh, а смещение 0 имеет инструкция перехода к загрузчику (jmp), а сам загрузчик должен быть по адресу 3Eh. http://ru.wikipedia.org/wiki/FAT http://www.piclist.ru/S-FAT-MMC-RUS/S-FAT-MMC-RUS.html
Загрузчик по средством BIOS (см. int 13h) читает код основной программы, записанной на дискете, и загружает его в память, затем передает ему управление. |
| Автор: Napalmx 2.11.2010, 17:00 | ||
вот блин интересную темку ты поднял, я как то занимался этим вопросом. Для для получения машинного кода использовал FASM, потом прописывал в загрузочный сектор флешки при помощи Winhex. Образец кода был примерно такой
что то тут рисуется вроде наверное прямоугольник какой то, вот но суть то в том что я так и не придумал как передать управление управление загрузчику, который находится в MBR жесткого диска. То есть я пробовал его от туда тупо переслать в оперативку и передать по этому адресу управление - ничего не получалось. |
| Автор: iff 10.11.2010, 22:13 |
| У меня получилось создать дискету, на которой записан код, который загружает ОС с диска С. См. пример. Папку disk переместить в директорию TASM и запустить makeit. |
| Автор: Fant87 3.12.2010, 00:21 |
| Огромное спасибо за помощь. Я пытался переделать это на работу с флешки, но так ничего не вышло к сожалению((( |
| Автор: iff 3.12.2010, 13:41 |
| Fant87, а у вас BIOS умеет грузиться с флешки? у меня например - нет |
| Автор: Fant87 3.12.2010, 21:45 |
| Может я что-то не понимаю, но по идее умеет, ведь винду я с флешки устанавливал и получается загрузчик там был. |
| Автор: bugmenot1 4.12.2010, 17:09 |
| Для загрузки с флешки на ПК где нет такой поддержки можно воспользоватся http://neosmart.net/dl.php?id=1 |
| Автор: Fant87 7.12.2010, 23:54 |
| По идее же, код OS.asm не надо менять, надо просто записать его в загрузочный сектор флешки? Просто я пробую, но не работает, может я заря пробую, так как код не подходит? |
| Автор: iff 8.12.2010, 11:57 |
| надо немного поменять, во первых если посмотреть на этот код, то видно что второй сектор подгружается в память именно с диска A. |
| Автор: Fant87 9.12.2010, 00:07 |
| А вы не могли бы хотя бы примерно поменять код, просто у меня никак не получается переделать. |