Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Отладка начального загрузчика

602
31 мая 2010 года
KPI Student
265 / / 16.12.2006
Возникла необходимость написать свой начальный велозагрузчик для флешки, отформатированной под FAT32. Взял исходники KolibriOS (есть такая ОСь, написаная полностью на асме непонятно зачем), скомпилил, записал загрузчик на флешку, примонтировал к вмвари - все ок.

Теперь небольшое отступление, как работает тот загрузчик:
1. boot-sector: ищет в корневой папке раздела файл "mtldr", грузит его в ОЗУ;
2. mtldr: выводит приветствия, ищет .img - файл ядра, грузит его, переходит в защищенный режим и передает управление дальше.

Когда я сменил имя "mtldr" на "bigboot" во всех исходниках прога работать перестала. Надо узнать, почему. Вопрос - как?

ВМварь и прочие, как я понял, отладку не поддерживают, QEmu только под линуха, а bochs просто пишет, что не может открыть образ "\\.\PhysicalDrive2".

Приду с работы, под убунтой на боксе попробую еще, с каким-нибудь путем вроде "/dev/sdc", но думаю, что врядли что-то изменится. Да и писать на асме с Intel-синтаксисом из-под линукса дело возможное, но вряд ли безгемморойное.

Подскажите, пожалуйста, кто с этим сталкивался - чем с наименьшим геммороем можно отладить boot-сектор, записанный на флешку?


ЗЫ. Имя диска указано правильно, параметры АТА в боксе указывал, параметры загрузки настраивал. В ВмВари этот же путь к реальному диску прокатывает без проблем.

ЗЗЫ. Ось - вин7 (с правами админа) и ХР сп3, и там и там не открывает "\\.\PhysicalDrive2".
399
31 мая 2010 года
KIV
432 / / 20.01.2009
Цитата:
есть такая ОСь, написаная полностью на асме непонятно зачем


Вполне понятно. Чтобы занимала меньше и места и работала быстрее. Но я думаю главноая причина не в этом, а в том, что некоторые люди считают, что почти всё под PC надо писать на асме. Я отношусь к этой категории.

Цитата:
Да и писать на асме с Intel-синтаксисом из-под линукса дело возможное, но вряд ли безгемморойное.


Легко и просто. У FASM (на нём кстати написана KolibriOS) есть версия под Linux. Большинство других ассемблеров с Intel синтаксисом имеют версии под Linux.

Цитата:
а bochs просто пишет, что не может открыть образ "\\.\PhysicalDrive2".


А подключать не реальный диск а img образ нельзя разьве?
Вообще если загрузчик грамотно написан, то ему должно быть всё равно откуда он грузится: с флешки, с жёсткого диска или с дискеты.

Цитата:
чем с наименьшим геммороем можно отладить boot-сектор, записанный на флешку?


Использовать грамотно написанный загрузчик (требования смотри выше) и отлаживать с помощью Bochs из образа.

602
31 мая 2010 года
KPI Student
265 / / 16.12.2006
Я так понимаю, img-образ это просто побитовая копия? Тогда еще один вопрос - как для него определить параметры cylinders/heades/sectors? Для флешки ставил методом тыка.
307
31 мая 2010 года
Artem_3A
863 / / 11.04.2008
я особо не специалист в этой области, но разве софтайс этим не занимается???
399
31 мая 2010 года
KIV
432 / / 20.01.2009
Цитата:
как для него определить параметры cylinders/heades/sectors?


Если в начальном загрузчике, то с помощью функции 8 прерывания 0x13. Именно так делают универсальные загрузчики (а ещё они берут не фиксированный номер диска, а из DL - при загрузке BIOS пишет туда номер загрузочного диска). Если же для Bochs, то эти параметры нужны только для жёстких дисков (получить их можно с помощью bximage). Для флешек (подключить виртуальную флешку он может, но грузиться с неё не умеет) и дискет параметры расчитываются автоматически.
img-образ для Bochs - просто побитовая копия. Дискеты для всех ВМ представляются именно в таком формате. Жёсткие диски и образы CD/DVD могут представляться и в более сложном формате.

Цитата:
я особо не специалист в этой области, но разве софтайс этим не занимается???


Интересно как вы его запустите без операционной системы.

252
01 июня 2010 года
koderAlex
1.4K / / 07.09.2005
доступ к флешке и HDD лучше делать через EDD (Enhanced Disk Drive service) - функции с 41h по 4eh прерывания 13h.
адресация в этих функциях LBA . )
349
01 июня 2010 года
Phantom-84
656 / / 27.10.2005
В боксе есть отладочная версия. А вообще код небольшой, можно и без отладки обойтись.

Загрузчики не должны быть универсальными, но для харда и флешки действительно лучше использовать унифицированный загрузчик (и для mbr, и для разделов), при условии что флешка с mbr. В современном загрузчике сначала идет попытка использования EDD, а уже потом при отсутствии поддержки в целом или возможности использовать для конкретного девайса функции EDD используется традиционный дисковый сервис. Функцию 8 можно использовать во-первых для проверки непротиворечивости значений heads и spt, возвращаемых этой функцией и соотв. значений находящихся в mbr, в структурах загрузочных секторов разделов (bpb и т.п.). Во-вторых, ее можно использовать для вычисления емкости старых девайсов с целью дальнейшей проверки попадания линейного или "трехмерного" адреса очередго загружаемого сектора в допустимые пределы. Для современных хардов значения heads и spt, устанавливаемые BIOS, обычно равны 255 и 63 соответственно. Для флешек трехмерные координаты часто четные, чтобы раздел(ы) флешки четко укладывались в весь объем.
399
01 июня 2010 года
KIV
432 / / 20.01.2009
А что плохого в том, что загрузчик будет универсальный и может грузится с любых устройств без изменений?
349
01 июня 2010 года
Phantom-84
656 / / 27.10.2005
Чтобы сделать универсальный загрузчик, нужно учитывать специфику устройств и файловых систем, для которых он предназначен. Код для поддержки всего и вся просто невозможно уместить в ограниченном по размеру загрузчике. Да и зачем усложнять загрузчик кодом идентификации и дополнительным кодом, который для конкретного устройства/ФС все равно никогда не пригодится. Нафиг объединять к примеру код для FAT12/FAT16 (а часто еще и для FAT32 - это вообще изврат, потому что данный код все равно не доделывает своей работы до конца, т.к. его продолжение в разделах FAT12/FAT16 попросту отсутствует)? Чтобы в утилите форматирования не хранить образы двух (трех) разных загрузчиков что ли? Или действительно работает принцип напихать побольше, пока хватает места? Пусть тогда уже прикручивают код для NTFS, да и CDFS/UDF тоже не помешает. Слабо? (Думаю, понятно, о ком я прежде всего говорю.)

