*   >> Lezen Onderwijs artikelen >> science >> programming

Schrijven A Page Frame Allocator

Introductie

Deze tutorial zal proberen te laten zien hoe je een eenvoudige pagina kader allocator voor de x86 CPU schrijven. De gebruikte taal C en we zijn met behulp van standaard paging met 4 KiB pagina's. De paginaframe allocator wordt frames toewijzen van het eerste frame begint direct na afloop van de kernel.

De methode

Elk frame wordt beheerd door een byte kaart (omwille van de eenvoud) : een waarde van 0x01 voor gebruikte pagina's en een waarde van 0x00 voor ongebruikte pagina's.

Om een ​​pagina toe te wijzen, alles wat nodig is, is om door middel van de reeks voor een gratis pagina en vervolgens markeren als gebruikt. Je hebt misschien gemerkt dat dit zeer inefficiënt zou zijn, hebben te zoeken door middel van een aantal mogelijke 1048319 pagina's. Om het tempo van de toewijzing van de allocator zal 20 pagina frames toe te wijzen in een tijd, dus de meeste van de tijd dat alles zal zijn gedaan voor de hand. Alocatting een nieuwe pagina is gewoon een kwestie van een pagina kader uit een reeks van vooraf toegewezen frames.


De Implementatie

In de eerste plaats zullen we iets in de linker-script nodig hebben om ons te vertellen waar het einde van onze kernel.

 ENTRY (loader) SECTIONS {. = 0x00100000; .text:. {text_start =; (. rodata): * (. tekst)} .rodata ALIGN (0x1000) {*} .data ALIGN (0x1000): {* (. data) end_data =;} .bss:.. {sbss =; * (Vaak) * (BSS). EBSS =.; endkernel =.; }} 

De variabele endkernel zal worden verklaard in de kernel als:

 extern u32int endkernel; 

De variabele zelf heeft geen waarde, is het adres van de variabele die we gebruiken.

endkernel wordt gebruikt om het adres van de eerste paginaframe berekenen na de kernel. De code voor het zoeken door middel van de reeks is ook zeer eenvoudig:

 statische pageframe_t kalloc_frame_int () {u32int i = 0; while (frame_map [i] = GRATIS!) {i ++; if (i == npages) {return (ERROR); }} Frame_map [i] = GEBRUIKT; return (startframe + (i * 0x1000)); //terug het adres van de pagina kader gebaseerd op de locatie vrij verklaard //in de array} 

De laatste functie gebruikt oproepen kalloc_frame_int elke 20 pagina kader toewijzingen:

 pageframe_t kalloc_frame () {statische u8int toewijzen = 1; //of we gaan naar een nieuwe reeks van preframes wijzen statische u8int PKADER = 0; pageframe_t ret; if (PKADER == 20) {toewijzen = 1; } If (toewijzen == 1) {voor (int i = 0; i {pre_frames [i] = kalloc_frame_int ();} PKADER = 0; to

Page   <<       [1] [2] >>

Copyright © 2008 - 2016 Lezen Onderwijs artikelen,https://onderwijs.nmjjxx.com All rights reserved.