*   >> Læs Uddannelse artikler >> science >> programming

Skrivning A Page Frame Allocator

Introduktion

Denne tutorial vil forsøge at vise dig, hvordan man skriver en simpel side ramme fordelingsnøgle for x86 CPU. Det anvendte sprog C og vi bruger standard personsøgning med 4 KiB sider. Den side ramme Måleren vil afsætte rammer med den første ramme starter lige efter afslutningen af ​​kernen.

Metoden

Hver ramme forvaltes med en byte kort (for enkelthedens skyld) : en værdi på 0x01 for brugte sider, og en værdi på 0x00 for ubrugte sider.

At afsætte en side, alt hvad der er brug for, er at søge gennem array til en gratis side, og derefter markere den som brugt. Du har måske bemærket, at dette ville være meget ineffektivt, at skulle søge gennem et mulige antal 1048319 sider. For at fremskynde processen med tildeling af måleren vil afsætte 20 Page frames ad gangen, så det meste af tiden alle, der vil have været gjort før hånd. Alocatting en ny side er simpelthen et spørgsmål om at få en side ramme fra en bred vifte af preallocated rammer.


Gennemførelsen

Først og fremmest har vi brug for noget i linker script til at fortælle os, hvor i slutningen af ​​vores kerne er.

 ENTRY (loader) SEKTIONER {. = 0x00100000; .text:. {text_start =; (. rodata): * (. tekst)} .rodata ALIGN (0x1000) {*} .Data ALIGN (0x1000): {* (. data) end_data =;} .bss:.. {SBS, =; * (FÆLLES) * (BSS). EBSS =.; endkernel =.; }} 

Den variable endkernel vil blive erklæret i kernen som:

 extern u32int endkernel 

Variablen selv har ingen værdi, det er adressen på den variabel, som vi bruger.

endkernel vil blive brugt til at beregne adressen på den første side ramme efter kernen. Koden til at søge gennem array er også meget enkel:

 statisk pageframe_t kalloc_frame_int () {u32int i = 0; mens (frame_map [i] = GRATIS!) {i ++; hvis (i == NPAGES) {afkast (ERROR); }} Frame_map [i] = BRUGT; afkast (startframe + (i * 0x1000)), //returnerer adressen på den side ramme baseret på placeringen erklæret fri //i array} 

Den sidste funktion, der bruges opkald kalloc_frame_int hver 20 sider frame tildelinger:

 pageframe_t kalloc_frame () {statisk u8int tildele = 1; //om vi kommer til at afsætte et nyt sæt preframes statiske u8int pframe = 0; pageframe_t RET; if (pframe == 20) {tildele = 1; } If (allokere == 1) {for (int i = 0; i {pre_frames [i] = kalloc_frame_int ();} pframe = 0; tildele = 0;} r = pre_frames [pframe] pframe ++, afkast (RET) ;} 

Frigørelse siden rammen er simpelthen et spørgsmål om at vend

Page   <<       [1] [2] >>

Copyright © 2008 - 2016 Læs Uddannelse artikler,https://uddannelse.nmjjxx.com All rights reserved.