C Управление памятью во встроенных системах - PullRequest
0 голосов
/ 28 сентября 2011

Мне нужно использовать c / asm для создания системы управления памятью, так как malloc / free еще не существует.Мне нужно , чтобы иметь malloc / free!

Я думал об использовании стека памяти в качестве пространства для памяти, но это потерпит неудачу, потому что, когда указатель стека уменьшается, уродливые вещи случаются свыделенное пространство.

1) Где будет выделена память?Если я размещу его случайным образом в середине кучи / стека и расширится кучи / стека, возникнут конфликты с выделенным пространством!

12 Что Является самым простым / чистым решением для памятиуправление?Это единственные варианты, которые я исследовал:

  • Стек памяти, в котором malloc наращивает стек, а free (p) сокращает стек, сдвигая [p..stack_pointer] (это приведет к аннулированию сдвинутой памятиадреса хотя ...).
  • Связанный список (пул памяти) с порцией памяти переменного размера.Однако я не знаю , где , чтобы поместить это в память ... должен ли связанный список быть "глобальной" переменной или "статическим"?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 28 сентября 2011

В этой статье представлен хороший обзор методов управления памятью. В разделе ресурсов внизу есть ссылки на несколько реализаций malloc с открытым исходным кодом.

2 голосов
/ 28 сентября 2011

Для встроенных систем память разбивается во время соединения на несколько секций или пулов, то есть: ro (код + константы) rw (куча) zi (нулевая инициализированная память для статических переменных)

Вы можете добавитьЧетвертый раздел в файлах конфигурации компоновщика, который эффективно выделяет пространство на карте памяти для динамического выделения.

Однако, как только вы создали необработанное хранилище для динамической памяти, вам необходимо понять, сколько, сколько и какчасто будут происходить динамические распределения.Из этого вы можете построить картину того, как память будет фрагментироваться с течением времени.

Обычно приложение, работающее без ОС, не использует динамическую память, поскольку вам не нужно иметь дело с последствиями mallocтерпит неудачу.Если это вообще возможно, лучшим решением будет дизайн, чтобы избежать этого.Если это вообще невозможно, попробуйте упростить динамическое поведение, используя несколько больших структур, в которых данные предварительно выделены, прежде чем что-либо понадобится для их использования.

Например, скажем, что у вас есть приложение, которое обрабатывает 10 байтовданные, получая следующие 10 байтов данных для обработки, вы можете реализовать простое решение буферизации.Драйвер всегда будет запрашивать буферы одинакового размера, и потребуется 3 буфера.Добавление небольших метаданных в структуру:

{
    int inUse;
    char data[10];
}

Вы можете взять массив из трех из этих структур (не забывая инициализировать inUse до 0 и переключаться между [0] и [1], с [2]).зарезервировано для ситуаций, когда происходит несколько слишком много прерываний и требуется следующий буфер, буфер освобождается (необходимость в 3-м буфере). Алгоритм alloc должен будет проверить первый буфер! inUse и вернуть указатель на данныеСвободное просто нужно изменить inUse обратно на 0.

В зависимости от объема доступной оперативной памяти и используемой машины (физической / виртуальной адресации), существует множество возможных алгоритмов, но чем сложнееалгоритм, тем больше времени может занять распределение.

2 голосов
/ 28 сентября 2011

Объявите огромный статический буфер символов и используйте эту память для написания собственных функций malloc & free.

Алгоритмы написания malloc и free могут быть настолько сложными (и оптимизированными) или настолько простыми, насколько вы хотите.

Одним простым способом может быть следующий ...

в зависимости от типа потребностей в выделении памяти в вашем приложении, попробуйте найти наиболее распространенные размеры буфера

  • объявляйте структурыдля каждого размера с символьным буфером этой длины и логическим значением, представляющим, занят буфер или нет.
  • Затем объявляйте статические массивы вышеуказанных структур (определяйте размеры массивов на основе общего объема памяти, доступной в системе)
  • теперь malloc просто выбирает наиболее подходящий массив на основе требуемого размера и ищет свободный буфер (используйте здесь какой-либо алгоритм поиска или просто используйте линейный поиск) и возвращает результат.Также пометьте логическое значение в связанной структуре как ИСТИНА.
  • free будет просто искать буфер и пометить логическое значение как ЛОЖНОЕ.

надеюсь, это поможет.

0 голосов
/ 28 сентября 2011

Используйте библиотеку GNU C .Вы можете использовать только malloc() и free() или любое другое подмножество библиотеки.Заимствование дизайна и / или реализации и , а не повторное изобретение колеса - хороший способ продуктивной работы.

Если, конечно, это не домашняя работа, в которой цель упражнения заключается в реализации malloc и free ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...