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.
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.
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
Opprette en Flash plattformspill med Flixel og Flex - Komme Started
- Mysql Backup Basics
- Primtall søker program
- Kommandoer Associated med filer og mapper: Batch File Programming
- Påstander og feilnumre i C ++
- ASP.NET - C # - Helper Mailer klasse for mal- basert e-post med innebygde bilder…
- Console Application for å kalle hendelsen med System.Timers i C # 1.1 og 2.0 (D…
- Å gjøre en 3D-spill med Ogre - Legge en Scene
- Mysql Account Management Uttalelser
- Awesome Keyboard Flashing Trick
- Konstruktører og destructors i Php Classes