Modestus Moon OS  R4
CS 450 project
paging.c File Reference
#include <system.h>
#include <string.h>
#include "mem/heap.h"
#include "mem/paging.h"
Include dependency graph for paging.c:

Go to the source code of this file.

Functions

void set_bit (u32int addr)
 
void clear_bit (u32int addr)
 
u32int get_bit (u32int addr)
 
u32int find_free ()
 
page_entryget_page (u32int addr, page_dir *dir, int make_table)
 
void init_paging ()
 
void load_page_dir (page_dir *new_dir)
 
void new_frame (page_entry *page)
 

Variables

u32int mem_size = 0x4000000
 
u32int page_size = 0x1000
 
u32int nframes
 
u32intframes
 
page_dirkdir = 0
 
page_dircdir = 0
 
u32int phys_alloc_addr
 
heapkheap
 

Function Documentation

void clear_bit ( u32int  addr)

Definition at line 44 of file paging.c.

References frames, and page_size.

45 {
46  u32int frame = addr/page_size;
47  u32int index = frame/32;
48  u32int offset = frame%32;
49  frames[index] &= ~(1 << offset);
50 }
u32int page_size
Definition: paging.c:16
u32int * frames
Definition: paging.c:19
unsigned long u32int
Definition: system.h:27
u32int find_free ( )

Definition at line 68 of file paging.c.

References frames, and nframes.

Referenced by new_frame().

69 {
70  u32int i,j;
71  for (i=0; i<nframes/32; i++)
72  if (frames[i] != 0xFFFFFFFF) //if frame not full
73  for (j=0; j<32; j++) //find first free bit
74  if (!(frames[i] & (1 << j)))
75  return i*32+j;
76 
77  return -1; //no free frames
78 }
u32int * frames
Definition: paging.c:19
u32int nframes
Definition: paging.c:18
unsigned long u32int
Definition: system.h:27
u32int get_bit ( u32int  addr)

Definition at line 56 of file paging.c.

References frames, and page_size.

57 {
58  u32int frame = addr/page_size;
59  u32int index = frame/32;
60  u32int offset = frame%32;
61  return (frames[index] & (1 << offset));
62 }
u32int page_size
Definition: paging.c:16
u32int * frames
Definition: paging.c:19
unsigned long u32int
Definition: system.h:27
page_entry* get_page ( u32int  addr,
page_dir dir,
int  make_table 
)

Definition at line 85 of file paging.c.

References _kmalloc(), page_size, page_table::pages, page_dir::tables, and page_dir::tables_phys.

Referenced by _kmalloc(), and init_paging().

86 {
87  u32int phys_addr;
88  u32int index = addr / page_size / 1024;
89  u32int offset = addr / page_size % 1024;
90 
91  //return it if it exists
92  if (dir->tables[index])
93  return &dir->tables[index]->pages[offset];
94 
95  //create it
96  else if (make_table){
97  dir->tables[index] = (page_table*)_kmalloc(sizeof(page_table), 1, &phys_addr);
98  dir->tables_phys[index] = phys_addr | 0x7; //enable present, writable
99  return &dir->tables[index]->pages[offset];
100  }
101  else return 0;
102 }
u32int _kmalloc(u32int size, int align, u32int *phys_addr)
Definition: heap.c:24
u32int page_size
Definition: paging.c:16
u32int tables_phys[1024]
Definition: paging.h:36
page_table * tables[1024]
Definition: paging.h:35
unsigned long u32int
Definition: system.h:27
page_entry pages[1024]
Definition: paging.h:27
void init_paging ( )

Definition at line 111 of file paging.c.

References _kmalloc(), frames, get_page(), KHEAP_BASE, KHEAP_MIN, KHEAP_SIZE, kmalloc(), load_page_dir(), make_heap(), mem_size, memset(), new_frame(), nframes, PAGE_SIZE, page_size, and phys_alloc_addr.

Referenced by kmain().

