Yoda писал(а):
Слуште, я не понимаю, у всех тут так всё очевидно получается, один я тупой. У нас ОЧЕНЬ МАЛО базовой памяти, всего 640 к и даже того меньше, а все хотят сразу и базу поднять и под стек выделить 32к и при этом чтобы 620к образа по-прежнему грузились.
Не надо сваливать все в одну кучу. Про базу в 32 Кб я сейчас говорил только в качестве примера. Во вторичном загрузчике я под этой базой помимо стека еще 24-килобайтный драйвер размещаю (правда после инициализации 1 Кб в конце доступного ему пространства отбирается, но это уже мелочи). Под стек остается 6,75 Кб (за вычетом IVT+BDA). Последний раз я предлагал тебе сделать базу 2 Кб, а не 32. Такой низкой базы тоже практически ни у кого нет.
Цитата:
Пойми - поднимаешь базу ради (весьма куцего) стека под ней, - автоматически нарываешься на потенциальные проблемы с EBDA. Либо сокращаешь доступное загрузчику пространство, которого и так впритык. Я не могу просто взять и выделить внизу 4к под какой-то буфер потому что 1) выделенного буфера, как такового, нет, все области по максимуму шарятся; 2) потребуются релокации, а это дополнительный код, немаленький, под который нет места в загрузчиках, по крайней мере в FAT12/16 и Ext2/3.
Я не могу понять, почему ты эти 768 байт не можешь задействовать под нужды первичного загрузчика и за счет этого высвободить в конце 512 байт, чтобы размер загружаемого файла не пострадал. Тебе что архитектурно трудно разнести работу по разным участкам? "Куцый стек" размером 768 байт (это уже близко к обычно устанавливаемому мной 1 Кб в исходниках mksys) мне внушает значительно больше доверия, чем "сиротские" 256 байт (хотя их конечно можно задействовать под переменные), а кроме того за счет этого мне можно уменьшить размер файла на размер стекового дампа в нем и не пытаться распределять стек после образа, что, как ты понимаешь, уменьшает вероятность "нарваться на потенциальные проблемы с EBDA". Но в принципе если ты "дашь народу" свободный участок определенного размера после образа, этого будет достаточно.
phantom-84 писал(а):
Кратность требуется только для флопа. Современные устройства с большими секторами будут работать и так.
Я последний раз говорил про лучшую кратность базы 800h по сравнению с 600h. Да, возможно, практического смысла в этом не много, но ведь это красиво, особенно при чтении CD/DVD

Цитата:
Размер не должен быть кратен вообще, он должен быть кратен в моём случае.
1. Мне намного проще проверять, исчерпался ли лимит загрузки (если файл >620к).
2. Если я заложу размер, не кратный сектору, при чтении последнего (большого) сектора произойдёт overrun и будет затёрта часть данных загрузчика, т.к. BIOS не может считать только кусок сектора.
Как уже сказал, я не предлагаю тебе уменьшать размер файла.
Цитата:
Организация стека никак не относится к спецификациям загрузки. Всё, что происходит после передачи управления - на совести разработчика ядра. Но я понял, я напишу в документации, что именно гарантируется и как этим лучше воспользоваться.
Если ты читал, что у меня написано, то видел, что там нет указаний на то, где нужно размещать стек. Там лишь присутствует описание различных участков памяти и даются указания, направленные на предотвращение разрушения данных текущим стеком (или просто другими данными - это есть в описание первого интерфейса, чтобы не были случайно уничтожены данные в дескрипторе загрузочного раздела). Как уже сказал выше, если напишешь, этого в принципе будет достаточно.
Цитата:
GRUB, SYSLINUX и твои загрузчики умеют грузить 620к? Ну так и что тогда ломать копья?
Я вообще не понимаю, в чём проблема-то? Либо пишешь маленький стаб-релокатор, как в твоём втором образе ГРУБа, и переносишь ядро вверх (только тогда забудь про 620к), либо дополняешь нулями, как в первом образе. Пойми, ВВЕРХ что-то перенести - не проблема. А вот ВНИЗ гораздо проблематичней.
Про GRUB я тебе уже рассказывал. mboot, может, и сможет, т.к. в сервисе syslinux'а есть функции зачистки и переноса финальной стадии в нужный участок памяти. У меня пока драйвер и стек не могут быть перемещены штатными средствами (т.е. первый 31 Кб памяти трогать нельзя), апплеты могут быть перемещены только в пределах доступной для них базовой памяти. В дальнейшем при необходимости все эти ограничения можно снять. ВНИЗ можно перенести точно также, как и ВВЕРХ.
Кстати (только не ругайся

) базу можно сделать вообще равной 2000h. Тогда получится красивая картинка:
- 8 Кб - IVT, BDA и все твое добро;
- 620 Кб - образ;
- 12 Кб - твой резерв для EBDA.
Если вдруг в будущем EBDA будет уличена в наползании на буфер, который ты зарезервировал для образа, будешь его по мере надобности уменьшать. А чтобы пользователь твоих загрузчиков, рассчитывающий на все 620 Кб, не пострадал, при наличии буфера меньшего размера будешь выдавать сообщение об ошибке вместо передачи управления ядру, ну или перестанешь гарантировать загрузку 620 Кб (можно к примеру реальный объем загруженного передавать ядру в качестве параметра, а гарантировать вообще "пару килобайт", чтобы код ядра смог сам разобраться в том, что образ загружен не полностью, и сообщить об этом; если ты будешь еще и требовать наличия в образе этой "пары килобайт", то избавишь пользователя от ошибки случайного обрезания образа - у меня к примеру образ ядра никак не может быть меньше 1 Кб и как раз в первом килобайте находится код валидации ядра).
Цитата:
Участок в начале - это частное решение твоего ядра. У меня, например, нет такого участка и нет необходимости в нём. Участки нужного размера резервируются и чистятся (BSS) сразу после образа. Что мешает тебе зарезервировать те же самые 32к под стек после образа и сделать в ядре ORG 600h?
Память перед образом "статична" и всегда доступна для работы. Доступность памяти после образа нужно проверять в ядре, используя текущий стек, или предоставлять определенный участок загрузчиком (причем если он подвижен, то могут возникнуть проблемы с обрезанным образом, а если статичен, то могут возникнуть проблемы с EBDA).
Цитата:
Пока не вижу причин, почему меня должно прижать. И потом, вторичная загрузка - это уже совсем другая тема. Здесь мы обсуждаем первичную.
OK, я просто предложил альтернативу "заглушкам на все случаи жизни". У таких заглушек есть один недостаток: они требуют дополнительной обработки. Т.е. чтобы мне к примеру получить sys-образ, я должен прогнать оригинальный файл(ы) через mksys или по крайней мере сделать что-то типа "copy /b /y ... kernel.sys" (последнее возможно не для всех форматов, если это не какой-то специализированный конвертер).
P.S. Уже несколько постов подряд забываю тебя попросить прибавить к текущей версии хотя бы сотку.