1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Переход из реального режима в защищенный

Тема в разделе "WASM.BEGINNERS", создана пользователем Aoizora, 8 июн 2019.

  1. Aoizora

    Aoizora Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    125
    Хочу написать программу, которая переводит процессор из реального режима в защищенный. Мои инструменты это Arch Linux, FASM и DOS Box. Вот часть программы:
    Код (ASM):
    1. org 100h
    2. start:
    3. ; очистка экрана
    4.   mov ax, 3
    5.   int 10h
    6. ; включить 32-битную адресацию
    7.   in al, 92h
    8.   or al, 2
    9.   out 92h, al
    10. ; линейный адрес точки входа в прот моде
    11.   xor eax, eax
    12.   mov ax, cs
    13.   shl eax, 4
    14.   add eax, PROTECTED_MODE_ENTRY_POINT
    15. use32
    16. PROTECTED_MODE_ENTRY_POINT:
    17.   ; load segment registers
    18.   nop
    У меня сразу много вопросов. Что такое "включение вентиля A20"? Как я понимаю, это нечто историческое, с тех времен, когда шина адреса была 20-битной. Вроде бы, как я понял с осдев, 20-й бит не использовался, и запись в 92h порт его включает. Но дополнительного бита все равно же не хватает для 32-битной адресации. Что здесь происходит?
    Программа начинается без директивы use32. Видимо, по умолчанию стоит use16. Тогда почему при вычислении линейного адреса используются 32-битные регистры (eax)?
    При запуске в дос боксе тоже возникают проблемы. Если закомментировать код вычисления линейного адреса и перед org 100h добавить use32, то программа ничего не делает. Если этот код раскомментировать и оставить use32 перед org 100h, возникает ошибка: Exit to error: Illegal GRP4 Call 5. Если убрать use32 перед org 100h, возникает ошибка Exit to error: XMS: CPU reset via port 0x92 not supported.
    Почему программа так работает? Как убрать эти ошибки?
     
    Последнее редактирование модератором: 9 июн 2019
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.325
    Адрес:
    Fryazino
    Aoizora,

    DOSBox - это самый плохой эмулятор. Советую сменить.
    Вот выбирайте любой расписаны в порядке возрастания качества эмуляции.
    NTvdm, DosBox, Qemu, Bochs, VirtualBox, VMWare

    Это разрешение чтения и записи памяти выше первого мегабайта.
    А кто сказал что он один?

    А почему нет? use16 и use32 определяют таблицу кодирования команд.
    В use16 при использовании 16 битных коды короче а для 32 битных длиннее.
    В use32 при использовании 16 битных коды длиннее а для 32 битных короче.
     
    Последнее редактирование: 8 июн 2019
  3. Aoizora

    Aoizora Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    125
    >NTvdm, DosBox, Qemu, Bochs, VirtualBox, VMWare
    А на каком эмуляторе просто запускаются бинарные исполняемые файлы любого формата? Мне ОС на виртуалке не нужна. Без создания образов диска тоже лучше обойтись, если можно.

    >Это разрешение чтение и запись памяти выше 1 мб.
    Можно подробнее? Что происходит при включении вентиля A20? Как это работает?

    Как можно выполнить такую программу на qemu или bochs?
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.325
    Адрес:
    Fryazino
    Qemu, Bochs у второго это настаивается.

    Есть регистр есть шина адреса и логический элемент И. При записи в регистр GateA20 в него заносится 0 либо 1. А далее когда процессор выставляет адрес лишние биты просто обновляются.
    [​IMG]
     
  5. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    129
    Aoizora, вот ресурс, где всё/это объясняется на пальцах
    --- Сообщение объединено, 8 июн 2019 ---
    и в качестве эмулятора лучше использовать bochs, т.к. он имеет встроенный отладчик
     
    CKAP и Aoizora нравится это.
  6. Aoizora

    Aoizora Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    125
    По ссылке восхитительный материал.
    А можно пример конфигурации bochs для запуска com? Я под ним запускал только XSystem по гайду из древнего е-зина.
     
  7. Aoizora

    Aoizora Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    125
    Я пока решил повозиться с запуском моей программы под bochs, а во второй половине дня поизучаю те статьи выше.
    Нашел такую статью про эмуляцию: http://e-zine.excode.ru/online/3/toolz.html
    Там говорится, что для запуска софта нужна ОС, но у меня такая программа, которая по сути сама становится ОС, настраивает GDT, например.
    Я не точно осознаю разницу между ОС и программой, работающей в реальном режиме.
    Но полноценная ОС, как минимум, запускается при помощи первичного и вторичного загрузчика.
    Объясните, пожалуйста, как запустить мою программу (в будущем - дописанную) как полноценную ОС и правильно ли вообще так делать.
    --- Сообщение объединено, 9 июн 2019 ---
    Скачал отсюда дисковый
    --- Сообщение объединено, 9 июн 2019 ---
    Скачал отсюда дисковый образ FreeDOS: http://bochs.sourceforge.net/diskimages.html
    Распаковал, зашел в папку с ядром и образом диска и выполнил bochs -qf bochsrc
    Вместо загрузки доса почему-то открылось пустое черное окно без командной строки. Что делать?
    --- Сообщение объединено, 9 июн 2019 ---
    Конфигурация:

    Код (Text):
    1. megs: 32
    2. romimage: file=$BXSHARE/BIOS-bochs-latest
    3. vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
    4. vga: extension=vbe, update_freq=15
    5. floppya: 1_44=a.img, status=inserted
    6. floppyb: 1_44=b.img, status=inserted
    7. ata0-master: type=disk, path=c.img, cylinders=306, heads=4, spt=17
    8. boot: c
    9. log: bochsout.txt
    10. mouse: enabled=0
    11. cpu: ips=15000000
    Переменная $BXSHARE не задана, echo ее не распечатывает
    --- Сообщение объединено, 9 июн 2019 ---
    Сделал export BXSHARE=/usr/share/bochs перед запуском бокса и это не помогло.
     
  8. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    129
    1. Качаю его и в окне установки взвожу флаг 'DLX-Linux-Demo'.
    Дальше.., по-дефолту:

    bochs_0.png

    2. Теперь в папке "С:\Program Files\Bochs-2.6.8\dlxlinux" cделаю копию файла "run.bat", и даю ему имя "debug.bat". Открыв его для редактирования, добавляю после "bochs" строку "dbg", чтобы он выполнил программу "BOCHSDBG.EXE". Должно получится так:
    3. Дальше, правый клик на "bochsrc.bxrc" и выбрав "Изменить" ищу в нём строку "#display_library: x". Добавляю в конфиг опцию(GUI) с таким текстом (то, что с решёткой - уже было в файле):
    4. Теперь нужно создать образ флопика..
    Запускаю из корневой папки файл "bximage.exe", и в появившейся консоли жму "1" (создать новый диск), указываю что диск "fd", и дальше по-умолчанию. В папке появится пустой образ "a.img"

    5. Открываю в любом hex-редакторе (HxD) новоиспечённый образ, а в следующем окне - свой бинарник. Копирую его в образ по Ctrl+C/V. Если размер образа станет больше, нужно отрезать от его хвоста столько байт, сколько весит твой бин.

    6. Опять правый клик на "bochsrc.bxrc", только теперь "Configure" и в окне "EditOptions" щёлкнув на "Disk/Boot" выбираю "Edit" (по окончанию "Save"). Настраиваю загрузку с флопа, указав ему путь до только-что созданного образа - все диски отключаю, оставляя только флоп.

    7. см.хелп по командам в папке: ..\docs\user\internal-debugger.html
    Если твой код перейдёт в защищённый режим, то выделенная в окне отладчика надпись должна поменяться на РМ.

    bochs_1.png

    да, нужно написать ещё загрузчик, который будет запускать твою ос
     
  9. крюк

    крюк New Member

    Публикаций:
    0
    Регистрация:
    12 май 2019
    Сообщения:
    3
    Покопавшись в документации к VirtualBox узнал, что он тоже имеет встроенный отладчик.
    Кто нибудь пользовался?
     
  10. Minzdrav

    Minzdrav Well-Known Member

    Публикаций:
    0
    Регистрация:
    21 мар 2017
    Сообщения:
    1.088
    Это убойно когда кто-то пишет библиотеку, потом меняет в ней чтото.
    а ктото года полтора тратит чтобы её изучить. Это же Виртуалбокс. Не
    фуфрымухры.
     
  11. Aoizora

    Aoizora Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    125
    А если я создам свой флоппи-образ при помощи bximage под линуксом, как мне в этот образ записать свой бутлоадер?
    Линуковый dd bs=512 count=512 if=./boot.bin of=floppy.img обрезает образ до размера 512 байт.
     
  12. Aoizora

    Aoizora Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    125
    >In Segment:Offset Addressing, we simply add the offset address with the segment address. However, in the previous section, I mentioned that each segment address in Real Mode is 16 bits in size. This means we also have to multiply our segment by 16(decimal), and then we add the offset. So, heres our current formula:

    Как связан 16-битный размер сегментного регистра с необходимостью умножать базовый адрес сегмента на 16?
    --- Сообщение объединено, 23 июн 2019 ---
    Код (Text):
    1.  base address = base address * segment size (16) + offset
    2.             07C0:0000 = 07C0 * 16 (decimal) + 0
    3.                                   = 07C00 + 0 = 0x7C00
    Не понимаю, почему нужно умножить именно на размер сегмента. В данном случае умножение на 16 это то же самое, чтосдвиг влево на 4.
    Для чего это? Почему не оставить просто базовый адрес сегмента?
    --- Сообщение объединено, 23 июн 2019 ---
    Разве базовый адрес сегмента это не адрес его первого байта в физическом пространстве, к которому достаточно просто прибавить смещение?
    --- Сообщение объединено, 23 июн 2019 ---
    Или значение в сегментном регистре это порядковый номер сегмента, на которые разделена память?
     
  13. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.325
    Адрес:
    Fryazino
    Никак. Он связан с сегментной моделью 8086. Наследие прошлых веков с которым приходится сталкиваться.
    [​IMG]
    [​IMG]
     
  14. Aoizora

    Aoizora Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    125
    А если взять такие адреса в реальном режиме: 0:0 и 1:0, то получается странная картина.
    0:0 = 0 физический адрес
    1:0 = 1*16 + 6 = 16

    Получается, что я задал нулевой и 16-й байт. Как так? Сегмент это как скользящее окно, которое перемещается с шагом 16 байт?

    Еще интересна формула: physical address = segment base * 16 + offset. Эта формула допускает 4096 способов адресовать любой байт. Почему?
    Здесь по сути линейное уравнение с двумя переменными segment base и offset. Такие уравнения имеют бесконечное множество решений, но поскольку память у нас конечная, то решения тоже будут конечными, или "зациклятся", в какой-то момент прийдут к самому первому решению. Не могу собрать мысли в кучу.
    Как это работает?
    --- Сообщение объединено, 23 июн 2019 ---
    Что есть первое число в записи segment:offset? Это логический номер сегмента?
    Почему получается, что запись 7c0:0, а адрес первого байта 7c00? И этот адрес первого байта, видимо, и нужно считать базовым адресом сегмента.
     
  15. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.325
    Адрес:
    Fryazino
    Тут у вас опечатка
    1:0 = 1*16 + 0 = 16
    Именно так.
    Именно так допускает. Косяк разработчиков.

    Если шлюз A20 закрыт то зациклится. Если открыт пойдёт дальше.

    Именно так.
     
  16. Aoizora

    Aoizora Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    125
    Перешел на винду, Bochs стал валиться на строке конфига options="gui_debug":

    Код (Text):
    1. megs: 32
    2. floppya: 1_44=bin/boot.bin, status=inserted
    3. boot: a
    4. log: bochsout.txt
    5. mouse: enabled=0
    6. display_library: win32, options="guidebug"
    Возникает ошибка "Unknown win32 option 'guidebug'". С опцией gui_debug (с подчеркиванием) ошибка та же самая. Как правильно под виндой юзать дебаггер?
     
  17. Aoizora

    Aoizora Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    125
    Никто не сталкивался с такой ^ ошибкой? Хочу подебажить свой вторичный загрузчик и не могу.
     
  18. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.325
    Адрес:
    Fryazino
    Download Bochs with debug. Del options="gui_debug". Run bochsdbg.exe
     
  19. Aoizora

    Aoizora Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    125
    Там консольный дебаггер типа GDB. Есть версия с графическим дебаггером?