Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Диспетчер загрузки ОС


Автор: Fant87 18.10.2010, 19:45
Здравствуйте, возник вопрос о написании диспетчера загрузки ОС на TASM.
Смысл такой:
1) Вставляем флешку, на которой находится наша программа
2) В биосе выбираем загрузку с флешки
3) Запускается меню выбора того, что загрузить (ОС с винчестера или что нибудь еще), пути для запуска можно прописывать сразу.
подскажите пожалуйста какую либо литературу по этому вопросу или может кто-то уже это делал и поделится исходником.

Автор: iff 18.10.2010, 22:03
Цитата

1) Вставляем флешку, на которой находится наша программа
2) В биосе выбираем загрузку с флешки

Когда мы в БИОСе выбираем загрузку с флэшки, то загружается соответственна ОС, которая записана на флешке, в ее "загрузочном секторе". Для этого ненужен никакой диспетчер ОС - для этого нужен БИОС (который понимает флешки) и сама флеш-карта, на которой записана ОС.

Автор: Fant87 18.10.2010, 23:00
Я наверно не так объяснил.
Наверно вы знаете комплекс для "реанимации"  PC :Live CD или Live USB, так вот при выборе загрузки с флешки или диска, она сначало выводит список того, что можно загрузить, а именно: непосредственно винду с диска или с HDD, так же можно выбрать запуск каких либо программ. Еще пример, при установке Windows, на некоторых сборках тоже делают выбор что запустить, установку windows или какую нибудь программу. Так вот мне и надо, что бы при загрузке флешки было меню выбора запуска установленной на  HDD Windows либо каких-то программ. Я больше не знаю как объяснить.

Автор: iff 24.10.2010, 10:30
Цитата(Fant87 @  18.10.2010,  23:00 Найти цитируемый пост)
выбрать запуск каких либо программ

Эти программы написаны я так понимаю под ДОС. Значит тогда вам нужно будет писать ДОС-совместимую операционную систему...  smile 
Или взять флешку, средствами виндовс сделать из нею загрузочный диск MS-DOS, далее записать на неё те программы, которые будут выбираться из меню, затем пишем диспетчер загрузки, а в файл AUTOEXEC.BAT последними строками дописываем:
Код

:disp
DISPETCH.EXE
goto disp

Что-бы пользователь имел дело только с диспетчером.

А теперь самое главное как же его написать:
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
Это всё конечно хорошо, но человек хочет сам написать  smile 

Автор: 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 ругается.
Вот код:
Код

.Model TINY
code SEGMENT
 ASSUME cs:code
ORG 7C00h
begin:

mov ah, 0eh
mov al, 'B'
int 10h
mov ah,00h
int 16h

mov AX,4c00h
int 21h
code ENDS
end begin


Думаю есть еще варианты, как записать загрузочный в загрузочный сектор, но понятных объяснений я нигде так и не нашел.

Автор: Logree 28.10.2010, 04:57
1. при написание загрузщика у вас НЕТ ПРЕРЫВАНИЙ DOS!!! откуда там ему взяться?

2. 
Код

При использовании команды exe2bin имеют место следующие ограничения: 
    входной файл должен быть в корректном .exe формате, полученном после компоновки и не должен быть упакованным; 
    резидентная или действующая (код и данные) часть файла не должны превышать объема в 64Кб; 
    в файле не должно быть сегмента stack.


почитайте любую тему по "напсанию собственной оси" + про MBR.

Автор: iff 29.10.2010, 10:08
TASM может сразу компилировать в COM. Для этого укажите параметро /t линкеру.
Цитата(Logree @  28.10.2010,  04:57 Найти цитируемый пост)
при написание загрузщика у вас НЕТ ПРЕРЫВАНИЙ DOS!!! откуда там ему взяться?

Да. Но вот еще есть другой вопрос
Цитата(Fant87 @  18.10.2010,  23:00 Найти цитируемый пост)
Так вот мне и надо, что бы при загрузке флешки было меню выбора запуска установленной на  HDD Windows либо каких-то программ

