OSDev
http://osdev.ru/

GRUB2
http://osdev.ru/viewtopic.php?f=12&t=647
Страница 3 из 5

Автор:  phantom-84 [ 20 ноя 2012, 20:13 ]
Заголовок сообщения:  Re: GRUB2

Модифицированный GRUB 2 (beta) в sys-формате. Адаптационным кодом пока не занимался, но зато интегрировал в ядро поддержку GPT/MBR-разметки, ISO9660, FAT, NTFS, Ext2FS. Есть еще идея интегрировать в ядро модуль "нормального режима" (normal.mod). Пакет разделил на две части:
1) ядро загрузчика и readme.txt;
2) обязательная для нормальной работы загрузчика папка boot с несколькими модулями (минимальный набор; из поддерживающих загрузочные команды модулей присутствует только multiboot; если нужно подгружать модули вашего ядра, добавьте в файл command.lst строку "module: multiboot") и примером конфигурационного файла, а также папка system с примером "пользовательского" ядра.

Ссылки:
1) sys-grubldr-2.0-compact.zip
2) sys-grubldr-2.0-compact-add.zip

Автор:  Yoda [ 21 ноя 2012, 00:10 ]
Заголовок сообщения:  Re: GRUB2

А почему бета, когда на оф. сайте, вроде бы, релиз лежит?

Автор:  phantom-84 [ 21 ноя 2012, 01:29 ]
Заголовок сообщения:  Re: GRUB2

У меня на официальном сайте "такое" не лежит :lol:

Я приписал это, чтобы подчеркнуть, что версия сырая в плане проработки адаптационного кода. Но все работает в том числе и на NTFS-томах (только не забывайте "прописывать" номер соответствующего раздела внутри kernel.sys, пока первичные загрузчики не предоставляют этого номера). Единственное, что не будет работать, так это загрузка самого kernel.sys, как multiboot-совместимого ядра (multiboot-заголовок я не обнулил, т.к. он в sys-формате для данной версии лежит слишком "далеко"). Прикол в том, что оригинальный grub.pk работает в этом плане нормально, т.к. его формат в целом совпадает с оригинальным core.img, а вот в kernel.sys это уже не прокатывает (как уже сказал, оригинальный заголовок лежит слишком "далеко", причем это может быть только первой, но не единственной причиной неработоспособности). В основе по-прежнему версия 1.98 (см. readme.txt). Бинарники взяты из убунту 10.10. Эта информация может быть полезна тем, кто будет "доукомплектовывать" папку /boot/grub нужным функционалом (прежде всего, в виде соответствующих модулей). Может быть, потом сам выложу все бинарники.

Автор:  Yoda [ 01 дек 2012, 22:04 ]
Заголовок сообщения:  Re: GRUB2

В GRUB в версиях вплоть до 1.99 в области переменных выделено два 32-битных поля - одно называется "grub_install_dos_part", другое "grub_install_bsd_part". Которое из них должно заполняться номером раздела и в какой степени? Подозреваю, что dos, т.к. когда речь идёт о BSD-разделах, обычно подразумевают дополнительное разбиение разделов на подразделы, свойственное BSD. Это, похоже, совсем не мультибут. Если dos, то, верятно, должны быть инициализированы все 32 бита? Инсталлятор GRUB для версии 1.96 забивает номер dos_part нулями, а bsd_part оставляет 0xFFFFFFFF. Для версий 1.97-98 оба поля забиты FF. В версии 1.99 оба поля забиты странной величиной 0xFFFFFFFE. Только в версии 2.0 полноценные 4 байта идентификатора мультибут-номера диска, раздела и подраздела. Опять же, нумерация разделов. Надо полагать, в версиях до 1.99 включительно нумерация разделов начинается с нуля?

Автор:  phantom-84 [ 02 дек 2012, 00:50 ]
Заголовок сообщения:  Re: GRUB2

