*   >> Lectura Educación Artículos >> science >> programación

Escribir un marco de página Allocator

Introducción

Este tutorial intentará mostrar cómo escribir una sencilla asignador página de marco para la CPU x86. El lenguaje utilizado es C y estamos utilizando paginación de serie con 4 páginas KiB. El asignador de marco de página destinará marcos con el primer fotograma de comenzar inmediatamente después del final del núcleo.

El Método

Cada cuadro se gestionará con un mapa de bytes (para simplificar) : un valor de 0x01 para las páginas utilizadas y un valor de 0x00 para las páginas no utilizadas.

Para asignar una página, todo lo que se necesita es buscar a través de la matriz de una página gratuita y luego marcarlo como usado. Usted puede haber notado que esto sería muy ineficiente, tener que buscar a través de una posible serie de 1048319 páginas. Para acelerar el proceso de asignación del asignador destinará 20 marcos de página a la vez, así que la mayoría de las veces lo único que se habrá hecho antes de la mano. Alocatting una nueva página es simplemente una cuestión de conseguir un marco de página de un conjunto de marcos preasignados.


La implementación

En primer lugar, vamos a necesitar algo en el guión enlazador decirnos dónde Al final de nuestro núcleo es.

 ENTRADA (cargador) SECCIONES {. = 0x00100000; .text:. {text_start =; (. Rodata): * (. texto)} .rodata ALIGN (0x1000) {*} .data ALIGN (0x1000): {* (. datos) end_data =;} .bss:.. {sbss =; * (COMUN) * (bss.) EBSS =.; endkernel =.; }} 

El endkernel variable se declara en el núcleo como:

 endkernel u32int extern; 

La variable en sí no tiene valor, es la dirección de la variable que estamos utilizando.

endkernel se utilizará para calcular la dirección de la primera marco de página después de la kernel. El código para buscar a través de la matriz es también muy simple:

 kalloc_frame_int pageframe_t estática () {u32int i = 0; while (frame_map [i] = GRATIS!) {i ++; si (i == NPAGES) {return (ERROR); }} Frame_map [i] = USADA; retorno (startFrame + (i * 0x1000)); //devuelve la dirección del marco de página basado en la ubicación declaró //libre en el array} 

La última función utilizada llamadas kalloc_frame_int cada 20 páginas asignaciones marco:

 pageframe_t kalloc_frame () {u8int estática asigne = 1; si //vamos a asignar un nuevo conjunto de premarcos estática u8int PFRAME = 0; ret pageframe_t; si (== PFRAME 20) {asignar = 1; } If (asignar == 1) {for (int i = 0; i {pre_frames [i] = kalloc_frame_int (

Page   <<       [1] [2] >>

Copyright © 2008 - 2016 Lectura Educación Artículos,https://lectura.nmjjxx.com All rights reserved.