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

Ваш аккаунт

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

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

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

Загрузчик, разбор ПРАВИЛЬНОГО написания

10K
01 апреля 2006 года
Amellion
28 / / 01.03.2006
Уважаемы господа, прошу не писать "воды".

Я хотел бы разобрать ПРАВИЛЬНОЕ написание загрузчика. В Интернете, как вы знаете, можно найти много версий. Но часто это лишь версии, причем иногда очень абсурдные.

Итак, загрузчик должен загружать ядро с дискеты (диска), и при передаче управлении ядру выводить сообщения, для показания его работы. Главные задачи загрузчика: разобраться с памятью, перевести процессор в защищенный режим, и передать управление ядру. Это минимум. Использоваться для этой цели будет NASM.

И так начнем шаг первый - память

Дескрипторы, селекторы, глобальная дескрипторная таблица, это не большая проблема.

Второй шаг перевод процессора в Защищенный режим.

mov eax,cr0
or al,1
mov cr0,eax

Вот и всё… комментарии излишни, ну, может, конечно, ошибся.

Третий шаг. Передача управления ядру.

И как Проше всего и правильнее это организовать?
260
02 апреля 2006 года
Ramon
1.1K / / 16.08.2003
Цитата:
Originally posted by Amellion
Уважаемы господа, прошу не писать "воды".

Я хотел бы разобрать ПРАВИЛЬНОЕ написание загрузчика. В Интернете, как вы знаете, можно найти много версий. Но часто это лишь версии, причем иногда очень абсурдные.

Итак, загрузчик должен загружать ядро с дискеты (диска), и при передаче управлении ядру выводить сообщения, для показания его работы. Главные задачи загрузчика: разобраться с памятью, перевести процессор в защищенный режим, и передать управление ядру. Это минимум. Использоваться для этой цели будет NASM.

И так начнем шаг первый - память

Дескрипторы, селекторы, глобальная дескрипторная таблица, это не большая проблема.

Второй шаг перевод процессора в Защищенный режим.

mov eax,cr0
or al,1
mov cr0,eax

Вот и всё… комментарии излишни, ну, может, конечно, ошибся.

Третий шаг. Передача управления ядру.

И как Проше всего и правильнее это организовать?



Заюзать существующий:-D

13K
02 апреля 2006 года
ant-str
36 / / 01.04.2006
Шаг первый и второй вполне можно поменять местами.

Между шагом вторым и третим пропустил ещё один - ядро необходимо загрузить в память с накопителя.
Сделать это можно либо с абсолютного адреса, либо из файла (для этого придётся добавить минимальную подпрограмму анализа файловой системы (FAT, NTFS, EXT и так далее), а именно просчёта адреса файла). Возможно также добавления подпрограммы анализа формата файла в котором он записан (PE, ELF, OBJ и т.д.).

А если предположить, что наша ОС является модульной (как Windows) - загрузка ядра, драйверов, сервисов и прочего - это функция загрузчика!

И потом, почему NASM. Давай писать на AT&T AS или FASM :).

Зачем всё это. Каждый программист создаёт такой загрузчик, который ему нужен!
10K
03 апреля 2006 года
Amellion
28 / / 01.03.2006
Цитата:
Originally posted by Ramon
Заюзать существующий:-D



Нет,это мне не подходит. Я предпочитаю долго разбираться и создовать ,чем понимать и не реализовывать.

Цитата:
Originally posted by ant-str

А если предположить, что наша ОС является модульной (как Windows) - загрузка ядра, драйверов, сервисов и прочего - это функция загрузчика!

И потом, почему NASM. Давай писать на AT&T AS или FASM :).

Зачем всё это. Каждый программист создаёт такой загрузчик, который ему нужен!



AT&T AS я с ним не сталкивался еще. А на счет ядра я еще не решил, наверно оно будет монолитное, м модульное, писать его буду на С.

Цитата:
Originally posted by ant-str


