Хочу написать программу, которая переводит процессор из реального режима в защищенный. Мои инструменты это Arch Linux, FASM и DOS Box. Вот часть программы: Код (ASM): org 100h start: ; очистка экрана mov ax, 3 int 10h ; включить 32-битную адресацию in al, 92h or al, 2 out 92h, al ; линейный адрес точки входа в прот моде xor eax, eax mov ax, cs shl eax, 4 add eax, PROTECTED_MODE_ENTRY_POINT use32 PROTECTED_MODE_ENTRY_POINT: ; load segment registers 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. Почему программа так работает? Как убрать эти ошибки?
Aoizora, DOSBox - это самый плохой эмулятор. Советую сменить. Вот выбирайте любой расписаны в порядке возрастания качества эмуляции. NTvdm, DosBox, Qemu, Bochs, VirtualBox, VMWare Это разрешение чтения и записи памяти выше первого мегабайта. А кто сказал что он один? А почему нет? use16 и use32 определяют таблицу кодирования команд. В use16 при использовании 16 битных коды короче а для 32 битных длиннее. В use32 при использовании 16 битных коды длиннее а для 32 битных короче.
>NTvdm, DosBox, Qemu, Bochs, VirtualBox, VMWare А на каком эмуляторе просто запускаются бинарные исполняемые файлы любого формата? Мне ОС на виртуалке не нужна. Без создания образов диска тоже лучше обойтись, если можно. >Это разрешение чтение и запись памяти выше 1 мб. Можно подробнее? Что происходит при включении вентиля A20? Как это работает? Как можно выполнить такую программу на qemu или bochs?
Qemu, Bochs у второго это настаивается. Есть регистр есть шина адреса и логический элемент И. При записи в регистр GateA20 в него заносится 0 либо 1. А далее когда процессор выставляет адрес лишние биты просто обновляются.
Aoizora, вот ресурс, где всё/это объясняется на пальцах --- Сообщение объединено, 8 июн 2019 --- и в качестве эмулятора лучше использовать bochs, т.к. он имеет встроенный отладчик
По ссылке восхитительный материал. А можно пример конфигурации bochs для запуска com? Я под ним запускал только XSystem по гайду из древнего е-зина.
Я пока решил повозиться с запуском моей программы под 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): megs: 32 romimage: file=$BXSHARE/BIOS-bochs-latest vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest vga: extension=vbe, update_freq=15 floppya: 1_44=a.img, status=inserted floppyb: 1_44=b.img, status=inserted ata0-master: type=disk, path=c.img, cylinders=306, heads=4, spt=17 boot: c log: bochsout.txt mouse: enabled=0 cpu: ips=15000000 Переменная $BXSHARE не задана, echo ее не распечатывает --- Сообщение объединено, 9 июн 2019 --- Сделал export BXSHARE=/usr/share/bochs перед запуском бокса и это не помогло.
1. Качаю его и в окне установки взвожу флаг 'DLX-Linux-Demo'. Дальше.., по-дефолту: 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 Если твой код перейдёт в защищённый режим, то выделенная в окне отладчика надпись должна поменяться на РМ. да, нужно написать ещё загрузчик, который будет запускать твою ос
Покопавшись в документации к VirtualBox узнал, что он тоже имеет встроенный отладчик. Кто нибудь пользовался?
Это убойно когда кто-то пишет библиотеку, потом меняет в ней чтото. а ктото года полтора тратит чтобы её изучить. Это же Виртуалбокс. Не фуфрымухры.
А если я создам свой флоппи-образ при помощи bximage под линуксом, как мне в этот образ записать свой бутлоадер? Линуковый dd bs=512 count=512 if=./boot.bin of=floppy.img обрезает образ до размера 512 байт.
>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): base address = base address * segment size (16) + offset 07C0:0000 = 07C0 * 16 (decimal) + 0 = 07C00 + 0 = 0x7C00 Не понимаю, почему нужно умножить именно на размер сегмента. В данном случае умножение на 16 это то же самое, чтосдвиг влево на 4. Для чего это? Почему не оставить просто базовый адрес сегмента? --- Сообщение объединено, 23 июн 2019 --- Разве базовый адрес сегмента это не адрес его первого байта в физическом пространстве, к которому достаточно просто прибавить смещение? --- Сообщение объединено, 23 июн 2019 --- Или значение в сегментном регистре это порядковый номер сегмента, на которые разделена память?
Никак. Он связан с сегментной моделью 8086. Наследие прошлых веков с которым приходится сталкиваться.
А если взять такие адреса в реальном режиме: 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? И этот адрес первого байта, видимо, и нужно считать базовым адресом сегмента.
Тут у вас опечатка 1:0 = 1*16 + 0 = 16 Именно так. Именно так допускает. Косяк разработчиков. Если шлюз A20 закрыт то зациклится. Если открыт пойдёт дальше. Именно так.
Перешел на винду, Bochs стал валиться на строке конфига options="gui_debug": Код (Text): megs: 32 floppya: 1_44=bin/boot.bin, status=inserted boot: a log: bochsout.txt mouse: enabled=0 display_library: win32, options="guidebug" Возникает ошибка "Unknown win32 option 'guidebug'". С опцией gui_debug (с подчеркиванием) ошибка та же самая. Как правильно под виндой юзать дебаггер?