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.
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.
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 endkernelVariablen 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
Oprettelse af en Flash-platform spil med flixel og Flex - Kom Started
- Flere Regulære udtryk i Perl
- Kaste Flere operander Med C ++ Exceptions
- Oprettelse og sletning Directory i Php
- Undtagelse Håndtering i Java og bruge den i Programming
- Css liste
- Hvad er en Programmable Logic Controller (PLC)? Hvad er en Programmable Logic Co…
- JSON File
- Grundlæggende om Undtagelser i C ++
- Oprettelse Window Basics
- Programmør Ved Heart