Важная информация

User Tag List

Страница 8 из 8 ПерваяПервая ... 45678
Показано с 71 по 77 из 77

Тема: Менеджер памяти для многозадачной ОС

  1. #71
    Master
    Регистрация
    27.01.2005
    Сообщений
    905
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    142 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

  2. #72
    Veteran Аватар для GriV
    Регистрация
    18.02.2005
    Адрес
    Набережные Челны
    Сообщений
    1,574
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Thumbs up 2SfS> Идеи у нас похожие,

    так что не вижу причин враждовать %)

    То, что ты привёл в описание имеет практическую реализацию?
    Биты рулят лучше байтов, байты рулят шустрее!
    View, Звук, Цвет

  3. #73
    Master
    Регистрация
    27.01.2005
    Сообщений
    905
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    142 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от GriV
    так что не вижу причин враждовать %)

    То, что ты привёл в описание имеет практическую реализацию?
    Враждовать причин нет - это точно. Реализация пока "в процессе". Но в связи с покупкой жилья пока нет времени до ума довести. Скорее всего время появится только через месяц-два.
    Но форум смотрю постоянно - если возникнут мысли - кидай. Обсудим по мере возможности.

  4. #74
    Master
    Регистрация
    27.01.2005
    Сообщений
    905
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    142 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Отдаю менеджер локальной кучи безвозмездно и бескорыстно. Особенности:
    -автоматом определяет размерность адреса
    -функция l_free имеет защиту от дурака (неправильный указатель).
    Работает не очень быстро, но надежно. Проверен необнократно на AVR (16битный адрес) и ARM (32битный адрес). Под z80 компилил при помощи SDCC. Вроде тоже нормально работает.

    Текст состоит из двух файлов. heap.h и heap.c.
    Вопросы задавать МОЖНО

  5. #75
    Master
    Регистрация
    27.01.2005
    Сообщений
    905
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    142 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    //----------------------------------------------------------------------------
    // Работа с кучей. Заголовочный файл heap.h
    // SfS (c)2005
    // Структура кучи:
    // |t_dynamem_descr| memory part |t_dynamem_descr| memory part |...|t_dynamem_descr| memory part |
    // где
    // t_dynamem_descr - описатель элемента памяти (см. ниже)
    // memory part - элемент памяти, который описывается соответствующим описателем
    //
    // Поле next_dynamem_descr описателя последнего элемента памяти всегда указывает
    // на описатель первого элемента (циклическая структура структура).
    // Поле prev_dynamem_descr описателя первого элемента памяти указывает
    // на первый элемент (сам на себя).
    //----------------------------------------------------------------------------
    #ifndef heap_h
    #define heap_h
    //----------------------------------------------------------------------------
    // Макрос HEAP_ALIGN задает нужно ли выравнивание.
    // Общий вид:
    // #define HEAP_ALIGN n /* n=0,2,4,8... */
    // Выравнивание производится только по границе 2^n байт
    // #define HEAP_ALIGN 0x00 /* нет выравнивания */
    // #define HEAP_ALIGN 0x02 /* выравнивание по полуслову (16 бит) */
    // #define HEAP_ALIGN 0x04 /* выравнивание по слову (32 бит) */
    // #define HEAP_ALIGN 0x08 /* выравнивание по двойному слову (64 бит) */
    // Если используется выравнивание, то начало кучи и ее размер так же должны быть
    // выровнены !
    //----------------------------------------------------------------------------
    #ifndef HEAP_ALIGN
    #define HEAP_ALIGN sizeof(int)
    #else
    #if HEAP_ALIGN==0
    #undef HEAP_ALIGN
    #endif /* 0 */
    #endif /* HEAP_ALIGN */
    //----------------------------------------------------------------------------
    // Флаги (поле flags типа t_dynamem_descr)
    #define DM_BUSY 0x00000001 /* Если флаг равен 1, то блок памяти занят */
    //----------------------------------------------------------------------------
    // Описатель элемента кучи (тип-структура t_heap_el)
    //----------------------------------------------------------------------------
    typedef struct
    {void* next_dynamem_descr; // Указатель на описатель следующего элемента
    // Поле next_dynamem_descr последнего элемента
    // памяти всегда указывает на
    // описатель первого элемента
    // (циклическая структура структура).
    //
    void* prev_dynamem_descr; // Указатель на описатель предыдущего элемента
    // Для первого элемента кучи этот указатель указывает
    // на первый элемент (сам на себя).
    //
    void* this_memory_part; // Указатель на элемент памяти. Элемент ВСЕГДА
    // расположен сразу за описателем
    unsigned int this_memory_size; // Размер элемента памяти (в байтах)
    unsigned int flags; // Флаги элемента памяти
    }t_heap_el;
    //----------------------------------------------------------------------------
    // Структура-описатель кучи (тип-структура t_heap)
    //----------------------------------------------------------------------------
    typedef struct
    {// Указатель на текущий элемент кучи
    t_heap_el* curel;
    // Указатель на начало кучи (на описатель первого элемента)
    t_heap_el* firstel;
    }t_heap;
    //----------------------------------------------------------------------------
    // На всякий случай
    //----------------------------------------------------------------------------
    #ifndef NULL
    #define NULL 0
    #endif
    //----------------------------------------------------------------------------
    // Резервирует память в куче 'heap', размером 'size' байт.
    // Возвращает указатель на зарезервированную память
    // Если в куче не достаточно памяти, то возвращает NULL
    //----------------------------------------------------------------------------
    void* l_malloc(t_heap* heap, unsigned int size);
    //----------------------------------------------------------------------------
    // Резервирует память в куче 'heap', для размещения массива из 'nmemb' элементов,
    // каждый из которых имеет размер 'size'
    // Возвращает указатель на зарезервированную память
    // Если в куче не достаточно памяти, то возвращает NULL
    //----------------------------------------------------------------------------
    void* l_calloc(t_heap* heap,int nmemb,int size);
    //----------------------------------------------------------------------------
    // Освобождает зарезервированную память, на которую указывает 'ptr' в куче 'heap'.
    // Если указатель указывает на память, которая не была выделена ранее
    // функциями l_malloc() или l_calloc() или указатель 'ptr' равен 0, то ничего не
    // происходит
    void l_free(t_heap* heap, void* ptr);
    //----------------------------------------------------------------------------
    // Инициализирует кучу 'heap'.
    // heap_begin - адрес начала кучи
    // heap_size - размер кучи (включая все описатели)
    // Куча занимает в памяти адресное пространство
    // от heap_begin до (heap_begin+heap_size-1)
    void l_heapinit(t_heap* heap, void* heap_begin, int heap_size);
    //----------------------------------------------------------------------------
    #endif /* heap_h */

  6. #76
    Master
    Регистрация
    27.01.2005
    Сообщений
    905
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    142 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    //----------------------------------------------------------------------------
    // Работа с кучей. Заголовочный файл.
    // Файл heap.h
    // Структура кучи:
    // |t_dynamem_descr| memory part |t_dynamem_descr| memory part |...|t_dynamem_descr| memory part |
    // где
    // t_dynamem_descr - описатель элемента памяти (см. ниже)
    // memory part - элемент памяти, который описывается соответствующим описателем
    //
    // Поле next_dynamem_descr описателя последнего элемента памяти всегда указывает
    // на описатель первого элемента (циклическая структура структура).
    // Поле prev_dynamem_descr описателя первого элемента памяти указывает
    // на первый элемент (сам на себя).
    //----------------------------------------------------------------------------
    #ifndef heap_h
    #define heap_h
    //----------------------------------------------------------------------------
    // Макрос HEAP_ALIGN задает нужно ли выравнивание.
    // Общий вид:
    // #define HEAP_ALIGN n /* n=0,2,4,8... */
    // Выравнивание производится только по границе 2^n байт
    // #define HEAP_ALIGN 0x00 /* нет выравнивания */
    // #define HEAP_ALIGN 0x02 /* выравнивание по полуслову (16 бит) */
    // #define HEAP_ALIGN 0x04 /* выравнивание по слову (32 бит) */
    // #define HEAP_ALIGN 0x08 /* выравнивание по двойному слову (64 бит) */
    // Если используется выравнивание, то начало кучи и ее размер так же должны быть
    // выровнены !
    //----------------------------------------------------------------------------
    #ifndef HEAP_ALIGN
    #define HEAP_ALIGN sizeof(int)
    #else
    #if HEAP_ALIGN==0
    #undef HEAP_ALIGN
    #endif /* 0 */
    #endif /* HEAP_ALIGN */
    //----------------------------------------------------------------------------
    // Флаги (поле flags типа t_dynamem_descr)
    #define DM_BUSY 0x00000001 /* Если флаг равен 1, то блок памяти занят */
    //----------------------------------------------------------------------------
    // Описатель элемента кучи (тип-структура t_heap_el)
    //----------------------------------------------------------------------------
    typedef struct
    {void* next_dynamem_descr; // Указатель на описатель следующего элемента
    // Поле next_dynamem_descr последнего элемента
    // памяти всегда указывает на
    // описатель первого элемента
    // (циклическая структура структура).
    //
    void* prev_dynamem_descr; // Указатель на описатель предыдущего элемента
    // Для первого элемента кучи этот указатель указывает
    // на первый элемент (сам на себя).
    //
    void* this_memory_part; // Указатель на элемент памяти. Элемент ВСЕГДА
    // расположен сразу за описателем
    unsigned int this_memory_size; // Размер элемента памяти (в байтах)
    unsigned int flags; // Флаги элемента памяти
    }t_heap_el;
    //----------------------------------------------------------------------------
    // Структура-описатель кучи (тип-структура t_heap)
    //----------------------------------------------------------------------------
    typedef struct
    {// Указатель на текущий элемент кучи
    t_heap_el* curel;
    // Указатель на начало кучи (на описатель первого элемента)
    t_heap_el* firstel;
    }t_heap;
    //----------------------------------------------------------------------------
    // На всякий случай
    //----------------------------------------------------------------------------
    #ifndef NULL
    #define NULL 0
    #endif
    //----------------------------------------------------------------------------
    // Резервирует память в куче 'heap', размером 'size' байт.
    // Возвращает указатель на зарезервированную память
    // Если в куче не достаточно памяти, то возвращает NULL
    //----------------------------------------------------------------------------
    void* l_malloc(t_heap* heap, unsigned int size);
    //----------------------------------------------------------------------------
    // Резервирует память в куче 'heap', для размещения массива из 'nmemb' элементов,
    // каждый из которых имеет размер 'size'
    // Возвращает указатель на зарезервированную память
    // Если в куче не достаточно памяти, то возвращает NULL
    //----------------------------------------------------------------------------
    void* l_calloc(t_heap* heap,int nmemb,int size);
    //----------------------------------------------------------------------------
    // Освобождает зарезервированную память, на которую указывает 'ptr' в куче 'heap'.
    // Если указатель указывает на память, которая не была выделена ранее
    // функциями l_malloc() или l_calloc() или указатель 'ptr' равен 0, то ничего не
    // происходит
    void l_free(t_heap* heap, void* ptr);
    //----------------------------------------------------------------------------
    // Инициализирует кучу 'heap'.
    // heap_begin - адрес начала кучи
    // heap_size - размер кучи (включая все описатели)
    // Куча занимает в памяти адресное пространство
    // от heap_begin до (heap_begin+heap_size-1)
    void l_heapinit(t_heap* heap, void* heap_begin, int heap_size);
    //----------------------------------------------------------------------------
    #endif /* heap_h */

  7. #76
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  8. #77
    Master
    Регистрация
    27.01.2005
    Сообщений
    905
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    142 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Сильно длинный файл.
    Архив исходников тут

    http://www.nedopc.org/nedopc/upload/heap.tar

    Комментарии на русском в кодировке koi8-r

Страница 8 из 8 ПерваяПервая ... 45678

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 6
    Последнее: 10.09.2013, 16:04
  2. Порты памяти - Scorpion и др.
    от ASMAN в разделе Программирование
    Ответов: 27
    Последнее: 18.06.2008, 12:20
  3. Unreal. Breakpoint на чтение памяти.
    от valker в разделе Эмуляторы
    Ответов: 1
    Последнее: 12.02.2005, 12:58

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •