реклама на сайте
подробности

 
 
> GCC Ворос по malloc
doomer#gp
сообщение Apr 20 2006, 05:50
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 382
Регистрация: 10-03-05
Из: USA
Пользователь №: 3 234



Как заставить malloc выделять память в Ext SRAM /SDRAM, в то время как указатель на стек загружена вершина внутреннего SRAM. Разделения стеков на kernel и user mode нету. Если никак то придется надо сделать принудительную реализацию различных стеков, огранизовав вызов "системных" функции через SWI. Хотелось бы иметь быстрый стек и динамичексую память из внешней.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
doomer#gp
сообщение Apr 24 2006, 17:34
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 382
Регистрация: 10-03-05
Из: USA
Пользователь №: 3 234



"Успокоился" на том, что придется писать собственный аллокатор.
А вот почему. Аллокатор в GCC не подерживает работу с MMU. В идеале должна получиться библиотечка, в которой можно будет переопределить подпрограммы работы с MMU для разных процов.
А пока мне был нужен аллокатор который мог бы работать с множеством куч. Это обусловлено тем, что выделяя небольшие кучи получим рост производительности аллокатора на обработке дефрагментации.
Пока реализовывается следующим набором функций

MEM_HANDLE* MmHeapAlloc(MEM_DESCR* pDescr );
unsigned char* MmProcessHeapSpace(MEM_HANDLE* pMemHandle,int nbytes);
unsigned char* MmAlloc(MEM_HANDLE* pMemHandle,int nbytes);
unsigned char* MmRelloc(MEM_HANDLE* pMemHandle,int nbytes);
void MmFree(unsigned char* pMem,MEM_HANDLE* pMemHandle);

Ну вообщем появлестя еще один идентификатор блока памяти - его хендл.

А с GCC у меня возникли некоторые проблемы. У меня версия 4.0.2 с newlibc. Там надо определить свой _sbrk_r(reentrant*,...). Я его написал как и описано в мануалах. Исполняю код и вижу функция вызвалась 2 раза внутри malloc(), и malloc выдает zero pointer. Проверил все - никак не вылечивается.
Глянул код - все библиотечные функции скомпилены в Thumb-е. В каком режиме _sbrk_r() не компиль результат тот-же.
Go to the top of the page
 
+Quote Post
makc
сообщение Apr 24 2006, 17:59
Сообщение #3


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Цитата(doomer#gp @ Apr 24 2006, 21:34) *
"Успокоился" на том, что придется писать собственный аллокатор.
А вот почему. Аллокатор в GCC не подерживает работу с MMU. В идеале должна получиться библиотечка, в которой можно будет переопределить подпрограммы работы с MMU для разных процов.
А пока мне был нужен аллокатор который мог бы работать с множеством куч. Это обусловлено тем, что выделяя небольшие кучи получим рост производительности аллокатора на обработке дефрагментации.
Пока реализовывается следующим набором функций

MEM_HANDLE* MmHeapAlloc(MEM_DESCR* pDescr );
unsigned char* MmProcessHeapSpace(MEM_HANDLE* pMemHandle,int nbytes);
unsigned char* MmAlloc(MEM_HANDLE* pMemHandle,int nbytes);
unsigned char* MmRelloc(MEM_HANDLE* pMemHandle,int nbytes);
void MmFree(unsigned char* pMem,MEM_HANDLE* pMemHandle);

Ну вообщем появлестя еще один идентификатор блока памяти - его хендл.


Фактически Вы пытаетесь реализовать VMM, который в большинстве случаев реализуется в ОС.
Кстати, посмотрите еще на mmaloc. Может поможет...

Цитата
А с GCC у меня возникли некоторые проблемы. У меня версия 4.0.2 с newlibc. Там надо определить свой _sbrk_r(reentrant*,...). Я его написал как и описано в мануалах. Исполняю код и вижу функция вызвалась 2 раза внутри malloc(), и malloc выдает zero pointer. Проверил все - никак не вылечивается.
Глянул код - все библиотечные функции скомпилены в Thumb-е. В каком режиме _sbrk_r() не компиль результат тот-же.


Если мне не изменяет память, то определять нужно просто caddr_t sbrk(int nbytes); а reentrant определяется через него:

Код
void *
_DEFUN (_sbrk_r, (ptr, incr),
     struct _reent *ptr _AND
     ptrdiff_t incr)
{
  char *ret;
  void *_sbrk(ptrdiff_t);

  errno = 0;
  if ((ret = (char *)(_sbrk (incr))) == (void *) -1 && errno != 0)
    ptr->_errno = errno;
  return ret;
}


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 05:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.02938 секунд с 7
ELECTRONIX ©2004-2016