Позволяет ли использование FreeDOS моей программе получить доступ к более чем 64 КБ памяти?

Я заинтересован в программировании на C для FreeDOS, изучая некоторые основы ASM в процессе, позволит ли использование FreeDOS моей программе получить доступ к большему, чем стандартные 640 КБ памяти?

А во-вторых, насчет ASM, я знаю, что на современных процессорах сложно программировать на ассемблере из-за сложности архитектуры ЦП, но ограничивает ли меня использование FreeDOS предположительно более простым 16-битным набором инструкций?


person Jason Mills    schedule 03.12.2013    source источник
comment
Вы имеете в виду 640к? И найдите расширитель DOS.   -  person Elliott Frisch    schedule 03.12.2013
comment
Я бы подумал об использовании dosbox для запуска вашего кода.   -  person drescherjm    schedule 03.12.2013
comment
1) Да, вы получаете его в виде «сегментов» по ​​64 КБ - есть 10 (легко) доступных. 2) Обе MS/DR DOS позволяют использовать 32-битные инструкции - freedos сообщает о проблемах с режимом 386 wfw 3.11 - Предположительно, из-за неполной поддержки входа/выхода из защищенного режима.   -  person enhzflep    schedule 03.12.2013
comment
Я помню, как загрузил FreeDOS на свой рабочий стол с помощью XMS, и он сообщил о ~ 4 ГБ ОЗУ, все ли доступно (объявление переменных, использование указателей и т. Д.), Как обычно, или есть некоторые соображения, которые мне нужно принять во внимание?   -  person Jason Mills    schedule 03.12.2013
comment
Я не могу представить, почему вы находите 16-битный режим последних процессоров x86 проще, чем их 32-битный или 64-битный режим.... ; что 16-битный режим в основном является устаревшим.   -  person Basile Starynkevitch    schedule 03.12.2013
comment
Ваш вопрос соответствует обычному шаблону утверждения, что я знаю... за которым следует что-то противоречащее действительности. Если вы не знаете, скажите, что не знаете, а затем спросите, вместо того, чтобы делать неверные предположения.   -  person R.. GitHub STOP HELPING ICE    schedule 03.12.2013
comment
R & Basile, сотрите то, что я сказал. Достаточно ли просто программировать на ассемблере современные процессоры в 32-битном/64-битном режиме? Я только сейчас хочу заняться программированием более низкого уровня, пожалуйста, простите мои ошибки и ложные предположения.   -  person Jason Mills    schedule 03.12.2013
comment
Хе! Разумно определяйте. В ваших силах программировать в 16-битном и/или 32-битном и/или 64-битном режиме, если хотите. Современные процессоры все еще знают все простые инструкции. Вам не нужно использовать экзотические вещи. FreeDOS не помешает вам использовать 4 ГБ памяти или использовать 32-битные или даже 64-битные инструкции. Возможно, вам придется прыгать через некоторые обручи. FreeDOS не слишком поможет вам, но и не помешает вам делать все, что вы хотите (в пределах возможностей вашего оборудования). ОС защищенного режима защищена от США! С FreeDOS вы владеете всей машиной.   -  person Frank Kotler    schedule 03.12.2013
comment
Написание asm пользовательского пространства в 32-битном защищенном режиме, безусловно, проще и удобнее, чем писать код для 16-битной DOS со всеми его вещами и ограничениями.   -  person Devolus    schedule 03.12.2013
comment
16 бит умер. Даже BIOS 32-битный (ранняя загрузка), а чуть позже запускается и 64-битный.   -  person egur    schedule 03.12.2013


Ответы (2)


Без каких-либо расширителей программа может использовать максимум 640 КБ малой памяти в DOS. Но каждая структура будет ограничена размером сегмента или 64 КБ. Это означает, что у вас может быть 10 больших массивов размером 64 КБ. Конечно, в сегменте может быть несколько массивов, но их общий размер не должен превышать размер сегмента. Некоторые компиляторы также автоматически обрабатывают адреса, охватывающие несколько сегментов, поэтому вы можете беспрепятственно использовать объекты размером более 64 КБ, или вы также можете сделать то же самое, если пишете на ассемблере.

Чтобы получить доступ к большему объему памяти, вам понадобится расширитель, например EMS или XMS. Но обратите внимание, что адресное пространство по-прежнему имеет ширину 20 бит. Расширители просто сопоставляют области высокой памяти с некоторыми сегментами адресного пространства, поэтому вы можете видеть только небольшое окно ваших данных за раз.

Что касается ассемблера, вы можете использовать 32-битные регистры в 16-битном режиме. Существуют префиксы 66h и 67h для изменения размера операнда. Однако это не означает, что писать 16-битный код проще. На самом деле у него есть много особенностей, которые нужно помнить, например, ограниченное использование регистров при адресации памяти. 32-битный набор инструкций x86 намного чище благодаря более разумным режимам адресации, а также плоскому адресному пространству, которое намного проще в использовании.

person phuclv    schedule 03.12.2013
comment
Неправда. Огромная модель памяти в C позволяет рассматривать сегментированное пространство как плоское пространство, включая сегмент во все указатели. - person Brian Knoblauch; 04.12.2013
comment
@BrianKnoblauch: нет, включение сегмента в указатель просто заставляет его действовать как дальний указатель. Это не означает, что указатель можно свободно использовать как плоский указатель. Например, вы не можете выполнять прямые арифметические операции, такие как ptr + 200, как плоский указатель. Конечно компилятор или программист справятся с этим, но это уже другая проблема - person phuclv; 05.12.2013
comment
В огромной модели компилятор делает всю эту работу за вас, поэтому вы можете просто увеличивать указатели и использовать массивы размером более 64 КиБ. В этом весь смысл. Вы описываете модель большой памяти, которая этого не делает. - person Brian Knoblauch; 05.12.2013

MS-DOS и FreeDOS используют области «HIMEM»: это:

  • Некоторые области памяти выше 0xA000:0x0000 зарезервированы для плат расширения, которые содержат ОЗУ вместо плат расширения.
  • Память, начинающаяся с 0xFFFF:0x0010 до 0xFFFF:0xFFFF, расположенная выше 1 МБ, но доступная с использованием 16-битного кода реального режима (если активна так называемая линия A20).

Максимальный объем памяти, который можно заархивировать таким образом, составляет около 800 КБ.

Используя XMS и EMS, вы можете использовать до 64M:

  • XMS будет выделять блоки памяти над областью, к которой можно получить доступ через 16-битный код реального режима. Существуют специальные функции, которые могут копировать данные из этой памяти в младшие 640 КБ памяти и наоборот.
  • СЭМ аналогична; однако с помощью EMS можно «сопоставить» старшую память с младшим адресом (функция 32-разрядных ЦП), что означает, что вы можете получить доступ к некоторой памяти выше области 1 МБ, как если бы она была расположена по адресу ниже 1 МБ.
person Martin Rosenau    schedule 03.12.2013
comment
EMS существовал до 32-разрядных процессоров, поэтому его функция сопоставления на самом деле не имеет ничего общего с функциями пейджинга, присутствующими в процессорах 386+. 386 процессоров позволяли в свое время эмулировать EMS, переключая процессор в режим V8086 и управляя памятью из защищенного режима с включенным пейджингом. - person mcleod_ideafix; 03.12.2013
comment
... это означает, что при использовании старых процессоров требовалось дополнительное оборудование, а использование 386+ EMS — чисто программная функция. - person Martin Rosenau; 04.12.2013