Загрузка первого байта первого сектора

Тема в разделе "WASM.OS.DEVEL", создана пользователем Antoniosis, 7 авг 2010.

  1. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    Phantom_84
    ну давай код.
    а вообще в начале загрузчика многие ставят sti
    и через int 16h можно и флаги посмотреть (shift num и ... по памяти)

    но для задержки нужно сделать возможность ее настраивать и выключать. она же не везде нужна.

    а у тебя этот ноут под рукой или просто попался на время?
     
  2. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    Phantom_84
    а ты с загрузкой из под EFI не разбирался.
    а то я не пойму. под эмулятором работает, а на плате интел нет(грузит mbr а не bootx64.efi). хотя режим boot efi включен. а почему не знаю.
     
  3. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Выложу для обсуждения немного позже.

    Я оригинальную редакцию трогать не буду. Пока задумка выбрать наиболее подходящую задержку и сделать ее дефолтной (о чем уже задавал вопрос). А менять длительность задержки путем пропатчивания в диапазоне порядка 128 тиков BIOS (7 секунд).

    В данный момент под рукой.

    Нет.
     
  4. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    а что идет пере aam?
    что она изменяет, конкретное число, или какой-то результат?
    почему просто test для бита не сделать?
    или
    mov ax,[417h]
    and ax,8
    jnz ....
     
  5. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    Phantom_84
    напиши подробнее процесс поиска активного раздела.
    интересует такой вопрос: у тебя есть загрузка из расширенного раздела. это только как альтернативная? или может быть и основной(без нажатия alt)?
    если может, то как ты отмечаешь раздел. только в SMBR или и в mbr и smbr как активный?

    я просто когда буду писать следующий mbr, есть желание поддержать твою спецификацию по поводу DH.
    есть ли еще какие нюансы в твоей спецификации?
     
  6. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    вот мой MBR. правда без альтернативной загрузки.
    кто хочет смотрите.
    заодно отпишитесь как работает.
    сам проверял на трех машинах, ошибок не нашел.
    некоторые фрагменты могут показаться странными, но все делалось для того чтоб код влез до 1AFh
    по документации можно и больше. но многие программы и системы редактируют пространство mbr с адреса 1b0h
    для своих нужд. но все что мне было надо, я впихнул)

    для лучшей наглядности код лучше смотреть из под DOS Navigator(в досе или винде)
    или AkelPad (виндовс)
    в обычном блокноте теряется выравнивание и плохо понимается текст.
     
  7. MisHel64

    MisHel64 Member

    Публикаций:
    0
    Регистрация:
    9 мар 2011
    Сообщения:
    182
    Я могу придератся, но есть несколько замечаний.
    49 строка, для наглядности используй LEA
    Для экономии места, в 39 строке используй CX регистр. Тогда в 51й inc Ch даст тот же результат.
    64 строка. У тебя CX=0, значит можно сэкономить еще один байт.
    69 строка. У тебя Ch=0, можно использовать его, можно сэкономить еще один байт.
    Или вообще используй как делает MS.
    73 dec cx
    74 jnz short @0 ; Если не все, то следующий
    А чем те стандартный LOOP не понравился?

    Дальше внимательно откровенно не смотрел.

    Кода в Divide откровенно не понял.
     
  8. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Код (Text):
    1.   типа mov al,[keyflags]
    2.   ...
    3.   aam 10h ; распаковка keyflags
    Я тебе уже когда-то писал, что Alter вообще не поддерживает загрузку с дополнительных разделов (входящих в состав расширенного). У меня есть еще один MBR-загрузчик Jumbo, который это делает (тоже говорил). Он состоит из MBR-части и EPR-части. Обработкой дополнительных разделов фактически занимается EPR-код. MBR-код просто передает ему управление, предварительно проверив его наличие. Jumbo как бы считает расширенный раздел обычным первичным разделом со специфичной ФС, требующим дополнительной проверки помимо проверки на наличие стандартной загрузочной сигнатуры. Т.е. по сути MBR-часть Jumbo не сильно отличается от обычных MBR-загрузчиков.

    Признак активности можно устанавливать только у первичных разделов (хотя когда я только разрабатывал порядок загрузки с дополнительного раздела, я рассматривал и вариант установки признака активности непосредственно в дескрипторе дополнительного раздела, но этот вариант по многим причинам я посчитал неудачным). Дополнительный загрузочный раздел я выбираю по номеру (5-255).
    Интерфейс между MBR-загрузчиком и первичным загрузчиком в спецификации не основной, а вспомогательный. Основной интерфейс описывает взаимодействие первичного загрузчика с вторичным загрузчиком/ядром ОС:

    Кстати можно договориться, как идентифицировать наличие EPR-загрузчика, потому что этот момент сейчас не прописан в спецификации.

    Это мой код )))
     
  9. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    для себя учту.
    но для наглядности так проще понять(меньше мозг напрягается).
    пока места хватает. но насчет cx подумаю.

    сейчас изучаю GPT. хочу написать гибридный MBR, как в EDD 4.0
     
  10. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    abcd008, если это сделать, можно делать взаимозаменяемые MBR-/EPR-загрузчики. Ты же вроде говорил, что тоже используешь (собираешься использовать EPR). Как ты проверяешь, содержит ли EPR загрузочный код или нет?
     
  11. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    ты имел ввиду EBR?
    я думаю проще всего по содержимому первых байт.
    если там нули, то загрузчик отсутствует.
    если нет, то есть код загрузчика.

    обычно если некто сам туда не пишет, то там нули, и две записи в PT
    хотя в моя система будет нормально реагировать на большее число записей.
     
  12. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    MisHel64
    пересмотрел свой код.
    и могу сказать следующее:
    если все зделать как ты сказал, я экономлю два байта. это хорошо.
    но есть одно но. ты наверно заметил, что перед inc ax, нет инициализации ax в 0.
    она бралась в начале. и если к твоим исправлениям дописать еще и xor ax,ax, то мы нечего не выиграем.
    только ухудшиться понимание текста.
     
  13. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    Phantom_84
    типа mov al,[keyflags]
    ...
    aam 10h ; распаковка keyflags

    а зачем распаковывать, если можно просто сравнить бит?
     
  14. MisHel64

    MisHel64 Member

    Публикаций:
    0
    Регистрация:
    9 мар 2011
    Сообщения:
    182
    Не понял о чем ты. На будущее, комментируя некое высказывание, будь добр приводить и его.
     
  15. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Да.

    Это вариант. Просто я думал, может что-нибудь по изощреннее придумать. Еще у кого-нибудь есть какие-нибудь идеи?

    Две или одна, причем на определенных позициях. Я обрабатываю структуру расширенного раздела по всем правилам, а точнее просто игнорирую последние две записи в каждой таблице.

    Поддержка спецификации не помешает. Благодаря ей, ты можешь гарантированно получать указатель на дескриптор расширенного раздела в DS:SI. Вот только ты должен определиться с тем, как идентифицировать загрузочный дополнительный раздел (внутри расширенного). Я в EPR в регистре dh передаю не номер расширенного раздела, а номер загрузочного дополнительного раздела внутри этого расширенного раздела. Если ты все-таки будешь указывать признак активного раздела в дескрипторе дополнительного раздела внутри расширенного (что как бы не предусмотрено форматом расширенного раздела), то ты можешь и не передавать в EPR номер дополнительного раздела. Остаются два более-менее приемлемых варианта:

    1) передавать 0 в EPR, а затем определять номер дополнительного загрузочного раздела и передавать его первичному загрузчику;

    2) передавать номер самого расширенного раздела (1-4) в EPR, а затем определять номер дополнительного загрузочного раздела и передавать его первичному загрузчику.

    Вариант "передавать номер самого расширенного раздела (1-4) в EPR, а затем этот же номер передавать первичному загрузчику" считаю неприемлемым, т.к. он противоречит спецификации. Кроме того, по-моему некорректно делать расширенный раздел активным или считать его непосредственно загрузочным.
     
  16. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Читай описание поля keyflags. Alter можно настроить на использование других управляющих клавиш (или просто расширить их число).
     
  17. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Удалено.
     
  18. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    строка 84
     
  19. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    зачем тебе изашренные варианты. EBR это обычная загрузочная запись, только сам биос ее не видит.
    вот и вывод: если там есть код. то в начале всегда есть данные(либо jmp либо сразу программа).
    поэтому достаточно проверить только например двойное слово.

    код в BR может проверить по спецификации сигнатуру 88.
    и при ее наличии смотреть DH.
    если там не 0, то можно либо взять ds:si и сравнить что там лежит с данными в PT(рекурсивно) и найти свой раздел.
    или довериться значению в dh.


    есть два варианта загрузки с расширенного раздела:
    1. mbr сам рекурсивно проходит все PT и в mbr и в EBR и ищет активный раздел. и сам вычисляет dh.
    после чего передает управление сразу на BR.
    здесь надо пеметить загрузочный раздел как активный(только один).
    2.mbr ищет активный раздел(пометить расширенный активным). если нет то ищет расширенный и проверяет его на AA55h и на наличие данных в начале кода. расширенный раздел тогда должен быть жостко один.
    после чего записать в dh значение выбранного раздела и передать управление на код(или BR если основной или EBR если расширенный)
    код EBR должен выполнить тоже самое, но к номеру раздела прибавить еще и старое значение dh.


    насчет стандарта, для расширенного раздела. то там нет жосткой фиксации положения раздела в PT.
    там есть только ограничение на один расширенный раздел(который ссылается на следующий в цепочке раздел).
    заметь он может быть хоть в конце. и он не помечает раздел как таковой(он резервирует место под остальные разделы). поэтому можно создать несколько основных разделов и один расширенный. хотя и не рекомендуется, но линукс (как пишут на форумах) с этим справляется, и понимает даже несколько расширенных(внутри EBR)
     
  20. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Я объяснил. Например, чтобы можно было мой MBR-код использовать с твоим EPR-кодом и наоборот. В противном случае из-за отсутствия каких-либо стандартов на EPR-код они могут оказаться несовместимыми. К примеру я захочу грузить EPR-код (предполагая, что он исключительно мой, а не чей либо еще) не по адресу 7C00h, а по адресу 7E00h, или передавать управление не в начало, а в "середину" кода, или вообще вызывать процедуры, находящиеся в EPR, из MBR-загрузчика.

    Я так детально занимался проработкой технологии загрузки в том числе и ради того, чтобы "код в BR" (я так понимаю, первичный загрузчик) не занимался не своим делом и не обрабатывал PT, тем более рекурсивно. Пока не было интерфейса между MBR- и первичным загрузчиком, мне для загрузки с неактивного раздела (без использования вторичного загрузчика) приходилось (в рамках первичного загрузчика) такие танцы с бубном вытворять, что лучше этого и не вспоминать. Первичный загрузчик теперь может не напрягаться, т.к. у него в распоряжении DS:SI и собственные структуры данных. DH в принципе тоже, но чтобы его использовать, нужно повторно считывать MBR, а это по многим причинам неудобно делать в первичном загрузчике. Я к примеру значение DH транслирую из MBR-загрузчика или формирую самостоятельно (0), но не использую в первичном загрузчике. DS:SI вообще не использую. Опираюсь только на BPB.

    Это конечно хороший вариант, но проблема в ограниченном объеме MBR-загрузчика. Мне вообще EPR по сути нужен только для решения этой проблемы. Иначе бы ему так и оставаться по большей части обнуленным.

    Для меня "пометить расширенный активным" уже не вариант. Хотя для MBR-загрузчиков, которые не проверяют тип раздела, с которого выполняют загрузку, это возможно. Неизвестно еще, как разные системы отреагируют на присутствие активного расширенного раздела. О DH как раз я и писал. Суть вопроса в том, какие именно значения можно/нужно передавать в DH при передаче управления в EPR. Опять-таки я к примеру продолжу передавать значения 5-255, а ты решишь передавать 0 и/или 1-4. В итоге наш EPR-код станет несовместимым по значению данного параметра. Вывод напрашивается сам собой: либо прийти к единому интерфейсу между MBR и EPR, либо разработать единый метод идентификации EPR на предмет "свой/чужой", более "изощренный", чем просто проверка нескольких первых байт на ненулевое значение (это по сути здесь особо не поможет). В принципе можно остановиться на первом варианте, т.к. по сути "мои текущие" значения 5-255 не пересекаются с набором 0-4. Просто нужно договориться, что эти 0-4 будут означать для EPR-кода. Искать активный раздел среди дополнительных разделов (внутри данного расширенного)?

    Ну не знаю. Где этот стандарт? Что именно в нем написано? В известных мне источниках написано, что первая запись (если присутствует) описывает дополнительный раздел (логический диск), а вторая (если присутствует) - ссылка на следующий EPR в цепочке, т.е. описывает очередной вложенный раздел.