· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ZEN —› Динамическое выделение памяти под ДОС

Посл.отвђт Сообщенiе


Дата: Май 12, 2004 09:55:58

Как можно реализовать динамическое выделение памяти для переменных под ДОС? Что то наподобие функций C malloc() и т.д. Про функции 48h и 49h int21h я в знаю. Нужно именно выделение памяти из кучи. Хотя бы натолкните на мысль или чего почитать подскажите. Или исходники этих функций где нарыть.


Дата: Май 12, 2004 11:22:22

void
Нужно именно выделение памяти из кучи
Свой менеджер кучи написать хочешь? Зачем?

Или исходники этих функций где нарыть.
Например, смотри CRTL BC++v3.1.


Дата: Май 12, 2004 12:20:48

Вообщето это курсовой такой. Называется реализация функций С для работы с динамической памятью. Должно быть писано на С с asm вставками. А за CRTL спасибо сейчас буду рыть, блин как я сразу не подумал.


Дата: Май 12, 2004 15:21:06

Функции 48h и 49h - это и есть динамическое выделение памяти "из кучи". Правда, не очень хорошего качества, но тем не менее... А какой компилятор будет использован для этого проекта?


Дата: Май 12, 2004 15:50:06

хм, есть смысл выделять память под массивы, потому что какой смысл для выделения её под переменные до 4байт размером фключительно. Хм, а чем тебя функции дос не устраивают, чем тебя дософская куча не устраивает. К тому же не забывай, дос - однозадачная система. а вообще, молодой человек, прошу вас к Кирилл Григоричу Финогенову, уж он то вам покажет что к чему
Рудаков, Финогенов, Программируем на языке ассемблера IBM PC, Обнинск, 1997

Извольте-с


Дата: Май 13, 2004 09:03:21

Компилятор будет использоваться BC 5.02 Все это будет писано на встроенном ассемблере (BASM кажись). А вообще то я порылся вчера в CRTL (вот уж действительно дельный совет), так эти функции (malloc, free) не пользуются функциями 48 и 49. Насколько я понял создается в памяти список свободных блоков памяти (причем выделять можно произвольного размера, а не с выравниванием по параграфам), и ведется очень активная работа со стеком. Не знаю: такое подозрение что динамическая память реализуется за счет перераспределения стека. Кстати это замечание мне в инете уже попадалось. К тому же есть 2 реализации malloc для near и far указателей, в зависимости от модели памяти используемой программой. Чувствую это я не смогу осилить за разумное время, будем выделять всеж параграфами :-) Все таки есть вопрос к аудитории: как можно из запущеной программы определить какую модель памяти она использует?


Дата: Май 13, 2004 11:39:32 · Поправил: q_q

void
Вообще модель памяти - это условность.

Можно использовать условную компиляцию. В Borland C определены макросы: __COMPACT__, __HUGE__, __LARGE__, __MEDIUM__, __SMALL__, __TINY__, а в Microsoft C - M_I86mM, _M_I86mM где m = T, S, C, M, L или H

Если без макросов, то можно попробовать такой код (проверял BC++v3.1 и MSVC++v1.52) (отличить large от huge мне не удалось)
#include <stdio.h>

typedef enum {
  mm_unknown = 0,
  mm_tiny,
  mm_small,
  mm_medium,
  mm_compact,
  mm_large_or_huge,
} memory_model;

memory_model detect_memory_model(void)
{
  int v1 = sizeof(void *);
  int v2 = sizeof(void (*)(void));

  int b2 = sizeof(unsigned short);
  int b4 = sizeof(unsigned long);

  if (b2 == v1 && b2 == v2)
  {
    unsigned short rCS, rDS;

    __asm push cs
    __asm pop  rCS
    __asm push ds
    __asm pop  rDS

    return rCS == rDS ? mm_tiny : mm_small;
  }

  else if (b2 == v1 && b4 == v2)
    return mm_medium;

  else if (b4 == v1 && b2 == v2)
    return mm_compact;

  else if (b4 == v1 && b4 == v2)
    return mm_large_or_huge;

  return mm_unknown;
}

int main(void)
{
  char *mm_text = "";

  switch (detect_memory_model())
  {
  case mm_unknown:
    mm_text = "unknown";
    break;

  case mm_tiny:
    mm_text = "tiny";
    break;

  case mm_small:
    mm_text = "small";
    break;

  case mm_medium:
    mm_text = "medium";
    break;

  case mm_compact:
    mm_text = "compact";
    break;

  case mm_large_or_huge:
    mm_text = "large or huge";
    break;

  default:
    mm_text = "?";
  }

  printf("memory model is %s\n", mm_text);

  return 0;
}


Дата: Май 17, 2004 11:00:59

Еще один глупый вопрос. Как определить размер сегмента данных.То есть где действительно в сегменте данных заканчиваются данные (на асм все понятно, а как это сделать в прогах окомпилированных другими компиляторами). Задумка такая. Организовать динамическую память в неиспользуемой области сегмента данных.


Дата: Май 17, 2004 20:44:57

Сканирование exe не поможет? Сорьки, я не в курсе как там в досе ехешники писались. Но в винде это делается через заголовок.


Дата: Май 18, 2004 06:01:39

void
Либо я не правильно понял той термин неиспользуемой области сегмента, либо - компиляторы не дураки пишут. Зачем создавать сегмент больше, чем это необходимо? В конце сегмента может быть неиспользуемое пространство, объем которого зависит от атрибута выравнивания сегмента. Теоретически не более 4кБ, а под dos’ом практически не более 16-ти байт.


Дата: Май 18, 2004 08:41:46

Вообщето насколько я понял в С действительно создается сегмент больше чем нужно (все таки это не asm). Кстати расположение heap зависит от модели памяти. Но я ковырял модель small, поэтому вот мои наблюдения. Сегмент данных и стека совпадает. Между ними где-то посередине heap. Причем heap этот есть там по умолчанию, так как некоторые C функции используют его неявно. Если посмотреть dump сегмента данных, то там даже есть слова heap end. В общем по большому счету нужно найти его начало. И использовать эту область по своему. Есть такое мнение: все глобальные переменные хранятся в сегменте данных и я думаю что можно подсчитать сколько памяти нужно под них. Все локальные переменные функций хранятся в стеке, в общем думаю можно подсчитать тоже, ну или на крайняк просто области стека дать хороший запас. Тогда получится что этот остаток можно использовать под heap. Правда все это носит искуственный характер. Я например не представляю как это можно посчитать из программы. Еще одно смущает. Если функции используют heap неявно, то любое мое вмешательство в его работу приведет к краху программы. Похоже что все это создается на уровне компилятора и влезть туда не представляется возможным. Теперь другая формулировка вопроса. Если он уже там есть, то почему бы им не воспользоваться. То есть теперь требуется написать реализации функций для корректной работы с С heap. Может у кого есть доки по реализации heap в С? Как получить к нему доступ? Может кто чего посоветует?


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.070