Внедрение 9load в LinuxBIOS

LinuxBIOS поддерживает большое количество разных вариантов «загрузок», к примеру, загрузка ELF образов из памяти FLASH. В этом документе описывается процедура внедрения DOS программы 9load в FLASH, которая позволит загружать узлы как выделенные Plan 9 CPU узлы.

ПРИМЕЧАНИЕ: за дополнительной информацией посетите: http://www.acl.lanl.gov/plan9/flash/.

Этот документ поможет вам настроить загрузку Plan 9 из LinuxBIOS. Он состоит из таких частей:

0. Преамбула
1. Настройка — с чего начать. Файловая организация Plan 9 и Linux
2. Объяснение исходного кода — diff-файлы к исходному коду 4-ой версии Plan 9 с комментариями
3. Исходный код

Преамбула

В документе обсуждаются изменения, подвергнув которым исходный код Plan 9, можно получить хотя бы одну машину, загружающуюся из LinuxBIOS. Целью проекта является создание автономного CPU сервера Plan 9, которому не требуются перемещаемые части. Большая часть работы выполнена Роном Майнничем (Ron Minnich).

1. Настройка

Для удачной модификации исходного кода требуются следующие вещи:

1.1 Сеть Plan 9 (включая файловые серверы, CPU серверы и терминалы
1.1.1 Автономный терминал Plan 9, так как сама настройка довольно хитрая
1.2 Исходный код Plan 9 (можно получить из сети Plan 9 и/или стандартной установки системы)
1.3 Linux машина (используется для компиляции LinuxBIOS)
1.4 Аппаратное обеспечение, на котором может работать LinuxBIOS
1.5-9 Немного терпения

Настройка Plan 9

В настройке используется поддержка концепции союзных каталогов. Она дает возможность хранения только тех файлов, которые мы модифицируем в локальном каталоге, и связываем их при необходимости на верхушке стандартного дерева ядра (в /sys/src/)… Фактически, это происходит в специальном пространстве имен, которое может использоваться в едином терминальном окне (или же, в целом сеансе rio на CPU сервере) для представления скромной среды разработки, тем временем остальная часть экрана, сеанс или терминалы содержат общий, не разработческий вид системы. В конце концов, это позволяет нескольким разным разработчикам работать в одно и то же время (скоро будет показан пример этого) — компиляция ядер в одном окне, загрузчиков 9load в другом, при этом в третьем окне будет видно не модифицированное дерево ядра. Все в одном каталоге.

Каким образом все это работает

В двух словах, когда запускается LinuxBIOS, он выполняет поиск и загрузку загрузчика Plan 9 (9load замаскирован как образ elf32, таким образом, он распознается LinuxBIOS), затем 9load вызывает ядро или же другие варианты загрузки, закачивает, извлекает его и выполняет переход на него. Вуаля.

Детали ниже:

Компиляция (сборка) образа 9load, приспособленного для работы с LinuxBIOS:

9loadlb — это специальная конфигурация в mkfile, которая

#определяет «LinuxBIOS» в течение компиляции и связывает 9loadlb по адресу 0x800000 (отсюда начинается переход LinuxBIOS).

Следующий шаг — копирование 9loadlb на linux машину:

Далее запускаем сценарий mymk из mkelf:

Сценарий порядком уродлив, но нам незачем красота… Вы увидите его ниже, или в linux bundle… Следующий шаг — копирование (команда scp) 9load (замаскированный под elfImage) в то место, откуда он может быть записан на flash:

Если вы видите сообщения об ошибках — просто игнорируйте их… Dhcp сервер будет проинструктирован работать с /386/9pcblah как с ядром и отвечать на запросы bootp от машины, на которой выполняется работа (запрос основан на ethernet адресе машины).

ПРИМЕЧАНИЕ: если вы уверены в том, что 9load подходит вам, попросите Рона записать его вам. В этом случае вам нужно будет лишь поместить ядро 9pccpu в /386/9pcblah :)

Файловая организация

