*   >> Lese Utdanning Artikler >> science >> programming

Skrive en sideramme Allocator

Innledning

Denne opplæringen vil forsøke å vise deg hvordan du skal skrive en enkel side ramme fordelings for x86 CPU. Språket som brukes er C, og vi bruker standard paging med 4 KiB sider. Siderammen måleren vil fordele rammer med den første rammen starter rett etter slutten av kjernen.

The Method

Hver ramme skal forvaltes med en byte kartet (for enkelhets skyld) : en verdi på 0x01 for brukte sider og en verdi på 0x00 for ubrukte sider. Å tildele en side, er alt som trengs for å søke gjennom rekke for en gratis side, og deretter merke den som brukes.

Du har kanskje lagt merke til at dette ville være svært ineffektiv, å måtte søke gjennom et mulig antall 1048319 sider. For å få fortgang i tildelingsprosessen måleren vil bevilge 20 siderammer om gangen, så mesteparten av tiden alt som har blitt gjort før hånd. Alocatting en ny side er rett og slett et spørsmål om å få en side ramme av en rekke preallokert rammer.

Gjennomføring

Først av alt, trenger vi noe i linker skript for å fortelle oss hvor slutten av vår kjerne er.

 ENTRY (loader) §§ {. = 0x00100000; .text:. {text_start =; (. rodata): * (. tekst)} .

rodata ALIGN (0x1000) {*} .data ALIGN (0x1000): {* (. data) end_data =;} .bss.:. {sbss =; * (Vanlig) * (BSS). EBSS =.; endkernel =.; }}

Den variable endkernel vil bli erklært i kjernen som:

 extern u32int endkernel; 

Den variable i seg selv har ingen verdi, det er adressen til den variabelen som vi bruker. endkernel vil bli brukt til å beregne adressen til den første siderammen etter at kjernen.

Koden for å søke gjennom matrisen er også veldig enkel:

 statisk pageframe_t kalloc_frame_int () {u32int i = 0; while (frame_map [i] = GRATIS!) {i ++; if (i == NPAGES) {return (ERROR); }} Frame_map [i] = BRUKT; avkastning (startframe + (i * 0x1000)); //returnerer adressen til siden rammen basert på plasseringen erklært fri //i rekken} 

Den siste funksjonen som brukes samtaler kalloc_frame_int hver 20 siden rammebevilgninger:

 pageframe_t kalloc_frame () {statisk u8int bevilge = 1; //hvorvidt vi skal tildele et nytt sett med preframes statisk u8int pframe = 0; pageframe_t ret; if (pframe == 20) {bevilge = 1; } If (bevilge == 1) {for (int i = 0; I {pre_frames [i] = kalloc_frame_int ();} pframe = 0; bevilge = 0;} ret = pre_frames [pframe]; pframe ++; avkastning (ret) ;} 

Frigjøre siderammen er bare et spørsmål om å reversere prosessen som brukes for å få siderammen

Page   <<       [1] [2] >>

Copyright © 2008 - 2016 Lese Utdanning Artikler,https://utdanning.nmjjxx.com All rights reserved.