OSDev
http://osdev.su/

Самопальные загрузчики
http://osdev.su/viewtopic.php?f=18&t=543
Страница 1 из 8

Автор:  DJ PhoeniX [ 03 май 2012, 19:30 ]
Заголовок сообщения:  Самопальные загрузчики

Вот читаю я форумы, мануалы, и не понимаю одной вещи:

Народ, а откуда столько желания писать загрузчики? Свои собственные, со своими багами и своими недоработками?

Взять ту же Малинку Станислава (чувак, не в обиду). В инструкции - "запишите бинарник на флешку". У меня флешка всего одна, на 32 гигабайта, данных на ней - довольно много, и терять всё это ради одного теста - это как-то... ну, нелогично что ли? А потестить хочется, скриншоты сочные.
Так о чём это я... Загружаемый образ можно сделать очень легко - написать несколько строк на ассемблере:
Код:
format binary
org 0x200000
public _start
section '.text'
_start:
   jmp _multiboot_entrypoint
   align 4
_multiboot_header:
   dd 0x1BADB002
   dd 0x00010003
   dd -(0x1BADB002 + 0x00010003)
   dd _multiboot_header
   dd _start
   dd _end
   dd _end
   dd _multiboot_entrypoint
   align 4
_multiboot_entrypoint:
        ; Код операционки

_end:

И ваша операционка будет спокойно загружаться любым multiboot-совместимым загрузчиком (будь то lilo, grub, syslinux), а управление вы будете получать уже в защищённом режиме на _multiboot_entrypoint. Причём установка любого такого загрузчика не ломает текущую файловую систему, и флешка сохраняет своё прямое назначение. Если немного подумать, то можно и разбить код операционки на много-много файлов, и собирать линковщиком (как сделал я).
Так вопрос... Нафига создавать свои загрузчики?

Автор:  grindars [ 03 май 2012, 19:37 ]
Заголовок сообщения:  Re: Самопальные загрузчики

Тот же вопрос. У меня ядро 64-битное, и 32-битный мультибутовый стаб его бы несколько уродовал, поэтому я использую syslinux. Гружу им бутстрап в формате com32, который с помощью syslinux-ового же API загружает ядро в ELF64, подготавливает данные для него, строит начальные таблицы страниц и запускает.

Автор:  DJ PhoeniX [ 03 май 2012, 19:41 ]
Заголовок сообщения:  Re: Самопальные загрузчики

grindars, я бы всё таки грузился в х32, дёргал cpuid на предмет поддержки лонгмода, и только после этого прыгал в него. Так у тебя будет хотя бы шанс намекнуть юзеру, что пора апгрейдиться.

Автор:  grindars [ 03 май 2012, 19:43 ]
Заголовок сообщения:  Re: Самопальные загрузчики

Так бутстрап и грузится в x32, дергает CPUID и сообщает юзеру. Он вообще юзер-френдли :).

Автор:  Bargest [ 03 май 2012, 20:46 ]
Заголовок сообщения:  Re: Самопальные загрузчики

У самопальных загрузчиков есть один несомненный плюс. Старт происходит в х16, поэтому можно использовать функции биоса для установки видеорежимов, чтения с диска и получения карты памяти без всяких v86 и эмуляторов. А копаться в творениях сообщества опенсорца чтобы выполнить такие операции не всегда есть желание.
У меня загрузчик заключается в ~350-байтовой MBR-ке, которая грузит первый файл FAT32. До того момента, когда понадобится нормальный загрузчик, будет эта затычка. А когда понадобится - уже подумаю, что стоит делать: брать мультибут (и какой из них) или же написать небольшой загрузчик только с необходимыми функциями. Благо в килобайте кода в х16 сложно допустить какие-то фатальные ошибки.

Автор:  grindars [ 03 май 2012, 20:50 ]
Заголовок сообщения:  Re: Самопальные загрузчики

У syslinux есть API. Задаете номер прерывания, входные регистры, вызываете его функцию, он выходит в реальный режим, вызывает биос, возвращается в защищенный и вы получаете выходные. Достаточно удобно, и при этом можно работать в 32-битном режиме и не заморачиваться ограничениями на размер, что актуально, если загрузчик сложный.

И да, всё это описано в документации, так что копаться нигде не надо. И его собственное API для работы с ФС позволяет работать одинаково где угодно - хоть с жесткого диска, хоть с флешки, хоть по сети.

Автор:  Bargest [ 03 май 2012, 20:56 ]
Заголовок сообщения:  Re: Самопальные загрузчики

Всё равно любой мультибут накладывает ограничения. Грузит только выше определенного адреса, стартует в х32 и делает ещё большую кучу лишней работы.
Как по мне, система должна стоять на своём разделе диска. Одна система - один раздел. Ставить десяток систем на один раздел - имхо фича бесполезная.
Если использовать такой подход, то смысл в мультибуте почти полностью отпадает. Выбор раздела с лихвой умещается в MBR, а на разделах уже свои бутсекторы, которые могут делать что угодно. Поэтому я не хочу лишний раз накладывать на себя ограничения.

Автор:  grindars [ 03 май 2012, 21:03 ]
Заголовок сообщения:  Re: Самопальные загрузчики

Грузит в первое свободное место в ОЗУ, режим - на выбор: есть 16 бит и 32 бита.

Автор:  Bargest [ 03 май 2012, 21:05 ]
Заголовок сообщения:  Re: Самопальные загрузчики

А сколько сам в памяти занимает? В смысле где находится это первое свободное место?

Автор:  grindars [ 03 май 2012, 21:08 ]
Заголовок сообщения:  Re: Самопальные загрузчики

Зависит от варианта. Полный сетевой - кил 30, наверное. Адреса не определены: 16-битные исполняемые файлы - формата COM, т.е. грузятся по смещению 0x100 в любой сегмент, а 32-битные должны быть самоперемещаемыми.

Страница 1 из 8 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/