Загрузчик, разбор ПРАВИЛЬНОГО написания
Я хотел бы разобрать ПРАВИЛЬНОЕ написание загрузчика. В Интернете, как вы знаете, можно найти много версий. Но часто это лишь версии, причем иногда очень абсурдные.
Итак, загрузчик должен загружать ядро с дискеты (диска), и при передаче управлении ядру выводить сообщения, для показания его работы. Главные задачи загрузчика: разобраться с памятью, перевести процессор в защищенный режим, и передать управление ядру. Это минимум. Использоваться для этой цели будет NASM.
И так начнем шаг первый - память
Дескрипторы, селекторы, глобальная дескрипторная таблица, это не большая проблема.
Второй шаг перевод процессора в Защищенный режим.
mov eax,cr0
or al,1
mov cr0,eax
Вот и всё… комментарии излишни, ну, может, конечно, ошибся.
Третий шаг. Передача управления ядру.
И как Проше всего и правильнее это организовать?
Уважаемы господа, прошу не писать "воды".
Я хотел бы разобрать ПРАВИЛЬНОЕ написание загрузчика. В Интернете, как вы знаете, можно найти много версий. Но часто это лишь версии, причем иногда очень абсурдные.
Итак, загрузчик должен загружать ядро с дискеты (диска), и при передаче управлении ядру выводить сообщения, для показания его работы. Главные задачи загрузчика: разобраться с памятью, перевести процессор в защищенный режим, и передать управление ядру. Это минимум. Использоваться для этой цели будет NASM.
И так начнем шаг первый - память
Дескрипторы, селекторы, глобальная дескрипторная таблица, это не большая проблема.
Второй шаг перевод процессора в Защищенный режим.
mov eax,cr0
or al,1
mov cr0,eax
Вот и всё… комментарии излишни, ну, может, конечно, ошибся.
Третий шаг. Передача управления ядру.
И как Проше всего и правильнее это организовать?
Заюзать существующий:-D
Между шагом вторым и третим пропустил ещё один - ядро необходимо загрузить в память с накопителя.
Сделать это можно либо с абсолютного адреса, либо из файла (для этого придётся добавить минимальную подпрограмму анализа файловой системы (FAT, NTFS, EXT и так далее), а именно просчёта адреса файла). Возможно также добавления подпрограммы анализа формата файла в котором он записан (PE, ELF, OBJ и т.д.).
А если предположить, что наша ОС является модульной (как Windows) - загрузка ядра, драйверов, сервисов и прочего - это функция загрузчика!
И потом, почему NASM. Давай писать на AT&T AS или FASM :).
Зачем всё это. Каждый программист создаёт такой загрузчик, который ему нужен!
Заюзать существующий:-D
Нет,это мне не подходит. Я предпочитаю долго разбираться и создовать ,чем понимать и не реализовывать.
А если предположить, что наша ОС является модульной (как Windows) - загрузка ядра, драйверов, сервисов и прочего - это функция загрузчика!
И потом, почему NASM. Давай писать на AT&T AS или FASM :).
Зачем всё это. Каждый программист создаёт такой загрузчик, который ему нужен!
AT&T AS я с ним не сталкивался еще. А на счет ядра я еще не решил, наверно оно будет монолитное, м модульное, писать его буду на С.
Между шагом вторым и третим пропустил ещё один - ядро необходимо загрузить в память с накопителя.
Сделать это можно либо с абсолютного адреса, либо из файла (для этого придётся добавить минимальную подпрограмму анализа файловой системы (FAT, NTFS, EXT и так далее), а именно просчёта адреса файла). Возможно также добавления подпрограммы анализа формата файла в котором он записан (PE, ELF, OBJ и т.д.).
А вот с этим интереснее. Я находил работу с дисками,только на основе прерываний MS-DOS. Если кто сможет скинте книгу,или статью об этом мне на мыло [email]fast2005@mail.ru[/email]. У меня еще появилось желание реализовать страничную организацию памяти. Но стоит ли?
Шаг первый и второй вполне можно поменять местами.
Ни в коем случае! Без подготовки дескрипторов GDT в защищенный режим переходить нельзя!
[QUOTE]Originally posted by ant-str
Шаг первый и второй вполне можно поменять местами.
Ни в коем случае! Без подготовки дескрипторов GDT в защищенный режим переходить нельзя!
Да такое есть, при переходе в защищеный режим процессор сразу устанавливает организацию памяти по умолчанию. Я верно понимаю, что мы сначала переведем в защизеный рижим проц,а потом в страничную организацию памяти установим?
Уважаемы господа, прошу не писать "воды".
Я хотел бы разобрать ПРАВИЛЬНОЕ написание загрузчика. В Интернете, как вы знаете, можно найти много версий. Но часто это лишь версии, причем иногда очень абсурдные.
Итак, загрузчик должен загружать ядро с дискеты (диска), и при передаче управлении ядру выводить сообщения, для показания его работы. Главные задачи загрузчика: разобраться с памятью, перевести процессор в защищенный режим, и передать управление ядру. Это минимум. Использоваться для этой цели будет 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 сместится. Поэтому и нужен переходной файл, в котором точно известен адрес ф-ции.
Я так сделал, по крайней мере у меня пашет.
Да такое есть, при переходе в защищеный режим процессор сразу устанавливает организацию памяти по умолчанию. Я верно понимаю, что мы сначала переведем в защизеный рижим проц,а потом в страничную организацию памяти установим?
Да, конечно. Страничная адрессация устанавливается уже в защищенному режиме. Но там опять нужно будет предварительно мучиться с подготовкой таблиц и каталогов страниц, иначе все опять зависнет.
Да, конечно. Страничная адрессация устанавливается уже в защищенному режиме. Но там опять нужно будет предварительно мучиться с подготовкой таблиц и каталогов страниц, иначе все опять зависнет.
А стоит ли игра свеч? Будет ли выигрыш? И еще одна непонятка, когда я создаю дескрипторы их желательно определять на всё память?
[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? >|
А стоит ли игра свеч? Будет ли выигрыш? И еще одна непонятка, когда я создаю дескрипторы их желательно определять на всё память?
Страничная адресация конечно стоит свеч. С ее помощью легко реализуется механизм виртуальной памяти, динамических библиотек, каналов и других взаимодействий между процессами. Так же легко происходит линковка программ. Реально процесс может быть загружен куда угодно, хоть на диск, а думать он будет про себя, что он находится по совершенно определенному адресу, записанному в каталоге страниц.
По поводу дескрипторов, я думаю что имеются ввиду дескрипторы сегментов кода, данных и состояния задачи. Их предел можно установить на маусимум 4 Гб. Тогда сегментацию ты как будто бы отключишь. Насколько я знаю, так, или почти так везде и сделано. Либо делят эти 4 Гб на 2 части. Системные процессы работают вверху, а прикладные - в нижней половине. В общем, комбинаций много. В конце концов, зачем все копировать у Линукс и ему подобных, можно и самому что нибудь интересное придумать. Да плюс еще - можно использовать 4, а не 2 как у всех, кольца защиты, а еще поэкспериментировать с гранулярностью и размером виртуальных страниц.
>ant-str. а я разьве что то говорил о Unix? Ammelion сказал что собирается писать ядро на С. И я рассказал о своем опыте подобного написания ядра (ну конечно ядра - громко сказано, скорее "Hallo world" :)) на С, а загрузчика на nasm. Может быть человеку пригодится.
Да кстати. Я как то мучался с дисководом в PM. Могу скинуть исходник, если нужно. Работает все через порты. Ф-ция просто считывает любой сектор с дискеты в оперативку. На ее основе можно писать уже драйверы FAT, Ext2 или чего угодно. Исходник конечно полукорявый но рабочий.
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 (где их искать - не знаю)
И потом, всё зависит от того какое у тебя "ядро".
Стоит ли использовать страничную адресацию, зависит от целей которые ты ставишь.
Так это ясно, тогд а есть еще дубинный вопрос, а еслия хочу,чтоб моя система находилась на другом жестком диске и обойтись без дискеты, это реально сделать или сложно?(с учето установелного WIndows)
Конечно реально. Найди где нибудь описание как через порты обращаться к винчестеру, установи в BIOS загрузку с винта - и вперед. Только это опасно. Если что нибудь нитуда хоть раз запишешь - виндам твоим может настать крышка, сам понимаешь. Придется весь винт заново форматировать. Так что лучше вначале все делать с флопиком. Его не жалко. Да, и еще. На стадии начальной разработки, очень поможет виртуальная машина, например WMWARE. Вероятно, там как то можно создать и виртуальный винчестер. Эта штука просто очень ускоряет разработку. Не надо каждый раз перезагружать комп, вставлять дискету и т.д. Конечно она не заменит полностью реальный компьютер, но все же очень поможет.
P.S. Рад буду ответить на другие вопросы по теме. мыло: [email]alpa4ino@mail.ru[/email]. Сам просто застрял в разработке чуть дальше, и поэтому жду кого нибудь кто дойдет до того места и поможет :):):). Удачи...
P.S. Рад буду ответить на другие вопросы по теме. мыло: [email]alpa4ino@mail.ru[/email]. Сам просто застрял в разработке чуть дальше, и поэтому жду кого нибудь кто дойдет до того места и поможет :):):). Удачи...
Спасиб, я пока собираю теорию и не особо получается подойти к реализации. Если можете скинте на мыло какие нибудь статьи про работу с дисками и памятью,и NASMом,заранее благодарен, а то у меня один учебник по ASM под MASM.
Спасиб, я пока собираю теорию и не особо получается подойти к реализации. Если можете скинте на мыло какие нибудь статьи про работу с дисками и памятью,и NASMом,заранее благодарен, а то у меня один учебник по ASM под MASM.
У меня есть книжка Кулакова "Программирование дисковых подсистем"
http://shop.piter.com/book/978531800623/
Там описано все, от флопика до DVD, да и еще много всякого полезного, типа CMOS, DMA и т.д. Если попадется в книжном, бери. Ну а так, и в инете найти наверняка все это можно. Google.ru и вперед.;)