Gerenciamento de memória baseado em stm32 (X)

1. Introdução

1. Função

Gerenciamento de memória refere-se à tecnologia de alocação e uso de recursos de memória do computador quando o software está em execução. Sua finalidade principal é a alocação de quão eficiente e rápido e de lançamento e recuperação de recursos de memória no momento apropriado.

2. Conceito

Existem várias maneiras de implementar o gerenciamento de memória: na verdade  , todas elas precisam implementar duas  funções:  malloc  e  free.

A  função malloc é usada para aplicação de memória.

A  função livre é usada para liberar memória. 

Como pode ser visto na figura acima, o gerenciamento de memória baseado em bloco consiste em duas partes: pool de memória e tabela de gerenciamento de memória. O conjunto de memórias é dividido igualmente em  n blocos, a tabela de gerenciamento de memória correspondente também é do tamanho  n e cada item da tabela de gerenciamento de memória corresponde a um pedaço de memória no conjunto de memórias.
O significado do valor do item da tabela de gerenciamento de memória é: quando o valor desse item é  0  , significa que o bloco de memória correspondente não está ocupado e quando o valor desse item é diferente de zero, significa que o bloco de memória correspondente a esse item já está ocupado, o que O valor representa o número de blocos de memória que são ocupados continuamente. Um exemplo é  de 10 , em seguida, a presente descrição inclui o bloco de memória interna correspondente à entrada, um total atribuído  10  blocos de memória para um externo ponteiro.
Conforme mostrado na figura, a direção da alocação de memória é de cima para baixo. Ou seja, primeiro encontre a memória vazia desde o final. Quando o gerenciamento de memória é apenas inicializado, a tabela de memória é limpa, indicando que nenhum bloco de memória está ocupado.

Terceiro, o princípio da distribuição

Quando o ponteiro  p  chamar  malloc  quando a memória do aplicativo, primeiro determinar a  p  número de blocos de memória a ser alocada (m), e depois de os  n  itens separados  olhar para baixo até começando  m  blocos de bloco de memória vazio consecutivo (i correspondentes a tabela de gerenciamento de memória entrada é  0 ), então estes  m  número dentro de memória valores de entrada da tabela de gestão são definidos como  m (marcado ocupados), e, finalmente, o último endereço do bloco de memória é devolvido vazio ponteiro  P , para completar uma distribuição. Observe que, se não houver memória suficiente (encontrar  m  memória livre não for encontrada no final ), ele
retornará  NULL  para  p , indicando que a alocação falhou.

Quarto, o princípio da liberação

Quando  a memória solicitada por p  é utilizada e precisa ser liberada, a  função livre  é  chamada . livre  função determina primeiro  p  dirigida para dentro do endereço de memória do bloco de memória correspondente a, e então encontrar a entrada na tabela de gestão de memória correspondente, para dar  p  o número de blocos de memória ocupado por  m (o número de valores na entrada de tabela de gestão de memória é atribuído um bloco de memória) , estes  m  valor de uma entrada da tabela de gerenciamento de memória são apagados, marcando liberação de venda, para completar a liberação de memória. 

V. Parâmetros importantes

Tamanho da memória = tamanho do conjunto de memórias + tamanho da tabela de gerenciamento de memória

Bloco de memória (32 bytes) \ times  bloco dividido (N) = capacidade do conjunto de memória (bytes)

(Bytes ocupados pela tabela de gerenciamento de memória (U16: 2 bytes)  \ times Bloco dividido (N)) = Capacidade da tabela de gerenciamento de memória (bytes)

Em geral, os valores do bloco de memória e da capacidade do conjunto de memórias são conhecidos e são especificados pelos programadores com base na capacidade do hardware. Aqui, especificamos um bloco de memória de 32 bytes e uma capacidade de pool de memória de 40K.

 

Portanto, bloco dividido (N) = capacidade do conjunto de memória (bytes)  \ div bloco de memória (32 bytes) = 40K \ div 32 = 40  \ times 1024  \ div32 = 1280.

A capacidade da tabela de gerenciamento de memória (bytes) = 2 \ times blocos divididos (N) = 2  \ times (capacidade do conjunto de memória (bytes)  \ div blocos de memória (32 bytes)) = 2  \ times 1280 = 2560.

定义两个内存,一个是内部内存(40K),一个是外部内存SRAM(960K).

内存管理参数:

内存池总大小:40K
内存管理状态表大小:1280 (U16) 数据块个数N
内存分块大小:32 字节


内存池总大小:960K
内存管理状态表大小:30720(U16) 数据块个数N
内存分块大小:32 字节


定义结构体:
struct _m_mallco_dev
{
    u8  *membase[2]; //2个内存池 内部内存和外部内存的内存池
    u16 *memmap[2];  //2个内存管理状态表 
    u8  memrdy[2];      //内存初始化标志
}
定义数组:
内存池:
__align(32) u8 mem1base[40960];  //40K   内存容量(字节) 32个字节一个块,块对齐
__align(32) u8 mem2base[983040] __attribute__((at(0x68000000))); //960K  内存容量(字节)

内存管理状态表:
u16 mem1mapbase[1280];      //内存表大小  40K / 32
u16 mem2mapbase[30720];     //内存表大小  960K / 32


定义的结构体指向定义的数组。
struct _m_mallco_dev mallco_dev=
{
    mem1base,mem1base,
    mem1mapbase,mem1mapbase,
    0,0,
}

 

Cinco, o processo de alocação de memória

1. De acordo com o SIZE recebido, confirme que vários blocos de memória precisam ser alocados. Por exemplo, blocos M são necessários.

2. Na memória, procure os blocos de memória livre M. que estão continuamente livres Se os blocos contínuos não forem suficientes para os blocos M, procure a próxima parte do espaço contínuo. Se houver M blocos de blocos livres consecutivos, escreva M na tabela de status de gerenciamento de memória dos blocos M para indicar que os blocos M contínuos de memória são usados.

Seis, processo de memória livre

1. Com base no deslocamento aprovado, calcule o número de itens pertencentes a L e leia o valor R da tabela de status de gerenciamento de memória do item L.

2. Altere o valor dos estados de gerenciamento de memória L após o item L para 0.

Publicado 105 artigos originais · Gosto 30 · Visita mais de 160.000

Acho que você gosta

Origin blog.csdn.net/happygrilclh/article/details/102686173
Recomendado
Clasificación