*   >> Leitura Educação Artigos >> science >> programação

Escrevendo um quadro de página Allocator

Introdução

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.

O Método

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.


A Implementação

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]; pFram

Page   <<       [1] [2] >>

Copyright © 2008 - 2016 Leitura Educação Artigos,https://artigos.nmjjxx.com All rights reserved.