Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

расширенная память

Аноним
Как происходит доступ ко всей оперативке в DOS через himem, qemm386 и т.д. ? Ведь дос работает в реальном режиме.
461
18 марта 2002 года
gerard
102 / / 20.12.1999
Ну, во-первых, кроме сегментации памяти в защищенном режиме есть еще деление памяти на страницы, при котором все пространство логических адресов (20-разрядных в реальном режиме или 32-разрядных в защищенном) делится на страницы размером 4 Кб или 4 Мб, и каждая страница отображается на реальный физический 32/36-разрядный адрес памяти. В частности, драйвер EMS-памяти выделяет 64 Кб в старших адресах (например E0000h - EFFFFh) и отображает их на адреса за пределами 1 Мб. Программа работает в реальном режиме, но может обращаться практически ко всей памяти, просто нужные страницы будут подставляться по мере необходимости.

Во-вторых, есть драйверы под DOS (например, DPMI), которые позволяют запустить программу в защищенном режиме, а потом снова вернуться в реальный. Причем все прерывания реального режима обрабатываются нормально.

В-третьих, есть достаточно простой способ получить доступ ко всей памяти в реальном режиме. Если вы перейдете в защищенный режим и загрузите в регистр FS или GS указатель на сегмент данных с базовым адресом 00000000h, длиной FFFFFFFFh и доступный для записи, то при возвращении в реальный режим можно будет по прежнему обращаться к этому сегменту, пока не будет перезагружен соответствующий сегментный регистр.
572
18 марта 2002 года
Chingachguk
29 / / 20.01.2000
Просто используются как переключения в защищенный режим на время вызова соответствующего сервиса и возврат обратно в ДОС, так и специальный режим V86(режим виртуального процессора 8086).

Допустим, из чистого ДОС-а необходимо иметь возможность сделать что-то вроде сервиса на стандартных 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 уже был в системе и расширитель его просто обнаружит).

461
18 марта 2002 года
gerard
102 / / 20.12.1999
Цитата:

Что любопытно, если такой менеджер начнет запись в 2-ой мегабайт, то по возврате в ДОС начнутся необратимые разрушения самого дос(версия 6.22)(видимо, он тоже размещает там свои данные схожим образом?)


Просто ДОС использует так называемую верхнюю память (High Memory), которая занимает 64 Кб начиная с адреса 000FFFF0h, то есть почти целиком во втором мегабайте (кроме первых 16 байт), но из-за некоего аппаратного глюка в процессорах Intel к ней можно обращаться из реального режима, если задавать адрес так, что сегмент*16+смещение>100000h (например,
FFFFh8000h дает 107FF0h, хотя по-хорошему должно быть просто 7FF0h). Нужно только отключить блокировку адресной линии A20 (это делается через бит 1 порта 61h). И если в CONFIG.SYS указать DOS=HIGH и загрузить HIMEM.SYS (или QEMM), то сама ДОС и, может быть, некоторые драйверы будут грузиться как раз туда, и любая запись в начало второго мегабайта их разрушит.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог