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) bloco dividido (N) = capacidade do conjunto de memória (bytes)
(Bytes ocupados pela tabela de gerenciamento de memória (U16: 2 bytes) 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) bloco de memória (32 bytes) = 40K 32 = 40 1024 32 = 1280.
A capacidade da tabela de gerenciamento de memória (bytes) = 2 blocos divididos (N) = 2 (capacidade do conjunto de memória (bytes) blocos de memória (32 bytes)) = 2 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.