Лично я предпочитаю нагружать загрузчики более интеллектуальной работой, а не перегружать часто бесполезной. Например, не грузить первые три сектора загружаемого файла, а загрузить файл целиком и может быть даже не один. Конечно, у меня тоже есть перегибы. Например, в коде FAT12 для флоппика для определения геометрии используются константы, а не поля известной структуры, кроме того сама структура "обрезана" и не содержит полей, появившихся в последних версиях. Кода для FAT12 для харда нет вообще, хотя если бы захотел написать, то написал бы. Есть FAT16, FAT32, разные варианты MBR с расширениями (подходят и для харда, и для флешки). Готовится CDFS с поддержкой Джульет при наличии на диске.
399
01 июня 2010 года
KIV
432 / / 20.01.2009
Понятное дело, что нельзя сделать загрузчик для всех ФС. Но для всех устройств - да. BIOS позволяет работать и с жёстким диском, и с флешкой, и с дискетой работать с помощью одних и тех же функций. Определение геометрии диска не такая уж и сложная задача. Ну добавит это десяток байт. Мой загрузчик, например, умещается в 512 байт, но при этом грузится с любого диска кроме CD/DVD (там размеры секторов не 512 байт, а 2048), затем грузит файл и загружает все файлы перечисленные в нём через символ переноса строки (причём целиком, а не первые три сектора). Просто самому потом будет удобно. Например, не надо будет пересчитывать геометрию и перекомпилировать загрузчик, чтобы записать его на флешку побольше. И самое главное: загрузчик может быть для дискеты, но поскольку не всегда есть возможность её использовать, то можно образ дискеты записать на флешку и проверить как работает, будучи уверенным, что при загрузки с дискеты всё будет точно также.
349
02 июня 2010 года
Phantom-84
656 / / 27.10.2005
Загрузчик совмещает в себе работу с устройством и с ФС. Для определенной ФС и устройств, с которыми через BIOS можно работать абсолютно одинаково, можно использовать один и тот же загрузчик (пример - флешка с mbr и хард). Работа с флоппиком отличается от работы с флешкой/хардом: переопределяется таблица параметров дискеты, не используется сервис EDD, используется только FAT12, нет необходимости учитывать возможность наличия нескольких разделов и т.д. К тому же флоппик является устаревшим устройством, поэтому его поддержку по любому нужно выводить из основных загрузчиков. Я ничего особо не перекомпилирую, просто у меня есть отдельный загрузчик для стандартного флоппика 2х80х18, который можно (и нужно) перезаписать сразу поверх бутсектора, и есть загрузчики отдельно для FAT16 и отдельно для FAT32, не предназначенные для флоппика, которые нужно устанавливать на диски или записывать в ручную, но более деликатно. Кстати, твой загрузчик предназначен для какой (каких) ФС? Далее... Размер загрузчика в CDFS измеряется в 512-байтных блоках. Тебе никто не запрещает сделать загрузчик для CD по формату аналогичный остальным загрузчиком, вот только работать он должен с другой ФС. Образ дискеты можно записать на флешку и загрузиться в режиме эмуляции USB-FDD без проблем.
399
03 июня 2010 года
KIV
432 / / 20.01.2009
Мой загрузчик грузит из моей ФС. По возможностям она лучше FAT12, но хуже более продвинутых ФС типа NTFS. Я делал свой загрузчик по образцу загрузчика с аналогичными функциями только для ext2fs (правда, автор уместить загрузчик для FAT в один сектор не смог и ему пришлось догружать ещё 512 байт). Хотя вы тоже правы. Если загрузчик для FAT12 сможет использоваться на дискетах, то не имеет смысла давать возможность ему грузиться с любых устройств. Но для загрузчиков с флешек, CD и дискет не с FAT12, на мой взгляд, всё же универсальность не помешает (но если отмести дискеты, как устаревшие, то можно и воспользоваться EDD и привязки к геометрии тоже не будет). Но если вы пишите ОС защищённого режима, то лучше грузиться с дискеты или жёсткого диска, потому что работу с USB сделать намного сложнее, чем работу с HDD (легче всего) или FDD.
349
03 июня 2010 года
Phantom-84
656 / / 27.10.2005
Про универсальность в том числе и для CD не согласен, потому что там используется специфичная ФС, к тому же несматря на сказанное мной выше загрузчик для CD обычно все-таки 2-килобайтный (что лучше подходит для полноценной работы с CDFS) и работает с 2-килобайтными секторами.
Цитата:
но если отмести дискеты, как устаревшие, то можно и воспользоваться EDD и привязки к геометрии тоже не будет

В принципе так, но мои загрузчики при необходимости могут использовать и традиционный сервис с "трехмерной" геометрией (здесь универсальность как раз не помешает, по крайней мере пока). Правда, я получаю "трехмерные" координаты из линейных, а хранящиеся в структурах загрузчиков использую лишь для проверки. Только EDD используется лишь в CD-загрузчике.