Вообще это не альтернативные поля, а взаимодополняющие, т.е. для BSD-разделов будут задействованы оба поля, а для обычных только dos_part. Думаю, если бы ты ставил GRUB в BSD-раздел, то инсталлятор проинициализировал бы оба поля валидными значениями. Посмотри код MB-точки входа самого GRUB'а. Там учитываются оба уровня, просто байты расширяются в двойные слова. С версиями 1.99 и 2.00 не разбирался, поэтому ничего сказать не могу. Разницы между 1.96 и 1.97/1.98 не замечал, т.к. рабочий вариант модиф. GRUB'а всегда делал на основе версии 1.98. Надеюсь, различия были выявлены при всех прочих равных условиях. Лично я и для версии 1.98 использую значение 0xFFFFFFFF (не 0xFF) после расширения байта в двойное слово, т.к. именно такие значения этих полей указаны в имеющихся у меня оригинальных исходниках (код MB-точки входа GRUB'а вроде бы тоже расширяет байтовое значение 0xFF в 0xFFFFFFFF).

В любом случае у меня нет поддержки BSD-разделов. Меня больше интересует нумерация разделов при GPT-разметке, т.к. я могу лишь предполагать, что там используется нумерация 0-254. Нужно потестить модиф. GRUB на дисках с GPT-разметкой.

Автор:  Yoda [ 02 дек 2012, 13:39 ]
Заголовок сообщения:  Re: GRUB2

phantom-84 писал(а):
Вообще это не альтернативные поля, а взаимодополняющие, т.е. для BSD-разделов будут задействованы оба поля, а для обычных только dos_part.

Ну да, это естественно.

phantom-84 писал(а):
С версиями 1.99 и 2.00 не разбирался, поэтому ничего сказать не могу. Разницы между 1.96 и 1.97/1.98 не замечал, т.к. рабочий вариант модиф. GRUB'а всегда делал на основе версии 1.98.

1.99 такая же, как и предыдущие. В 2.00 уже сильные отличия области переменных, там всё поле как в мультибут спецификации.

phantom-84 писал(а):
Меня больше интересует нумерация разделов при GPT-разметке, т.к. я могу лишь предполагать, что там используется нумерация 0-254. Нужно потестить модиф. GRUB на дисках с GPT-разметкой.

То есть, в версиях до 1.99 включительно разделы нумеруются начиная с нуля?
Ещё пока непонятно, а где в этих версиях передаётся номер диска?

Автор:  phantom-84 [ 03 дек 2012, 09:47 ]
Заголовок сообщения:  Re: GRUB2

Yoda писал(а):
То есть, в версиях до 1.99 включительно разделы нумеруются начиная с нуля?
Вообще в Multiboot Spec. разделы нумеруются с нуля. С единицы они стали нумероваться в GRUB 2 только на уровне пользователя для его удобства, чтобы было как в линухе. Но это мелочи, я уже много раз говорил про элементарность преобразования одного в другое. И я полагаю, что твои загрузчики будут нумеровать разделы, начиная с 1, как у меня (ведь ты сам об этом сказал), иначе мне придется в очередной раз вносить изменения в код mksys и опять "отзывать" sys-grubldr. В sys-grubldr заложено именно такое поведение, о чем даже в readme написано. Последний раз я говорил о нумерации GPT-разделов. В имеющейся у меня версии Multiboot Spec. об этом ни слова. Я не проверял загрузку с GPT-разделов в модифицированном GRUB'е. Понадеялся на то, что все будет работать аналогично: на уровне пользователя GRUB'а и в нашем "соглашении" разделы будут нумероваться с 1, а внутри GRUB'а с 0 (в соответствии с Multiboot Spec.). Поэтому нужно потестировать последний модиф. GRUB на предмет нормальной работы с GPT-разделами. Для sys-grubldr сейчас достаточно просто прописать в соответствующей ячейке 1 (см. readme) и убедиться, что загрузка выполняется успешно и причем именно с первого GPT-раздела.

Цитата:
Ещё пока непонятно, а где в этих версиях передаётся номер диска?
Что исходники вообще не смотрим?
Код:
LOCAL(bootit):
   /* print a newline */
   MSG(notification_done)
   popw   %dx   /* this makes sure %dl is our "boot" drive */
   ljmp   $0, $(GRUB_BOOT_MACHINE_KERNEL_ADDR + 0x200)

Автор:  Yoda [ 04 дек 2012, 00:13 ]
Заголовок сообщения:  Re: GRUB2

phantom-84 писал(а):
Вообще в Multiboot Spec. разделы нумеруются с нуля. С единицы они стали нумероваться в GRUB 2 только на уровне пользователя для его удобства, чтобы было как в линухе.

Да не, это всё понятно, и про мультибут понятно. Я про внутреннее представление в этой области переменных. Ладно, попробую выяснить экспериментально.

phantom-84 писал(а):
Но это мелочи, я уже много раз говорил про элементарность преобразования одного в другое. И я полагаю, что твои загрузчики будут нумеровать разделы, начиная с 1, как у меня (ведь ты сам об этом сказал)

Да преобразование, конечно, мелочь. И всё в порядке, как договорились, так разделы и нумеруются.

phantom-84 писал(а):
Что исходники вообще не смотрим?

Да смотрим-смотрим :). Только уже глаз замылился, я в другой загрузочный сектор смотрел. ОК, нашёл, всё в порядке, пасиб.

