Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11850
Последний выпуск: 19.06.2015

Создание собственного загрузчика

Автор: Антон

Загрузка операционной системы начинается с того, что BIOS считывает программу начальной загрузки (ПНЗ) с первого сектора накопителя (первые 512 байт накопителя) в оперативную память по адресу 7c00h, записывает номер накопителя в регистр DL и передаёт управление на адрес 0:7c00h.

Это значит, что когда ПНЗ получит управление, состояние регистров будет следующее:

CS = 0,
IP = 7c00h,
DL - номер накопителя (в соответствии с правилами дискового
                       сервиса BIOS int 13h: 0-7fh - гибкие диски;
                       80h-0ffh - жёсткие диски и иные накопители).

Программа начальной загрузки пытается загрузить с накопителя операционную систему (ОС) или загрузчик ОС, используя стандартные дисковые сервисы (для всех накопителей) или расширенные дисковые сервисы (для всех накопителей кроме дискет). Если ей это удаётся, то она передаёт управление ОС или загрузчику ОС. Если нет, то возвращает управление в BIOS. Для этого ПНЗ дискет вызывают int 19h или int 18h (предпочтительней), а ПНЗ жёстких дисков и иных накопителей - int 18h.

Последние два байта ПНЗ должны содержать ключ 55h 0aah.

Для получения более полного представления смотрите

BIOS Boot Specification 1.01
Enhanced Disk Drive Specification 1.1, 3.0
Phoenix BIOS User's Manual, Chapter 4: Programmer's Guide

;
; примерная программа начальной загрузки на FASM
;

		use16

		org		7c00h

; регистры
;   cs:ip - 0:7c00h
;   dl    - номер накопителя
; память
;   00000-005FF        используется BIOS ( 1536 )
;   00600-07BFF        свободно ( 30208 )
;   07C00-07DFF        программа начальной загрузки ( 512 )
;   07E00-9FFFF        свободно ( 623104 )
;   A0000-FFFFF        используется BIOS ( 393216 )

		<настраиваем данные (DS, ES ...)>
		<настраиваем стёк (SS:SP) на свободную память>
		<загружаем ОС (или загрузчик ОС) в свободную память (int 13h, EDD)>
		<передаём управление ОС (или загрузчику ОС) jmp, jxx или call>

; ошибка - передаём управление BIOS
error:
		int		18h

; свободное пространство
		rb		512-($-7c00h)-2

; ключ программы начальной загрузки
		db		55h, 0aah

ant-str, 06.04.2006

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
94K
21 октября 2014 года
Сергей Козлов
0 / / 21.10.2014
+2 / -1
Мне нравитсяМне не нравится
21 октября 2014, 18:56:12
Для Windows можно использовать Winhex.
2.
351
20 января 2009 года
KIV
432 / / 20.01.2009
+1 / -0
Мне нравитсяМне не нравится
3 июля 2009, 21:30:35
Можно было и побольше рассказать.
Например, про функции BIOS, которые можно использовать (int 0x13, int 0x10) и т. п.
3.
37K
24 февраля 2008 года
GuardianSoft
0 / / 24.02.2008
+1 / -0
Мне нравитсяМне не нравится
24 февраля 2008, 00:56:02
Люди, простите "ламера", обьясните, как в Винде прописать в бут этот файл?
я уже год как копаюсь, и ничего не могу найти...
3.1.
275
19 ноября 2005 года
sadovoya
757 / / 19.11.2005
Мне нравитсяМне не нравится
2 марта 2013, 22:09:32
В Линуксе есть утилита dd. Можно с Линуксового LiveCD, например, загрузиться и прописать в бут с ее помощью. Существует версия dd для Windows, но с ней работать не пробовал. Кстати в 512 байт MBR входит и таблица FAT. Будьте осторожны -- она затрется, если все 512 запишите. Лучше потренироваться на виртуалках.
4.
26K
29 августа 2007 года
Rotveiler
20 / / 29.08.2007
+0 / -1
Мне нравитсяМне не нравится
29 августа 2007, 20:54:52
А что значит "настраиваем стек на свободную память"?
5.
28K
12 мая 2007 года
LogoROS
9 / / 12.05.2007
+1 / -0
Мне нравитсяМне не нравится
2 июля 2007, 13:14:27
В Линуксе удобнее записывать так:
dd if=filename of=dev
6.
13K
01 апреля 2006 года
ant-str
36 / / 01.04.2006
+2 / -0
Мне нравитсяМне не нравится
10 июля 2006, 03:22:00
Если есть USB Flash Drive и BIOS поддерживает загрузку с таких накопителей, то очень удобно записать загрузочный сектор на него. Для этого можно написать небольшую программу, которая используя функции CreateFile (имя файла - \\.\PHYSICALDRIVE<номер>), WriteFile и CloseHandle запишет его туда.
7.
Аноним
Мне нравитсяМне не нравится
30 апреля 2006, 14:13:49
Проще всего пнз запихнуть на дискету с помощью утилиты rаwrite. В состав Линукс она входит по умолчанию, под Виндовс есть порт. Также можно записать пнз на компакт-диск с помощью, например Неро. Для этого надо создать проект загрузочный диск и указать в настройках в качестве загрузочного образа пнз.
8.
Аноним
Мне нравитсяМне не нравится
21 апреля 2006, 18:40:57
А как ПНЗ поместить в 1 сектор, каким инструментом
9.
Аноним
+0 / -1
Мне нравитсяМне не нравится
20 апреля 2006, 03:25:46
Спасибо, за инфу Тоха!!!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог