Tämä opas pyrkii näyttämään, miten kirjoittaa yksinkertaisen sivun runko allokoija x86 CPU. Käytetty kieli on C, ja käytämme standardia sivunvaihtoon 4 KiB sivua. Sivu runko sijoittimen jakaa kehykset ensimmäisen kehyksen alkavat aivan päätyttyä ytimen.
Jokainen kehys on hoidettava kanssa tavu kartta (varten yksinkertaisuuden vuoksi) : arvo 0x01 käytettyjen sivujen ja arvo 0x00 käyttämättömien sivuja. Jakaa sivun, kaikki mitä tarvitaan on etsiä matriisia tyhjälle sivulle ja merkitse sitä käytetään.
Olet ehkä huomannut, että tämä olisi erittäin tehotonta, jolla etsiä mahdollisimman monta 1048319 sivuja. Voit nopeuttaa jakoprosessin allokoija jakaa 20 sivun kehykset kerrallaan, joten suurimman osan ajasta kaikki, jotka on tehty ennen käsin. Alocatting uusi sivu on yksinkertaisesti asia saada sivun kehys pois joukko ennalta myöntäminä kehyksiä.
Ensinnäkin, me tarvitsemme jotain linkitysskriptiä kertoa meille, missä lopussa meidän ydin on.
ENTRY (kauhakuormaaja) SECTIONS {. = 0x00100000; .text: {text_start =.; * (. Teksti)} .rodata ALIGN (0x1000): {* (. Rodata)} .data ALIGN (0x1000): {* (. Data) end_data =.;} .bss: {Sbss =.; * (Yleinen) * (. BSS) EBSS =.; endkernel =.; }}
muuttuja endkernel julistetaan ytimen kuten:
ulkoinen u32int endkernel;muuttuva itsessään ei ole arvoa, se on osoite muuttujan että käytämme. endkernel käytetään laskea osoitteen ensimmäisen sivun kehyksen jälkeen ytimen.
Koodi hakuja matriisi on myös hyvin yksinkertainen:
staattinen pageframe_t kalloc_frame_int () {u32int i = 0; kun taas (frame_map [i]! = ILMAISEKSI) {i ++; jos (i == npages) {paluu (virhe); }} Frame_map [i] = käyttää; tuotto (startframe + (i * 0x1000)); //palauttaa sivun osoite runko perustuu sijainnin julistettu vapaaksi //array}viimeinen toiminto käytetty vaatii kalloc_frame_int joka 20 sivun runko määrärahat:
pageframe_t kalloc_frame () {staattinen u8int jakaa = 1; //onko aiomme jakaa uusia preframes staattisen u8int pframe = 0; pageframe_t ret; jos (pframe == 20) {jakaa = 1; } Jos (jakaa == 1) {for (int i = 0; i {pre_frames [i] = kalloc_frame_int ();} pframe = 0; myöntää = 0;} ret = pre_frames [pframe] pframe ++, paluu (evp) ;}vapauttaminen sivu runko on yksinkertaisesti kysymys kääntää prosessin tottuneet saamaan sivukehykseen.
mitätön kfree_frame (pageframe_t) {= - startframe; //saada siirtymän Ensimmäinen kehy