Автор:  phantom-84 [ 04 дек 2012, 02:06 ]
Заголовок сообщения:  Re: GRUB2

Yoda писал(а):
Я про внутреннее представление в этой области переменных. Ладно, попробую выяснить экспериментально.
Я писал о том, как я это определял. Посмотри код MB-точки входа GRUB'а в плане распаковки отдельных байт boot_device в двойные слова. Если не ошибаюсь, в версии 1.98 номера разделов расширяются нулями, а значение 0xFF единицами (я сейчас уже точно не помню, но вроде бы конвертацию "моего" номера раздела я делал так: сначала расширял нулями, а потом делал декремент двойного слова). Может, лучше займешься более новыми версиями, чтобы обмен опытом у нас получился взаимовыгодным.

Автор:  phantom-84 [ 04 дек 2012, 02:36 ]
Заголовок сообщения:  Re: GRUB2

Вообще может ты и прав насчет версии 1.98. Приведенный ниже код оставляет без изменений соответствующие переменные при значении номера раздела в формате Multiboot Spec. 0xFF. Я видимо ориентировался на исходные значения этих переменных в исходниках, а ты на значения, устанавливаемые инсталлятором, что наверное более правильно, хотя мой вариант тоже работает. Это точно, что инсталлятор записывает в переменные именно 0x000000FF (как я понимаю, речь естественно идет о цельном загрузочном устройстве)?
Код:
multiboot_trampoline:
   /* fill the boot information */
   movl   %edx, %eax
   shrl   $8, %eax
   xorl   %ebx, %ebx
   cmpb   $0xFF, %ah
   je   1f
   movb   %ah, %bl
   movl   %ebx, EXT_C(grub_install_dos_part)
1:
   cmpb   $0xFF, %al
   je   2f
   movb   %al, %bl
   movl   %ebx, EXT_C(grub_install_bsd_part)
2:
   shrl   $24, %edx
        movb    $0xFF, %dh
   /* enter the usual booting */
   call   prot_to_real

Кстати команда mov dh,0FFh какая-то "мутная". Помню, я долго не мог понять, где далее используется это значение dh. В итоге так и не нашел, но на всякий случай вписал такую же команду в мой адаптационный код и прокомментировал: "я не знаю, что это значит" :D Только сейчас в браузере заметил, что она даже оформлена иначе. Видать, какой-то специалист тоже ее вписал на всякий случай :?

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