расширенная память
Как происходит доступ ко всей оперативке в DOS через himem, qemm386 и т.д. ? Ведь дос работает в реальном режиме.
Во-вторых, есть драйверы под DOS (например, DPMI), которые позволяют запустить программу в защищенном режиме, а потом снова вернуться в реальный. Причем все прерывания реального режима обрабатываются нормально.
В-третьих, есть достаточно простой способ получить доступ ко всей памяти в реальном режиме. Если вы перейдете в защищенный режим и загрузите в регистр FS или GS указатель на сегмент данных с базовым адресом 00000000h, длиной FFFFFFFFh и доступный для записи, то при возвращении в реальный режим можно будет по прежнему обращаться к этому сегменту, пока не будет перезагружен соответствующий сегментный регистр.
Допустим, из чистого ДОС-а необходимо иметь возможность сделать что-то вроде сервиса на стандартных int 21h, int 2Fh примерно следующего плана: зовем их с определенной функцией и указываем в регитрах или еще где адрес сегмента в 1-м мегабайте и его размер, который надо сохранить(получить из) где-то в расширенной памяти. Сервис запоминает адрес этого сегмента, переключается в PMode и получает на время доступ ко всей памяти, запоминает(считывет) там указанный сегмент и переключается обратно в Real Mode - это можно сделать без разрушения ДОС. Я сам когда-то развлекался этим - могу тупенький примерчик дать. Что любопытно, если такой менеджер начнет запись в 2-ой мегабайт, то по возврате в ДОС начнутся необратимые разрушения самого дос(версия 6.22)(видимо, он тоже размещает там свои данные схожим образом ?)
Ну а что касается V86 - так совсем просто. Программа-менеджер создает окно V86 для дос-а, выполняет(эмулирует) все прерывания и т.п.
Естественно, она может поддерживать те же сервисы, как было написано выше.
Что касается DPMI - так на самом деле программа, написанная по правилам ДОС, работает в PMode ! Это достигается тем объединением программы в моемент компилляции с так называемым Расширителем(Far Lab, PMode...). Реально вызываемые прерывания int 16h, int 21h, формально неверные в PMode-режиме, эмулируются менеджером DPMI(им либо станет сам расширитель, либо менеджер DPMI уже был в системе и расширитель его просто обнаружит).
Цитата:
Что любопытно, если такой менеджер начнет запись в 2-ой мегабайт, то по возврате в ДОС начнутся необратимые разрушения самого дос(версия 6.22)(видимо, он тоже размещает там свои данные схожим образом?)
Просто ДОС использует так называемую верхнюю память (High Memory), которая занимает 64 Кб начиная с адреса 000FFFF0h, то есть почти целиком во втором мегабайте (кроме первых 16 байт), но из-за некоего аппаратного глюка в процессорах Intel к ней можно обращаться из реального режима, если задавать адрес так, что сегмент*16+смещение>100000h (например,
FFFFh8000h дает 107FF0h, хотя по-хорошему должно быть просто 7FF0h). Нужно только отключить блокировку адресной линии A20 (это делается через бит 1 порта 61h). И если в CONFIG.SYS указать DOS=HIGH и загрузить HIMEM.SYS (или QEMM), то сама ДОС и, может быть, некоторые драйверы будут грузиться как раз туда, и любая запись в начало второго мегабайта их разрушит.