Эти программы тогда тоже не должны использовать прерываний DOS и других сервисов DOS. Более того вам придется ещё писать довольно сложный загрузчик (для загрузки EXE)

Автор: 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.

Вот что получилось при попытке записаться в загр сектор:
Код

.model     tiny             
.code                        
org        0              
start:      
    mov ah,0eh
    mov al,'A' 
    int        10h  
    mov ah,00h
    int 16h
    int 18h
end        start 

Получается при загрузке выводится А, потом идет ожидания нажатия любой клавиши, а далее загрузка с другого носителя.

Автор: Logree 30.10.2010, 16:02
эта программа работает? вы наверное пытались запустить ее из под винды?

чтаем внимательно http://ru.wikipedia.org/wiki/Главная_загрузочная_запись особенно алгоритм загрузки у M$/

Цитата

2) Как сделать выбор загрузки ОС, а именно:
 можно ли,чтобы BIOS нашел все ОС на дисках и потом как-то это вывести или как-то управлять вызовом ОС, а именно выбором диска поиска загрузочного сектора. Еще преподаватель сказал, что можно грузить адреса загрузчиков из файла, ток вот как это сделать и где взять эти адреса я не пойму.


Биос не ищет ос, он перебирает устройства в порядке приоритета указанного в его настройках, и ищет в конце первого сектора сигнатуру  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
Цитата(Fant87 @  29.10.2010,  22:57 Найти цитируемый пост)
Как сделать, чтобы загрузчик запустил еще один загрузчик с флешки, так как мне кажется, что если делать интерфейс, то не поместится в 512 байт

Загрузчик по средством BIOS (см. int 13h) читает код основной программы, записанной на дискете, и загружает его в память, затем передает ему управление.

Автор: Napalmx 2.11.2010, 17:00
вот блин интересную темку ты поднял, я как то занимался этим вопросом. Для для получения машинного кода использовал FASM, потом прописывал в загрузочный сектор флешки при помощи Winhex. Образец кода был примерно такой
Код

use16
    jmp   start
    nop
    
    db 'bootsect'           ;;  OEM name and version
    dw 512               ;;  Bytes per sector
    db 1               ;;  Sectors per allocation unit
    dw 1               ;;  Reserved sectors, starting at 0
    db 2               ;;  Number of FATs
    dw 224               ;;  Number of root-directory entries
    dw 2880               ;;  Total sectors in logical volume
    db 240               ;;  Media descriptor byte
    dw 9               ;;  Number of sectors per FAT
    dw 18               ;;  Sectors per track
    dw 2               ;;  Number of heads
    dd 0               ;;  Number of hidden sectors
    dd 0               ;;  Total sectors in logical volume
    db 0               ;;  Physical drive number
    db 0               ;;  Reserved
    db 41               ;;  Extended boot signature record
    dd 0               ;;  32-bit binary volume ID
    db '           '           ;;  Volume label
    db 'FAT12   '           ;;  Reserved
start:
       mov AX,cs
       mov DS,AX
       mov ah,00h
       mov al,03h
       int 10h
       mov ah,02h
       mov al,1
       mov ch,0
       mov cl,1
       mov dh,0
       mov dl,80h
       mov bx,6c00h
       int 13h
       mov cx,70
       mov di,6c00h
       xor dx,dx
fill: push cx
      mov cx,1
      mov ah,0ah
      mov al,[di]
      int 10h
      inc di
      mov ah,02h
      inc dl
      int 10h
      pop cx
      loop fill

 
    repeat (510 - $) 
    db 0 
    end repeat
    
    db 0x55, 0xAA
    
;;    repeat (1474560 - $) 
;;        db 0 
;;    end repeat


что то тут рисуется вроде наверное прямоугольник какой то, вот но суть то в том что я так и не придумал как передать управление управление загрузчику, который находится в 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
А вы не могли бы хотя бы примерно поменять код, просто у меня никак не получается переделать. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)