Author Topic: Модификация загрузчика DC  (Read 2512 times)

Modifier

  • Newbie
  • *
  • Posts: 2
Модификация загрузчика DC
« on: July 29, 2008, 10:27:10 pm »
Здравствуйте
Я хотел бы модифицировать загрузчик, а именно дописать несколько ассемблерных вставок в файл "boot.c" для работы с внешней микросхемой через шину PCI. Я пробовал вставить процедуру поиска на шине PCI устройства через прерывания (на VMWare выпадала критическая ошибка и виртуальный компьютер перезагружался), через порты ввода\вывода - уходит в бесконечный цикл.
Могли бы вы подсказать каким образом я могу работать не производя (при такой возможности) значительных изменений в вашей программы, заисключением добавление своих процедур.
Я так понимаю функции из файла boot.c выполняются в защищенном режиме, так?
С какими ограничениями при доработке вашего приложения я могу столкнуться? Ограничения по размеру кода, данных есть какие либо?

Заранее благодарю за ответы.

P.S. Интересная у вас реализация. Хороший пример (правда пока сложноват) для обучения. Спасибо

ntldr

  • Administrator
  • Hero Member
  • *****
  • Posts: 1079
Re: Модификация загрузчика DC
« Reply #1 on: July 30, 2008, 05:44:02 am »
Написанная на си часть загрузчика исполняется в protected mode, но с отключенной страничной адресацией. Размещается она в наивысшем физическом адресе ниже 4гб. Прерывания в PM коде отключены, и для их использования вам необходимо будет настроить свою таблицу прерываний и не забывать сохранять IDT при переключении RM/PM (это реализовано в файле stage1.asm). Ограничение по размеру кода - 32кб. Если его превысить, то загрузчик не влезет на свободное место перед разделами, и сможет устанавливаться только в конец диска, что не всегда возможно в случае с динамическими дисками. Ограничение на размер инициализированных данных - 4гб, но помните, что каждый килобайт инициализированных данных навсегда отнимается у ОС, поэтому старайтесь ужаться в десяток-другой килобайт.


Modifier

  • Newbie
  • *
  • Posts: 2
Re: Модификация загрузчика DC
« Reply #2 on: July 30, 2008, 06:06:02 pm »
Спасибо за ответ.
Скажите пожалуйста, а могу ли я перевести процессор в реальный режим, а потом обратно в защищенный безболезненно для программы?

Я имею ввиду выполнить такие действия:

__asm
{
    pushad
    mov eax,cr0
    and  al,0feh
    mov cr0,eax
    sti

    mov     ax, 0B103h
    mov     ecx, DEV_CLASS
    mov     si,0
    int     1Ah

    cli
    mov eax,cr0
    or    al,1
    mov cr0,eax
    popad
}

Без прерывания - работает нормально на виртуальной машине, а если я вставляю прерывание в режиме отладки в VMWARE происходит критическая ошибка и машина падает. Vmware Говорит:
*** VMware Workstation internal monitor error ***
vcpu-0:SyncCB failure: 6f76665 (bug #4938)
There is a problem in this version of VMware Workstation.

Вы не знаете, это особенность виртуальной машины, или я допустил критическую ошибку в коде?

ntldr

  • Administrator
  • Hero Member
  • *****
  • Posts: 1079
Re: Модификация загрузчика DC
« Reply #3 on: July 31, 2008, 10:55:34 am »
Нет, так сделать вы не можете. Для вызова прерываний BIOS используйте функцию bios_call. Если вам обязательно нужно вызвать RM код, то добавляйте его в stage1.asm