Цитата:
Но если вы пишите ОС защищённого режима, то лучше грузиться с дискеты или жёсткого диска, потому что работу с USB сделать намного сложнее, чем работу с HDD (легче всего) или FDD.

Это как раз мой случай, правда, я сейчас занимаюсь внедрением поддержки CD/DVD и CDFS (ISO9660 с расширениями). Хотя некоторые грузят все необходимое на этапе начальной загрузки посдедством BIOS, а потом не работают с флешкой вообще. Было бы хорошо, если бы USB-накопители обладали такими же возможностями по эмуляции, что клавиатура и мышь (USB).

399
03 июня 2010 года
KIV
432 / / 20.01.2009
Цитата:
Правда, я получаю "трехмерные" координаты из линейных


Я тоже. Только вот у меня для вычисления используется количество головок и секторов, возвращёное функцией BIOS, а как у вас? Константы? Под универсальностью я имел ввиду: использование номера диска, переданного BIOS в DL при передаче управления загрузчику и преобразование в "трёхмерную геометрию" на основе данных BIOS.

252
03 июня 2010 года
koderAlex
1.4K / / 07.09.2005
универсальный агрузочный сектор должен уметь работать с fat12 для загрузки с fdd и с cd/dvd в режиме эмуляции fdd .
я использовал готовые константы как Phantom-84 ) так у меня ещё и свободное место осталось . первый сектор вторичного загрузчика гружу в 7е00 и предаю ему управление , а он сам уже дописывает остальные части дальше и может пользоваться функциями (чтение сектора EDD,чтение сектора FDD,разбор FAT12,printf) загрузочного сектора в 7c00 . экономия ;)
349
03 июня 2010 года
Phantom-84
656 / / 27.10.2005
Цитата:
Только вот у меня для вычисления используется количество головок и секторов, возвращёное функцией BIOS, а как у вас? Константы?

Константы используются только в одном загрузчике, для флоппика. Для других загрузчиков значения heads и spt получаются от BIOS и для проверки сравниваются с соотв. значениями из bpb или mbr (это особая проверка - ее редко кто выполняет - осуществляется по координатам конца раздела, с которого продолжается загрузка), но все это только при условии, что для загрузки не удалось использовать EDD.

Цитата:
универсальный агрузочный сектор должен уметь работать с fat12 для загрузки с fdd и с cd/dvd в режиме эмуляции fdd .
я использовал готовые константы как Phantom-84 ) так у меня ещё и свободное место осталось . первый сектор вторичного загрузчика гружу в 7е00 и предаю ему управление , а он сам уже дописывает остальные части дальше и может пользоваться функциями (чтение сектора EDD,чтение сектора FDD,разбор FAT12,printf) загрузочного сектора в 7c00

Это как в грабе или в DOS. Мне такое не нравится. У меня система может грузиться вообще без вторичного загрузчика при условии, что она одна в разделе, а ядро естественно универсальное и вообще ничего не знает об ФС, с которой оно загружается, и почти ничего о загрузочном устройстве, хотя получает номер загрузочного диска (в формате BIOS) и раздела от загрузчика (но это используется только для получения сведений о загрузочном устройстве для последующего его поиска в списке устройств, сформированном драйверами). Вторичный загрузчик, если используется, грузится как ядро (при желании можно даже имя не менять), но работает в RM (не использует драйверы), поэтому содержит в себе весь необходимый код для работы с дисками и ФС, хотя можно написать и такой вторичный загрузчик, который эмулировал бы поведение ядра в плане загрузки драйверов и использовал их для загрузки ядра, но опять же мне будет проще написать разные вторичные загрузчики или просто пополнить вторичный загрузчик кодом для поддержки новых устройств/ФС (здесь нет особых ограничений на размер кода и в качестве источника дальнейшей загрузки могут быть выбраны диски разных типов с разными ФС, поэтому универсальность вполне целесообразна).

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог