Yoda писал(а):
Да. Но я ставил целью сделать код, пригодный для ЛЮБОЙ валидной файловой системы. В принципе, ничто не мешает FAT32 выкинуть резервную копию бут-сектора и оставить только два зарезервированных сектора - один загрузочный и один FSInfo. В таком случае килобайтный бут уже не поместится.
Да. Но в отличии от FAT1x в FAT32 обычно с этим нет проблем. В любой винде загрузчик имеет размер минимум 1 кб, а резерв часто делается еще больше. Есть и другие вменяемые способы увеличения размера пространства, доступного загрузчику. Например, у меня для FAT1x используется единый (для обоих типов ФС) расширитель загрузчика, размещаемый в файле bootex.bin размером 512 байт. Можно даже сделать вариативное размещение расширителя либо в файле, либо в резервной области.
Цитата:
DL, а не DH. Да, там номер загрузочного диска BIOS. Мой MBR передаёт полученное от BIOS значение дальше по цепочке.
Я говорил про свой идентификатор
раздела. Он передается в dh и является просто "географическим" (сейчас) или каким-либо иным (в перспективе) номером раздела. Выдержки из моей спецификации на эту тему можно найти
здесь.
Цитата:
Идентификатор раздела - это 4 байта, уникальный ID (Volume Serial Number), прописываемый при форматировании в бут-сектор по адресам 43h-46h для FAT32 и 27h-2Ah для FAT12/16. В принципе, имея номер загрузочного диска можно оттрассировать цепочку загрузки и самостоятельно определить раздел, с которого загружена ОС. Однако, если используются какие-то бут-менеджеры, то решение задачи может оказаться нереальным. Определение раздела по переданному VolumeID намного надёжней.
У такого подхода (я его называю "лэйбльным") есть как преимущества, так и недостатки. Чтобы идентифицировать раздел, нужно прочитать его бутсектор, а заодно и бутсекторы других разделов. У меня перечисление разделов может выполняться вообще без обращения к их содержимому. Существует вероятность появления двух одинаковых идентификаторов.
Цитата:
Проверки базовой памяти нет. Сначала ввёл, затем отказался от неё.
Что так? Ты же заполняешь базовую память под завязку. А как это сделать, точно не зная границу доступной (базовой) памяти сверху?
Цитата:
Проверки размера файла тоже нет. За ненадобностью.
Не понял. А если у тебя в корне лежит стометровый файл ядра? Как загрузчик его будет грузить?
Цитата:
Я написал, какие именно проблемы решает загрузчик. И проблемы вполне реальные. Вспомни, что ранние версии MS-DOS требовали, чтобы IO.SYS/MSDOS.SYS были первыми именами в корневой директории и IO.SYS располагался непрерывно в начале диска. Более поздние версии сняли ЧАСТЬ ограничений. Это всё от острой нехватки места. Любой, кто пишет загрузчик нулевого уровня так или иначе столкнётся с серьёзными сложностями подобного рода. А ведь гораздо приятней сразу иметь нулевой загрузчик, не имеющий НИКАКИХ ограничений на размещение файла, его имя и положение в корневой директории и не парясь процессом начальной загрузки.
+1
Цитата:
С данным загрузчиком дальнейшую работу с дисками через BIOS по INT13 уже можно и не писать. 608к вполне достаточно, чтобы в них вписать перевод в защищённый режим, часть ядра, драйверы дисков и файловых систем без промежуточных стадий. А в случае мини-систем и вообще целиком грузить всё ядро ОС.
+1. В моей схеме драйвер загрузочного устройства и ФС находится в отдельном файле, который грузится вместе с файлом ядра, поэтому никакие промежуточные стадии не нужны. Этот драйвер является обычным драйвером защищенного режима. Единственное, что следует учитывать, так это то, чтобы в нем обязательно содержался и драйвер загрузочного диска, и драйвер соответствующей ФС, и менеджер разделов (в случае использования разбитого на разделы диска).
Цитата:
Нет-нет, именно не менее! Иными словами, файл не превышающий в размере 608к будет гарантированно загружен целиком. А вот если он больше, то всё зависит от ряда тонкостей.
Теперь понятно, но написано все равно не очень складно - может показаться, что файлы меньшего размера нельзя грузить вообще.
Цитата:
Полностью зависимость убрать малореально. Во-первых, BIOS сам отъедает немалую часть базовой памяти. Во-вторых, сектор устройства документированно может быть до 4к (уже в этом есть неизбежная вариативность!). В третьих ещё минус 1.5к векторов прерываний и переменных BIOS. Ещё нужно место для самого кода, промежуточных данных и т.д. На всё я отвожу максимум 32к. Остальное (640-32) и есть те самые гарантированные 608к, что на самом деле немало. Реальный максимум - 627к для FAT12/16 и 625к для FAT32, но лишние 20к - слабое утешение. Если файл не вписался в 608к уже сейчас, то надёжней будет всё же ввести промежуточный загрузчик или ввести распаковку в ОЗУ, чем закладываться на негарантированный бонус в 20к.
То что "отъедает" BIOS, никак нельзя считать доступной базовой памятью. В случае больших секторов (больше 1 кб; к примеру 2 кб в CD/DVD) ты мог бы кэшировать последний сектор файла в специальном буфере, если он полностью не умещается в оставшемся участке памяти, а находящиеся в нем файловые данные умещаются. Арифметика 640-32 (в идеале) больше похожа на мою. Я не понял, откуда при адресе загрузке 600h у тебя взялись 32 кб? Ты что ли используешь участок в конце базовой памяти? А как же EBDA?
Цитата:
Не вижу связи. Это лишь вопрос выбора адреса, КУДА что кэшировать/писать. База 600h позволяет мини-ОС полней и удобней использовать имеющуюся в распоряжении память.
Сомнительное утверждение. Если почти всю базовую память занимает загруженный образ, то о каком удобстве вообще идет речь. А с загрузчиком дела обстоят еще хуже, ведь у тебя адрес загрузки ядра (600h) лежит ниже адреса загрузки загрузчика (7C00h). Получается, чтобы загрузить ядро размером больше 7C00h-600h, тебе сначала нужно переместить загрузчик.
Цитата:
Вот видите, у вас уже начались какие-то искусственные ограничения :)
Это искусственное ограничение исключительно положительное. Кратность размера файла ядра 1 кб является одним из первичных признаков его корректности (есть еще и сигнатура в конце), который может быть проверен уже на этапе работы первичного загрузчика (я бы и проверку контрольной суммы вынес в первичный загрузчик, но наличие у файла ядра контрольной суммы не описано в загрузочной спецификации).