Между шагом вторым и третим пропустил ещё один - ядро необходимо загрузить в память с накопителя.
Сделать это можно либо с абсолютного адреса, либо из файла (для этого придётся добавить минимальную подпрограмму анализа файловой системы (FAT, NTFS, EXT и так далее), а именно просчёта адреса файла). Возможно также добавления подпрограммы анализа формата файла в котором он записан (PE, ELF, OBJ и т.д.).



А вот с этим интереснее. Я находил работу с дисками,только на основе прерываний MS-DOS. Если кто сможет скинте книгу,или статью об этом мне на мыло [email]fast2005@mail.ru[/email]. У меня еще появилось желание реализовать страничную организацию памяти. Но стоит ли?

8.6K
03 апреля 2006 года
Al Pachino
10 / / 03.11.2004
[QUOTE]Originally posted by ant-str
Шаг первый и второй вполне можно поменять местами.

Ни в коем случае! Без подготовки дескрипторов GDT в защищенный режим переходить нельзя!
10K
03 апреля 2006 года
Amellion
28 / / 01.03.2006
Цитата:
Originally posted by Al Pachino
[QUOTE]Originally posted by ant-str
Шаг первый и второй вполне можно поменять местами.

Ни в коем случае! Без подготовки дескрипторов GDT в защищенный режим переходить нельзя!



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

8.6K
03 апреля 2006 года
Al Pachino
10 / / 03.11.2004
Цитата:
Originally posted by Amellion
Уважаемы господа, прошу не писать "воды".

Я хотел бы разобрать ПРАВИЛЬНОЕ написание загрузчика. В Интернете, как вы знаете, можно найти много версий. Но часто это лишь версии, причем иногда очень абсурдные.

Итак, загрузчик должен загружать ядро с дискеты (диска), и при передаче управлении ядру выводить сообщения, для показания его работы. Главные задачи загрузчика: разобраться с памятью, перевести процессор в защищенный режим, и передать управление ядру. Это минимум. Использоваться для этой цели будет NASM.

И так начнем шаг первый - память

Дескрипторы, селекторы, глобальная дескрипторная таблица, это не большая проблема.

Второй шаг перевод процессора в Защищенный режим.

mov eax,cr0
or al,1
mov cr0,eax

Вот и всё… комментарии излишни, ну, может, конечно, ошибся.

Третий шаг. Передача управления ядру.

И как Проше всего и правильнее это организовать?


В принципе организовать передачу ядру, написанному, как я понял на С, несложно. Можно подсмотреть в доморощенных осях, коих миллионы в сети. Я делал примерно так.

Где то в загрузчике вызывается ядро:
JMP Kernel

Kernel - это адрес ядра в оперативке. Туда ты его должен был предварительно скопировать с диска, или с чего ты там копируешь?

А ядро нужно слинковать так:
ld -Ttext Kernel -o kernel.bin startup.o kernel.o все другие объектниуки...
objcopy kernel.bin -O binary

ld и objcopy - это стандартные утилиты GCC, Kernel - все тот же адрес входа в ядро. Единственно, хочу обратить внимание на файл startup.o. Он нужен в качестве переходника. Выглядить исходник его может очень просто, например так:

//sturtup.c
void startup() {kernel();}

где kernel - это ф-ция входа в само ядро. Этот переходник нужен для того, что, если ты слинкуешь и вызовешь kernel напрямую, то при компиляции в начало объектника kernel.o будут вставлены все константы и всякая шняга из этого же исходника, и адрес ф-ции kernel сместится. Поэтому и нужен переходной файл, в котором точно известен адрес ф-ции.
Я так сделал, по крайней мере у меня пашет.

8.6K
03 апреля 2006 года
Al Pachino
10 / / 03.11.2004
Цитата:
Originally posted by Amellion
Да такое есть, при переходе в защищеный режим процессор сразу устанавливает организацию памяти по умолчанию. Я верно понимаю, что мы сначала переведем в защизеный рижим проц,а потом в страничную организацию памяти установим?


