Цитата(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;
}