Este tutorial vai tentar mostrar-lhe como escrever um simples alocador quadro de página para o CPU x86. A linguagem utilizada é C e nós estamos usando paginação padrão com 4 páginas KiB. O alocador de quadro de página irá alocar quadros com o primeiro quadro começando logo após o término do kernel.
Cada quadro deve ser gerido com um mapa byte (por uma questão de simplicidade) : um valor de 0x01 para páginas usadas e um valor de 0x00 para páginas não utilizadas.
Para alocar uma página, tudo que é necessário é a busca através da matriz para uma página livre e, em seguida, marcá-la como usado. Você deve ter notado que esta seria muito ineficiente, ter que procurar por uma possível série de 1048319 páginas. Para acelerar o processo de atribuição do alocador irá alocar 20 quadros da página de cada vez, por isso na maioria das vezes tudo o que terá sido feito antes da mão. Alocatting uma nova página é simplesmente uma questão de obter um quadro de página fora de uma série de quadros pré-alocados.
Em primeiro lugar, vamos precisar de algo no script vinculador para nos dizer onde o fim do nosso kernel é.
ENTRADA (carregador) SEÇÕES {. = 0x00100000; .text:. {text_start =; (. rodata): * (. texto)} .rodata ALIGN (0x1000) {} * .data ALIGN (0x1000): * {(. de dados) end_data =;} .bss:.. {SBSS =; * (COMUM) * (BSS). EBSS =.; endkernel =.; }}O endkernel variável será declarada no kernel como:
externo endkernel u32int;A variável em si não tem valor, é o endereço da variável que estamos usando.
endkernel será usada para calcular o endereço do primeiro quadro principal após o kernel. O código para a busca através da matriz também é muito simples:
kalloc_frame_int pageframe_t estática () {u32int i = 0; while (frame_map [i] = GRÁTIS!) {i ++; if (i == NPAGES) {return (ERROR); }} Frame_map [i] = USADO; retorno (startframe + (i * 0x1000)); //retorna o endereço do quadro de página com base na localização declarou //livre no array}A última função utilizada chamadas kalloc_frame_int cada 20 páginas alocações quadro:
pageframe_t kalloc_frame () {u8int estática alocar = 1; //se estamos ou não vai alocar um novo conjunto de preframes u8int pFrame estática = 0; pageframe_t ret; if (pFrame == 20) {alocar = 1; } If (alocar == 1) {for (int i = 0; i {pre_frames [i] = kalloc_frame_int ();} pFrame = 0; alocar = 0;} ret = pre_frames [pFrame]; pFramCriando um jogo de plataforma flash com Flixel e Flex - Introdução
- Basics erro no C
- Basics oop em C ++
- Programador por Heart
- ActivePerl condicional Statements
- Objeto HTML como Element
- Cuidado !!!! Estresse
- O que é Programação de Computadores?
- Como configurar suas conexões de rede do Windows Vista
- Aplicativo de console para a criação de pirâmide estrela usando o código C #…
- Database Design