Да, конечно. Страничная адрессация устанавливается уже в защищенному режиме. Но там опять нужно будет предварительно мучиться с подготовкой таблиц и каталогов страниц, иначе все опять зависнет.

10K
03 апреля 2006 года
Amellion
28 / / 01.03.2006
Цитата:
Originally posted by Al Pachino
Да, конечно. Страничная адрессация устанавливается уже в защищенному режиме. Но там опять нужно будет предварительно мучиться с подготовкой таблиц и каталогов страниц, иначе все опять зависнет.



А стоит ли игра свеч? Будет ли выигрыш? И еще одна непонятка, когда я создаю дескрипторы их желательно определять на всё память?

13K
04 апреля 2006 года
ant-str
36 / / 01.04.2006
Цитата:
Originally posted by Al Pachino
[QUOTE]Originally posted by ant-str
Шаг первый и второй вполне можно поменять местами.



Ни в коем случае! Без подготовки дескрипторов GDT в защищенный режим переходить нельзя! [/QUOTE]

Дело в том, что в таком случае теневая часть сегментных регистров сохранится и будет такой же как в реальном режиме. Единственное ограничение - нельзя записывать в сегментные регистры CS, DS, SS и другие, так как в защищённом режиме (то есть PE=1) это неминуемо приведёт к обращению к GDT. А поскольку GDT не создана, то процессор сгенерирует General Protection Failure.

И вообще, руководство Intel весьма ограничено. Возможно установить такие режимы, которые не предусмотрены руководством Intel. Например включить 32-битную адресацию в реальном режиме!

Поменьше верь тому, что пишет Intel!

TO Al Pachino - разговор не о UNIX, а в принципе о неписании загрузчика. :) Как я понял. Я ошибаюсь, people? >|

8.6K
04 апреля 2006 года
Al Pachino
10 / / 03.11.2004
Цитата:
Originally posted by Amellion
А стоит ли игра свеч? Будет ли выигрыш? И еще одна непонятка, когда я создаю дескрипторы их желательно определять на всё память?


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

По поводу дескрипторов, я думаю что имеются ввиду дескрипторы сегментов кода, данных и состояния задачи. Их предел можно установить на маусимум 4 Гб. Тогда сегментацию ты как будто бы отключишь. Насколько я знаю, так, или почти так везде и сделано. Либо делят эти 4 Гб на 2 части. Системные процессы работают вверху, а прикладные - в нижней половине. В общем, комбинаций много. В конце концов, зачем все копировать у Линукс и ему подобных, можно и самому что нибудь интересное придумать. Да плюс еще - можно использовать 4, а не 2 как у всех, кольца защиты, а еще поэкспериментировать с гранулярностью и размером виртуальных страниц.

>ant-str. а я разьве что то говорил о Unix? Ammelion сказал что собирается писать ядро на С. И я рассказал о своем опыте подобного написания ядра (ну конечно ядра - громко сказано, скорее "Hallo world" :)) на С, а загрузчика на nasm. Может быть человеку пригодится.

Да кстати. Я как то мучался с дисководом в PM. Могу скинуть исходник, если нужно. Работает все через порты. Ф-ция просто считывает любой сектор с дискеты в оперативку. На ее основе можно писать уже драйверы FAT, Ext2 или чего угодно. Исходник конечно полукорявый но рабочий.

13K
04 апреля 2006 года
ant-str
36 / / 01.04.2006
Прости Al Pachino, виноват. Сразу не понял.