112 {
113  //create frame bitmap
115  frames = (u32int*)kmalloc(nframes/32);
116  memset(frames, 0, nframes/32);
117 
118  //create kernel directory
119  kdir = (page_dir*)_kmalloc(sizeof(page_dir), 1, 0); //page aligned
120  memset(kdir, 0, sizeof(page_dir));
121 
122  //get pages for kernel heap
123  u32int i = 0x0;
124  for(i=KHEAP_BASE; i<(KHEAP_BASE+KHEAP_MIN); i+=1){
125  get_page(i,kdir,1);
126  }
127 
128  //perform identity mapping of used memory
129  //note: placement_addr gets incremented in get_page,
130  //so we're mapping the first frames as well
131  i = 0x0;
132  while (i < (phys_alloc_addr+0x10000)){
133  new_frame(get_page(i,kdir,1));
134  i += page_size;
135  }
136 
137  //allocate heap frames now that the placement addr has increased.
138  //placement addr increases here for heap
139  for(i=KHEAP_BASE; i<(KHEAP_BASE+KHEAP_MIN);i+=PAGE_SIZE){
140  new_frame(get_page(i,kdir,1));
141  }
142 
143  //load the kernel page directory; enable paging
145 
146  //setup the kernel heap
148 }
#define KHEAP_SIZE
Definition: heap.h:8
u32int kmalloc(u32int size)
Definition: heap.c:52
void load_page_dir(page_dir *new_dir)
Definition: paging.c:158
u32int mem_size
Definition: paging.c:15
u32int phys_alloc_addr
Definition: heap.c:22
u32int _kmalloc(u32int size, int align, u32int *phys_addr)
Definition: heap.c:24
#define KHEAP_MIN
Definition: heap.h:7
u32int page_size
Definition: paging.c:16
u32int * frames
Definition: paging.c:19
page_entry * get_page(u32int addr, page_dir *dir, int make_table)
Definition: paging.c:85
heap * kheap
Definition: heap.c:14
#define PAGE_SIZE
Definition: paging.h:6
page_dir * kdir
Definition: paging.c:21
u32int nframes
Definition: paging.c:18
heap * make_heap(u32int base, u32int max, u32int min)
Definition: heap.c:71
unsigned long u32int
Definition: system.h:27
#define KHEAP_BASE
Definition: heap.h:6
void * memset(void *s, int c, size_t n)
memset Set a region of memory.
Definition: string.c:139
void new_frame(page_entry *page)
Definition: paging.c:173
void load_page_dir ( page_dir new_dir)

Definition at line 158 of file paging.c.

References page_dir::tables_phys.

Referenced by init_paging().

159 {
160  cdir = new_dir;
161  asm volatile ("mov %0,%%cr3":: "b"(&cdir->tables_phys[0]));
162  u32int cr0;
163  asm volatile ("mov %%cr0,%0": "=b"(cr0));
164  cr0 |= 0x80000000;
165  asm volatile ("mov %0,%%cr0":: "b"(cr0));
166 }
page_dir * cdir
Definition: paging.c:22
u32int tables_phys[1024]
Definition: paging.h:36
unsigned long u32int
Definition: system.h:27
void new_frame ( page_entry page)

Definition at line 173 of file paging.c.

References find_free(), page_entry::frameaddr, kpanic(), page_size, page_entry::present, set_bit(), page_entry::usermode, and page_entry::writeable.

Referenced by init_paging().

174 {
175  u32int index;
176  if (page->frameaddr != 0) return;
177  if ( (u32int)(-1) == (index=find_free()) ) kpanic("Out of memory");
178 
179  //mark a frame as in-use
180  set_bit(index*page_size);
181  page->present = 1;
182  page->frameaddr = index;
183  page->writeable = 1;
184  page->usermode = 0;
185 }
u32int frameaddr
Definition: paging.h:19
void kpanic(const char *msg)
Definition: system.c:24
u32int present
Definition: paging.h:13
u32int usermode
Definition: paging.h:15
u32int page_size
Definition: paging.c:16
u32int writeable
Definition: paging.h:14
void set_bit(u32int addr)
Definition: paging.c:32
unsigned long u32int
Definition: system.h:27
u32int find_free()
Definition: paging.c:68
void set_bit ( u32int  addr)

Definition at line 32 of file paging.c.

References frames, and page_size.

Referenced by new_frame().

33 {
34  u32int frame = addr/page_size;
35  u32int index = frame/32;
36  u32int offset = frame%32;
37  frames[index] |= (1 << offset);
38 }
u32int page_size
Definition: paging.c:16
u32int * frames
Definition: paging.c:19
unsigned long u32int
Definition: system.h:27

Variable Documentation

page_dir* cdir = 0

Definition at line 22 of file paging.c.

u32int* frames

Definition at line 19 of file paging.c.

Referenced by clear_bit(), find_free(), get_bit(), init_paging(), and set_bit().

page_dir* kdir = 0

Definition at line 21 of file paging.c.

heap* kheap

Definition at line 14 of file heap.c.

u32int mem_size = 0x4000000

Definition at line 15 of file paging.c.

Referenced by init_paging().

u32int nframes

Definition at line 18 of file paging.c.

Referenced by find_free(), and init_paging().

u32int page_size = 0x1000

Definition at line 16 of file paging.c.

Referenced by clear_bit(), get_bit(), get_page(), init_paging(), new_frame(), and set_bit().

u32int phys_alloc_addr

Definition at line 22 of file heap.c.

Referenced by _kmalloc(), and init_paging().