Создайте каталог $home/src для хранения всех модифицируемых файлов, затем в нем создайте организацию каталогов /sys/src, у меня оказалось три каталога: /sys/src/9, /sys/src/boot, /sys/src/libauthconfig, после этого рекурсивно создайте все оставшиеся каталоги, вот что получилось у меня:

Далее если вы хотите отредактировать /sys/src/9/pc/pci.c, выполните команду:

Сценарии

Несколько сценариев используются для автоматизации процесса связывания и облегчения вашей жизни. Помните, что после загрузки машина будет находится в состоянии «вне разработки», например, она не знает что вы сделали модификации в исходном тексте ядра — поэтому вам нужно сообщить ей об соответствующем изменении пространства имен, так что после введения вами mk в /sys/src/9/pc она скомпилирует ваши собственные файлы взамен всех других. Сценарии сами сделают модификации в пространстве имен, вам лишь остается выполнить их перед тем как вы начнете работу над кодом. Вот эти сценарии (они отличаются поскольку один выполняет связывание $home/src/9 как ядерного дерева — я использую его для написания драйверов поддержки нескольких графических карт, т.е. не LinuxBIOS ядер) а другой связывает $home/src/linuxbios/, который эквивалентен $home/src/9, но файлы в нем LinuxBIOS-связанные. Скопируйте сценарии в $home/bin/rc и проделайте над ними chmod 755:

Часть #cmd не обязательна, но все равно пусть она там будет

Материал, создаваемый командами Plan 9…

Реально нам нужна лишь команда lbbind, она связывает все исходные тексты в одном дереве.

Пример типичного сеанса Plan 9:

Linux

Здесь обратимся за помощью к Рону! Обновление CVS из дистрибутива freebios, затем разархивирование включаемого файла mkelf.tgz, далее зовем Рона, чтобы сделать LinuxBIOS подходящим для объединения с 9loadlb… Я совершенно ничего не знаю об этом процессе. Мне остается лишь отрешенно сидеть перед экраном как цыпленок пока Рон работает… После настройки остается лишь использовать сценарий mymk как показано выше и наслаждаться результатом работы :)

2. Diff-файлы исходного кода с комментариями:

/sys/src/boot/pc/mkfile — файл был изменен для соответствия моим привычкам Plan 9. Добавлена новая цель, а именно ядро 9loadlb linuxbios. Различие в том, что код linuxbios есть #ifdef-ed LinuxBios:

/sys/src/boot/pc/l.s — код режима реального времени, 9load загружается в защищенном режиме. Код добавлен для загрузки GDT. Несколько попыток для устранения проблемы с маршрутизацией IRQ, но ничего широко не тестировалось. Мы давным-давно закончили погоню за ошибкой посредством:

теперь ошибка никогда не появляется при нормальной загрузке BIOS…

Материал

diff:

/sys/src/boot/pc/ether.c — модифицирован для апробации ethernet карт без их конфигурирования в plan9.ini (здесь не используется plan9.ini). Все найденные устройства ether получают irq 9.

/sys/src/boot/pc/load.c — переделан для загрузки вне ether0 после завершения поиска и конфигурирования устройств pci и жестких дисков. Если bootp ether0 терпит неудачу (например, дано плохое ядро) load.c запрашивает другое устройство загрузки. Проверка «я слишком большой» закомментирована. Поддержка консоли аппаратная (нет plan9.ini для ее включения). Инициализация console() идет одной из первых — просто я желаю столько вывода отладки, сколько это возможно!

Все остальное вы найдете в каталоге, основная часть моих попыток относится к решению проблемы с прерываниями в эмуляторе 8259 (trap.c), вы безболезненно можете удалить эти файлы.

Изменения в ядре Plan 9

Конфигурационные файлы существенно упрощены — я стремился к уменьшению драйверов насколько это было возможно. У меня получилось ядро в 365 KB, упрощенное и компрессированное…

/sys/src/9/pc/main.c — просто море информации для отладки.

В main() я хотел сделать так, чтобы при возникновении аварийной ситуации я знал что и где полетело… Также была добавлена некоторая отладочная информация о pci (pcihinv() выводит устройства pci).

Copyright © 2003 Перевод Андрей С. Кухар. Последняя модификация 27.08.2003