To Amellion. Если ядро находиться по фиксированному адресу на диске, то всё очень просто. Нужно загрузить его в оперативную память компьютера с диска (либо с помощью стандартных дисковых сервисов BIOS, либо с помощью расширенных дисковых функций BIOS (EDD 1.1, EDD 3.0)) и передать ему управление.
Но это самый простой вариант.
Поэтому, прочитай следующие доки с сайта http://phoenix.com.
Phoenix BIOS User's Manual (там есть описание стандартных дисковых сервисов BIOS)
EDD 1.1 Specification (спецификация на расширенные дисковые сервисы BIOS)
EDD 3.0 в большинстве компьютеров сейчас не применяется, так что можно не смотреть.
Также не забудь, что номер диска с которого производится загрузка содержиться в регистре DL при передачи управления от BIOS к загрузочному сектору (смотри BIOS Boot Specification 1.01 там же).
Кроме того, если комп в защищённом режиме, то сервисы BIOS использовать нельзя по понятным причинам. Поэтому сходи и почитай доки на http://t10.org (SCSI) и http://t13.org (ATA/ATAPI) если интересует. Если у тебя накопитель USB - нет проблем - читай спецификации по USB (http://usb.org). Хочешь непосредственно работать с дискетами, читай старые руководства IBM и Intel (где их искать - не знаю)
И потом, всё зависит от того какое у тебя "ядро".
Стоит ли использовать страничную адресацию, зависит от целей которые ты ставишь.
10K
04 апреля 2006 года
Amellion
28 / / 01.03.2006
Так это ясно, тогд а есть еще дубинный вопрос, а еслия хочу,чтоб моя система находилась на другом жестком диске и обойтись без дискеты, это реально сделать или сложно?(с учето установелного WIndows)
8.6K
04 апреля 2006 года
Al Pachino
10 / / 03.11.2004
Цитата:
Originally posted by Amellion
Так это ясно, тогд а есть еще дубинный вопрос, а еслия хочу,чтоб моя система находилась на другом жестком диске и обойтись без дискеты, это реально сделать или сложно?(с учето установелного WIndows)


Конечно реально. Найди где нибудь описание как через порты обращаться к винчестеру, установи в BIOS загрузку с винта - и вперед. Только это опасно. Если что нибудь нитуда хоть раз запишешь - виндам твоим может настать крышка, сам понимаешь. Придется весь винт заново форматировать. Так что лучше вначале все делать с флопиком. Его не жалко. Да, и еще. На стадии начальной разработки, очень поможет виртуальная машина, например WMWARE. Вероятно, там как то можно создать и виртуальный винчестер. Эта штука просто очень ускоряет разработку. Не надо каждый раз перезагружать комп, вставлять дискету и т.д. Конечно она не заменит полностью реальный компьютер, но все же очень поможет.

P.S. Рад буду ответить на другие вопросы по теме. мыло: [email]alpa4ino@mail.ru[/email]. Сам просто застрял в разработке чуть дальше, и поэтому жду кого нибудь кто дойдет до того места и поможет :):):). Удачи...

10K
04 апреля 2006 года
Amellion
28 / / 01.03.2006
Цитата:
Originally posted by Al Pachino
P.S. Рад буду ответить на другие вопросы по теме. мыло: [email]alpa4ino@mail.ru[/email]. Сам просто застрял в разработке чуть дальше, и поэтому жду кого нибудь кто дойдет до того места и поможет :):):). Удачи...



Спасиб, я пока собираю теорию и не особо получается подойти к реализации. Если можете скинте на мыло какие нибудь статьи про работу с дисками и памятью,и NASMом,заранее благодарен, а то у меня один учебник по ASM под MASM.

8.6K
05 апреля 2006 года
Al Pachino
10 / / 03.11.2004
Цитата:
Originally posted by Amellion
Спасиб, я пока собираю теорию и не особо получается подойти к реализации. Если можете скинте на мыло какие нибудь статьи про работу с дисками и памятью,и NASMом,заранее благодарен, а то у меня один учебник по ASM под MASM.



У меня есть книжка Кулакова "Программирование дисковых подсистем"
http://shop.piter.com/book/978531800623/
Там описано все, от флопика до DVD, да и еще много всякого полезного, типа CMOS, DMA и т.д. Если попадется в книжном, бери. Ну а так, и в инете найти наверняка все это можно. Google.ru и вперед.;)

10K
05 апреля 2006 года
Amellion
28 / / 01.03.2006
адо постараться купить. Спасибо. А то как-то засел. В ближайшее время начну.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог