*   >> läser Utbildning artiklar >> science >> programming

Skriva A Page Frame Allocator

Introduktion Omdömen

Den här guiden kommer att försöka visa dig hur man skriver en enkel sida ram allokerare för x86 CPU. Språket är C och vi använder standardökning med 4 KiB-sidor. Sidramen allokeraren kommer att fördela ramar med den första ramen börjar direkt efter utgången av kärnan. Omdömen

Metoden Omdömen

Varje ram skall förvaltas med en byte karta (för enkelhetens skull) : ett värde på 0x01 för begagnade sidor och ett värde på 0x00 för oanvända sidor.

För att tilldela en sida, är allt som behövs för att söka igenom arrayen för en gratis sida och sedan markera den som används. Du kanske har märkt att det skulle vara mycket ineffektivt, att behöva söka igenom ett antal möjliga 1048319 sidor. För att påskynda fördelningsprocessen allokeraren kommer att fördela 20 sidramar åt gången, så det mesta allt som kommer att ha gjorts innan handen. Alocatting en ny sida är helt enkelt en fråga om att få en sida ram av en rad öronmärkta ramar.

Omdömen

Genomförandeomdömen

Först och främst kommer vi att behöva något i länk skript för att berätta för oss om I slutet av vår kärna är. Omdömen

 ENTRY (loader) DELAR {. = 0x00100000; .text:. {text_start =; (. rodata): * (. text)} .rodata ALIGN (0x1000) {*} .data ALIGN (0x1000): {* (. data) end_data =;} .bss:.. {SBSs =; * (GEMENSAMMA) * (BSS). EBSS =. endkernel =. }} 

Den rörliga endkernel kommer att deklareras i kärnan som

 extern u32int endkernel; 

Den rörliga själv har inget värde, är det adressen till variabel som vi använder.

endkernel kommer att användas för att beräkna adressen för den första sidan ramen efter kärnan. Koden för att söka igenom matrisen är också mycket enkel:

 statisk pageframe_t kalloc_frame_int () {u32int i = 0; while (frame_map [i] = gratis!) {i ++; if (i == NPAGES) {return (ERROR); }} Frame_map [i] = ANVÄNDS; avkastning (startframe + (i * 0x1000)); //returnera adressen till sidan ramen baserat på platsen som förklarats fria //i arrayen} 

Den sista funktionen används samtal kalloc_frame_int var 20 sidram Stöd:

 pageframe_t kalloc_frame () {statisk u8int fördela = 1, oavsett om //eller inte kommer vi att tilldela en ny uppsättning preframes statisk u8int pframe = 0; pageframe_t ret; if (pframe == 20) {fördela = 1; } If (fördela == 1) {for (int i = 0; i {pre_frames [i] = kalloc_frame_int ();} pframe = 0; fördela = 0;} ret = pre_frames [pframe], pframe ++, avkastning (ret) ;} 

Frigöra sidramen är bara en fråga om att vända

Page   <<       [1] [2] >>

Copyright © 2008 - 2016 läser Utbildning artiklar,https://utbildning.nmjjxx.com All rights reserved.