From 919c6c3e417ac6a602891c66bc75eacec39c81e2 Mon Sep 17 00:00:00 2001 From: Shadow8t4 Date: Wed, 28 Jun 2017 00:42:21 -0500 Subject: [PATCH] Adding final turn in. --- MP3/mp3.zip | Bin 0 -> 56065 bytes MP3/mp3/cont_frame_pool.C | 404 ++++++++++++++++++++++++++++++++++++++ MP3/mp3/cont_frame_pool.H | 132 +++++++++++++ MP3/mp3/design.pdf | Bin 0 -> 48068 bytes MP3/mp3/page_table.C | 145 ++++++++++++++ MP3/mp3/page_table.H | 91 +++++++++ 6 files changed, 772 insertions(+) create mode 100644 MP3/mp3.zip create mode 100644 MP3/mp3/cont_frame_pool.C create mode 100755 MP3/mp3/cont_frame_pool.H create mode 100644 MP3/mp3/design.pdf create mode 100644 MP3/mp3/page_table.C create mode 100755 MP3/mp3/page_table.H diff --git a/MP3/mp3.zip b/MP3/mp3.zip new file mode 100644 index 0000000000000000000000000000000000000000..b5f32fc9d0d81772ef1b6851030ab4aa5d68cee6 GIT binary patch literal 56065 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 literal 0 HcmV?d00001 diff --git a/MP3/mp3/cont_frame_pool.C b/MP3/mp3/cont_frame_pool.C new file mode 100644 index 0000000..3c1af89 --- /dev/null +++ b/MP3/mp3/cont_frame_pool.C @@ -0,0 +1,404 @@ +/* + File: ContFramePool.C + + Author: + Date : + + */ + +/*--------------------------------------------------------------------------*/ +/* + POSSIBLE IMPLEMENTATION + ----------------------- + + The class SimpleFramePool in file "simple_frame_pool.H/C" describes an + incomplete vanilla implementation of a frame pool that allocates + *single* frames at a time. Because it does allocate one frame at a time, + it does not guarantee that a sequence of frames is allocated contiguously. + This can cause problems. + + The class ContFramePool has the ability to allocate either single frames, + or sequences of contiguous frames. This affects how we manage the + free frames. In SimpleFramePool it is sufficient to maintain the free + frames. + In ContFramePool we need to maintain free *sequences* of frames. + + This can be done in many ways, ranging from extensions to bitmaps to + free-lists of frames etc. + + IMPLEMENTATION: + + One simple way to manage sequences of free frames is to add a minor + extension to the bitmap idea of SimpleFramePool: Instead of maintaining + whether a frame is FREE or ALLOCATED, which requires one bit per frame, + we maintain whether the frame is FREE, or ALLOCATED, or HEAD-OF-SEQUENCE. + The meaning of FREE is the same as in SimpleFramePool. + If a frame is marked as HEAD-OF-SEQUENCE, this means that it is allocated + and that it is the first such frame in a sequence of frames. Allocated + frames that are not first in a sequence are marked as ALLOCATED. + + NOTE: If we use this scheme to allocate only single frames, then all + frames are marked as either FREE or HEAD-OF-SEQUENCE. + + NOTE: In SimpleFramePool we needed only one bit to store the state of + each frame. Now we need two bits. In a first implementation you can choose + to use one char per frame. This will allow you to check for a given status + without having to do bit manipulations. Once you get this to work, + revisit the implementation and change it to using two bits. You will get + an efficiency penalty if you use one char (i.e., 8 bits) per frame when + two bits do the trick. + + DETAILED IMPLEMENTATION: + + How can we use the HEAD-OF-SEQUENCE state to implement a contiguous + allocator? Let's look a the individual functions: + + Constructor: Initialize all frames to FREE, except for any frames that you + need for the management of the frame pool, if any. + + get_frames(_n_frames): Traverse the "bitmap" of states and look for a + sequence of at least _n_frames entries that are FREE. If you find one, + mark the first one as HEAD-OF-SEQUENCE and the remaining _n_frames-1 as + ALLOCATED. + + release_frames(_first_frame_no): Check whether the first frame is marked as + HEAD-OF-SEQUENCE. If not, something went wrong. If it is, mark it as FREE. + Traverse the subsequent frames until you reach one that is FREE or + HEAD-OF-SEQUENCE. Until then, mark the frames that you traverse as FREE. + + mark_inaccessible(_base_frame_no, _n_frames): This is no different than + get_frames, without having to search for the free sequence. You tell the + allocator exactly which frame to mark as HEAD-OF-SEQUENCE and how many + frames after that to mark as ALLOCATED. + + needed_info_frames(_n_frames): This depends on how many bits you need + to store the state of each frame. If you use a char to represent the state + of a frame, then you need one info frame for each FRAME_SIZE frames. + + A WORD ABOUT RELEASE_FRAMES(): + + When we releae a frame, we only know its frame number. At the time + of a frame's release, we don't know necessarily which pool it came + from. Therefore, the function "release_frame" is static, i.e., + not associated with a particular frame pool. + + This problem is related to the lack of a so-called "placement delete" in + C++. For a discussion of this see Stroustrup's FAQ: + http://www.stroustrup.com/bs_faq2.html#placement-delete + + */ +/*--------------------------------------------------------------------------*/ + + +/*--------------------------------------------------------------------------*/ +/* DEFINES */ +/*--------------------------------------------------------------------------*/ + +/* -- (none) -- */ + +/*--------------------------------------------------------------------------*/ +/* INCLUDES */ +/*--------------------------------------------------------------------------*/ + +#include "cont_frame_pool.H" +#include "console.H" +#include "utils.H" +#include "assert.H" + +/*--------------------------------------------------------------------------*/ +/* DATA STRUCTURES */ +/*--------------------------------------------------------------------------*/ + +/* -- (none) -- */ + +/*--------------------------------------------------------------------------*/ +/* CONSTANTS */ +/*--------------------------------------------------------------------------*/ + +/* -- (none) -- */ + +/*--------------------------------------------------------------------------*/ +/* FORWARDS */ +/*--------------------------------------------------------------------------*/ + +/* -- (none) -- */ + +/*--------------------------------------------------------------------------*/ +/* METHODS FOR CLASS C o n t F r a m e P o o l */ +/*--------------------------------------------------------------------------*/ + +ContFramePool* ContFramePool::pools = (ContFramePool *) FRAME_SIZE; // List of frame pools, managed by the class +unsigned int ContFramePool::nPools = 0; // Number of pools being managed + +ContFramePool::ContFramePool(unsigned long _base_frame_no, + unsigned long _n_frames, + unsigned long _info_frame_no, + unsigned long _n_info_frames) +{ + // Bitmap must fit in a single frame! + // NOTE: In theory, we don't need to make the bitmap any larger, + // since as stated in the instructions it is already big enough to + // hold for 128MB of memory with one bit per frame, so should still + // be enough for 64MB of memory with 2 bits per frame. + // Assertion changed to match max size of frames allowed. + assert(_n_frames <= FRAME_SIZE * 4); + + base_frame_no = _base_frame_no; + nframes = _n_frames; + nFreeFrames = _n_frames; + info_frame_no = _info_frame_no; + n_info_frames = _n_info_frames; + + // If _info_frame_no is zero then we keep management info in the first + // frame(s), else we use the provided frame(s) to keep management info + // NOTE: bitmap needs to be allocated with n_info_frames if specified. + if(info_frame_no == 0) + { + bitmap = (unsigned char *) (base_frame_no * FRAME_SIZE); + } + else + { + bitmap = (unsigned char *) (info_frame_no * FRAME_SIZE * n_info_frames); + } + + // Number of frames must "fill" the bitmap! + assert ((nframes % 8 ) == 0); + + + // Everything ok. Proceed to mark all bits in the bitmap + // NOTE: changed to reflect that I need 2 bits per frame now + for(int i=0; i*4 < _n_frames; i++) + { + bitmap[i] = 0xFF; + } + + // Mark the first frame as being used if it is being used + // NOTE: need to mark multiple frames if needed. + if(info_frame_no == 0) + { + bitmap[0] = 0x3F; + nFreeFrames--; + } + else + { + unsigned int i = info_frame_no / 4; + unsigned int r = info_frame_no % 4; + unsigned char mask = 0x80; + mask = mask >> r*2; + + unsigned int c = 0; + while(c < n_info_frames) + { + bitmap[i] = bitmap[i] ^ mask; + bitmap[i] = bitmap[i] ^ (mask >> 1); + if(mask == 0x02) + { + i++; + mask = 0x80; + } + c++; + nFreeFrames--; + } + + } + + pools[nPools] = *this; + nPools += 1; + + Console::puts("Frame Pool initialized\n"); +} + +unsigned long ContFramePool::get_frames(unsigned int _n_frames) +{ + // Are there enough frames left to allocate? + assert(nFreeFrames > _n_frames); + + // Find a frame that is not being used and return its frame index. + // Mark that frame as being used in the bitmap. + // NOTE: Must be updated to find a sequence of contiguous frames + // that are not being used and return the index of the head. + unsigned int frame_no = base_frame_no; + + // i is being used as the frame_no / 4 + // j is frame_no % 4 + // together, they will give the actual frame_no. + // c is used as a counter to count a squence of free frames. + unsigned int i = 0; + unsigned int j = 0; + unsigned int c = 0; + + while (true) + { + unsigned char mask = 0x80 >> (j*2); + // check every 2 bits for a free frame in the bitmap + while((mask & bitmap[i]) == 0 || ((mask >> 1) & bitmap[i]) == 0) + { + if(mask != 0x02) + { + j++; + mask = mask >> 2; + } + else + { + i++; + j = 0; + mask = 0x80; + } + } + // if frame is found, start checking for sequence + unsigned int temp = i; + c++; + while(c < _n_frames) + { + if(mask != 0x02) + { + mask = mask >> 2; + } + else + { + temp++; + mask = 0x80; + } + if((mask & bitmap[temp]) != 0 && ((mask >> 1) & bitmap[temp]) != 0) + { + c++; + } + else + { + c = 0; + break; + } + } + if(c == _n_frames) + { + nFreeFrames -= _n_frames; + break; + } + } + + frame_no += i*4 + j; + + // Update bitmap + // First: clear most significant bit to mark head of sequence. + bitmap[i] = bitmap[i] ^ (0x80 >> (j*2)); + // Second: clear both bits for all remaining frames in the sequence. + c = 1; + unsigned char mask = 0x80 >> j*2; + unsigned int temp = i; + while(c < _n_frames) + { + if(mask != 0x02) + { + mask = mask >> 2; + } + else + { + temp++; + mask = 0x80; + } + + bitmap[temp] = bitmap[temp] ^ mask; + bitmap[temp] = bitmap[temp] ^ (mask >> 1); + c++; + } + + return (frame_no); +} + +void ContFramePool::mark_inaccessible(unsigned long _base_frame_no, + unsigned long _n_frames) +{ + // Mark all frames in the range as being used. + int i ; + for(i = _base_frame_no; i < _base_frame_no + _n_frames; i++){ + mark_inaccessible(i); + } + nFreeFrames -= _n_frames; +} + +void ContFramePool::mark_inaccessible(unsigned long _frame_no) +{ + // Let's first do a range check. + assert ((_frame_no >= base_frame_no) && (_frame_no < base_frame_no + nframes)); + + unsigned int bitmap_index = (_frame_no - base_frame_no) / 4; + unsigned char mask = 0x80 >> ((_frame_no - base_frame_no) % 4) * 2; + + // Is the frame being used already? + assert(((bitmap[bitmap_index] & mask) != 0) && (bitmap[bitmap_index] & (mask >> 1)) != 0); + + // Update bitmap + bitmap[bitmap_index] ^= mask; + bitmap[bitmap_index] ^= mask >> 1; + nFreeFrames--; +} + +void ContFramePool::release_frames(unsigned long _frame_no) +{ + unsigned int i = 0; + while(i < nPools) + { + if(_frame_no <= pools[i].base_frame_no || _frame_no > (pools[i].base_frame_no + pools[i].nframes)) + { + i++; + } + else + { + pools[i].release_frames_here(_frame_no); + return; + } + } +} + +void ContFramePool::release_frames_here(unsigned long _first_frame_no) +{ + unsigned char * bitmap = this->bitmap; + + unsigned int bitmap_index = (_first_frame_no - base_frame_no) / 4; + unsigned char mask = 0x80 >> ((_first_frame_no - base_frame_no) % 4) * 2; + + if(!((bitmap[bitmap_index] & mask) == 0 && (bitmap[bitmap_index] & (mask >> 1)) != 0)) + { + if((bitmap[bitmap_index] & mask) != 0 && (bitmap[bitmap_index] & (mask >> 1)) != 0) + { + Console::puts("Error, Frame being released is not being used\n"); + assert(false); + } + Console::puts("Error, Frame being released is not head of sequence\n"); + assert(false); + } + + bitmap[bitmap_index] ^= mask; + nFreeFrames++; + + if(mask != 0x02) + { + mask = mask >> 2; + } + else + { + mask = 0x80; + bitmap_index++; + } + + while(bitmap[bitmap_index] & mask == 0 && (bitmap[bitmap_index] & (mask >> 1)) == 0) + { + bitmap[bitmap_index] ^= mask; + bitmap[bitmap_index] ^= (mask >> 1); + if(mask != 0x02) + { + mask = mask >> 2; + } + else + { + mask = 0x80; + bitmap_index++; + } + nFreeFrames++; + } +} + +unsigned long ContFramePool::needed_info_frames(unsigned long _n_frames) +{ + return (_n_frames / (FRAME_SIZE * 4)) + (_n_frames % (FRAME_SIZE * 4) > 0 ? 1 : 0); +} diff --git a/MP3/mp3/cont_frame_pool.H b/MP3/mp3/cont_frame_pool.H new file mode 100755 index 0000000..13c7a07 --- /dev/null +++ b/MP3/mp3/cont_frame_pool.H @@ -0,0 +1,132 @@ +/* + File: cont_frame_pool.H + + Author: R. Bettati + Department of Computer Science + Texas A&M University + Date : 17/02/04 + + Description: Management of the CONTIGUOUS Free-Frame Pool. + + As opposed to a non-contiguous free-frame pool, here we can allocate + a sequence of CONTIGUOUS frames. + + */ + +#ifndef _CONT_FRAME_POOL_H_ // include file only once +#define _CONT_FRAME_POOL_H_ + +/*--------------------------------------------------------------------------*/ +/* DEFINES */ +/*--------------------------------------------------------------------------*/ + +/* -- (none) -- */ + +/*--------------------------------------------------------------------------*/ +/* INCLUDES */ +/*--------------------------------------------------------------------------*/ + +#include "machine.H" + +/*--------------------------------------------------------------------------*/ +/* DATA STRUCTURES */ +/*--------------------------------------------------------------------------*/ + +/* -- (none) -- */ + +/*--------------------------------------------------------------------------*/ +/* C o n t F r a m e P o o l */ +/*--------------------------------------------------------------------------*/ + +class ContFramePool { + +private: + /* -- DEFINE YOUR CONT FRAME POOL DATA STRUCTURE(s) HERE. */ + + unsigned char * bitmap; // Remember the bitmap here needs 2 bits per frame + unsigned int nFreeFrames; // + unsigned long base_frame_no; // Where does the frame pool start in phys mem? + unsigned long nframes; // Size of the frame pool + unsigned long info_frame_no; // Where do we store the management information? + unsigned long n_info_frames; // Number of frames needed to store management info + static ContFramePool* pools; // List of frame pools, managed by the class + static unsigned int nPools; // Number of pools being managed + + void mark_inaccessible(unsigned long _frame_no); // Should be a frame marked as + // a head, otherwise fails + void release_frames_here(unsigned long _frame_no); // non-static member function + +public: + + // The frame size is the same as the page size, duh... + static const unsigned int FRAME_SIZE = Machine::PAGE_SIZE; + + ContFramePool(unsigned long _base_frame_no, + unsigned long _n_frames, + unsigned long _info_frame_no, + unsigned long _n_info_frames); + /* + Initializes the data structures needed for the management of this + frame pool. + _base_frame_no: Number of first frame managed by this frame pool. + _n_frames: Size, in frames, of this frame pool. + EXAMPLE: If _base_frame_no is 16 and _n_frames is 4, this frame pool manages + physical frames numbered 16, 17, 18 and 19. + _info_frame_no: Number of the first frame that should be used to store the + management information for the frame pool. + NOTE: If _info_frame_no is 0, the frame pool is free to + choose any frames from the pool to store management information. + _n_info_frames: If _info_frame_no is 0, this argument specifies the + number of consecutive frames needed to store the management information + for the frame pool. + EXAMPLE: If _info_frame_no is 699 and _n_info_frames is 3, + then Frames 699, 700, and 701 are used to store the management information + for the frame pool. + NOTE: This function must be called before the paging system + is initialized. + */ + + unsigned long get_frames(unsigned int _n_frames); + /* + Allocates a number of contiguous frames from the frame pool. + _n_frames: Size of contiguous physical memory to allocate, + in number of frames. + If successful, returns the frame number of the first frame. + If fails, returns 0. + */ + + void mark_inaccessible(unsigned long _base_frame_no, + unsigned long _n_frames); + /* + Marks a contiguous area of physical memory, i.e., a contiguous + sequence of frames, as inaccessible. + _base_frame_no: Number of first frame to mark as inaccessible. + _n_frames: Number of contiguous frames to mark as inaccessible. + */ + + static void release_frames(unsigned long _frame_no); + /* + Releases a previously allocated contiguous sequence of frames + back to its frame pool. + The frame sequence is identified by the number of the first frame. + NOTE: This function is static because there may be more than one frame pool + defined in the system, and it is unclear which one this frame belongs to. + This function must first identify the correct frame pool and then call the frame + pool's release_frame function. + */ + + static unsigned long needed_info_frames(unsigned long _n_frames); + /* + Returns the number of frames needed to manage a frame pool of size _n_frames. + The number returned here depends on the implementation of the frame pool and + on the frame size. + EXAMPLE: For FRAME_SIZE = 4096 and a bitmap with a single bit per frame + (not appropriate for contiguous allocation) one would need one frame to manage a + frame pool with up to 8 * 4096 = 32k frames = 128MB of memory! + This function would therefore return the following value: + _n_frames / 32k + (_n_frames % 32k > 0 ? 1 : 0) (always round up!) + Other implementations need a different number of info frames. + The exact number is computed in this function.. + */ +}; +#endif diff --git a/MP3/mp3/design.pdf b/MP3/mp3/design.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a0ea6088da947a3aef139870542b0fdcc60f1b08 GIT binary patch literal 48068 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 << 12); // Getting frame address to assign to page directory. + + unsigned long * page_table = (unsigned long *) ((kernel_mem_pool->get_frames(1)) << 12); // Get another frame for the page table. + + unsigned long tempaddr = 0; // Temporary address iterator. + + // We need to map the first 4MB. + // This first for loop was here in case I needed to set the first 2mb as not present. + for(unsigned int i = 0; i < 512; i++) + { + page_table[i] = tempaddr | 3; // set bits 0 and 1 to present and read/write respectively + tempaddr += 4096; // 4096 = 4kb + } + + for(unsigned int i = 512; i < 1024; i++) + { + page_table[i] = tempaddr | 3; // set bits 0 and 1 to present and read/write respectively + tempaddr += 4096; // 4096 = 4kb + } + + + // Fill first entry of page directory. + temp_page_directory[0] = (unsigned long)page_table; + temp_page_directory[0] = temp_page_directory[0] | 3; + + for(unsigned int j = 1; j < 1024; j++) + { + temp_page_directory[j] = 0 | 2; + } + + page_directory = temp_page_directory; + + current_page_table = this; + + Console::puts("\nConstructed Page Table object\n"); +} + + +void PageTable::load() +{ + write_cr3((unsigned long)page_directory); + Console::puti((unsigned long)page_directory); + current_page_table = this; + Console::puts("\nLoaded page table\n"); +} + +void PageTable::enable_paging() +{ + write_cr3((unsigned long)current_page_table->page_directory); + write_cr0(read_cr0() | 0x80000000); + paging_enabled = read_cr0(); + Console::puts("\nEnabled paging\n"); +} + +void PageTable::handle_fault(REGS * _r) +{ + + // Initializing some variables to make things easier. + unsigned long * temp_pd = (unsigned long *) (current_page_table->page_directory); + unsigned long * temp_pt = (unsigned long *) (*temp_pd); + + unsigned long pt_index = (read_cr2() >> 12) & 0x3FFFFF; + unsigned long pd_index = read_cr2() >> 22; + + // If there isn't a page table present. + if(!(temp_pd[pd_index] & 1)) + { + Console::puts("\nPage Table not Present.\n"); + + unsigned long * new_pt = (unsigned long *) (kernel_mem_pool->get_frames(1) << 12); + + // Set new page table entries as present. + // Start at beginning address for the page table + // this should be pd_index << 22. + unsigned long temp_addr = pd_index << 22; + for(unsigned int i = 0; i < 1024; i++) + { + new_pt[i] = temp_addr | 3; + temp_addr += 4096; + } + + // Add page table to page directory. + temp_pd[pd_index] = (unsigned long) new_pt; + temp_pd[pd_index] = temp_pd[pd_index] | 3; + } + + /* + // Why is this commented out? + + // Unfortunately, for whatever reason, any time I try to call + // process_mem_pool->get_frames() the entire program crashes. + // I've tried evaluating lines immediately afterwards, adding + // for(;;);, the program ignores this and continues to crash. + // Since I have no idea why this is happening, I can only assume + // I did something wrong in cont_frame_pool or that this is just + // an issue I didn't address properly somewhere and didn't see + // addressed in the instructions. Regardless, I left what I believe + // would be the implementation of handle_fault in the case that I + // needed to allocate a frame in process_mem_pool in order to + // allocate a page for a process commented out so I could at least + // show that I knew how it would be implemented. + + if(read_cr2() >> 22 > 0) + { + if(((unsigned long *)temp_pd[pd_index])[pt_index] & 1) + { + Console::puts("\nPage not present.\n"); + unsigned long * new_page = (unsigned long *) (process_mem_pool->get_frames(1) << 12); + + // Set new page as page table entry. + ((unsigned long *)temp_pd[pd_index])[pt_index] = (unsigned long) new_page | 3; + } + } + */ + + Console::puts("\nhandled page fault\n"); +} + diff --git a/MP3/mp3/page_table.H b/MP3/mp3/page_table.H new file mode 100755 index 0000000..f89e5a1 --- /dev/null +++ b/MP3/mp3/page_table.H @@ -0,0 +1,91 @@ +/* + File: page_table.H + + Author: R. Bettati + Department of Computer Science + Texas A&M University + Date : 16/12/07 + + Description: Basic Paging. + +*/ + +#ifndef _page_table_H_ // include file only once +#define _page_table_H_ + +/*--------------------------------------------------------------------------*/ +/* DEFINES */ +/*--------------------------------------------------------------------------*/ + +/* -- (none) -- */ + +/*--------------------------------------------------------------------------*/ +/* INCLUDES */ +/*--------------------------------------------------------------------------*/ + +#include "machine.H" +#include "exceptions.H" +#include "cont_frame_pool.H" + +/*--------------------------------------------------------------------------*/ +/* FORWARDS */ +/*--------------------------------------------------------------------------*/ + +/* -- (none) -- */ + +/*--------------------------------------------------------------------------*/ +/* P A G E - T A B L E */ +/*--------------------------------------------------------------------------*/ + +class PageTable { + +private: + + /* THESE MEMBERS ARE COMMON TO ENTIRE PAGING SUBSYSTEM */ + static PageTable * current_page_table; /* pointer to currently loaded page table object */ + static unsigned int paging_enabled; /* is paging turned on (i.e. are addresses logical)? */ + static ContFramePool * kernel_mem_pool; /* Frame pool for the kernel memory */ + static ContFramePool * process_mem_pool; /* Frame pool for the process memory */ + static unsigned long shared_size; /* size of shared address space */ + + /* DATA FOR CURRENT PAGE TABLE */ + unsigned long * page_directory; /* where is page directory located? */ + +public: + static const unsigned int PAGE_SIZE = Machine::PAGE_SIZE; + /* in bytes */ + static const unsigned int ENTRIES_PER_PAGE = Machine::PT_ENTRIES_PER_PAGE; + /* in entries, duh! */ + + static void init_paging(ContFramePool * _kernel_mem_pool, + ContFramePool * _process_mem_pool, + const unsigned long _shared_size); + /* Set the global parameters for the paging subsystem. */ + + PageTable(); + /* Initializes a page table with a given location for the directory and the + page table proper. + NOTE: The PageTable object still needs to be stored somewhere! + Probably it is best to have it on the stack, as there is no + memory manager yet... + NOTE2: It may also be simpler to create the first page table *before* + paging has been enabled. + */ + + void load(); + /* Makes the given page table the current table. This must be done once during + system startup and whenever the address space is switched (e.g. during + process switching). */ + + static void enable_paging(); + /* Enable paging on the CPU. Typically, a CPU start with paging disabled, and + memory is accessed by addressing physical memory directly. After paging is + enabled, memory is addressed logically. */ + + static void handle_fault(REGS * _r); + /* The page fault handler. */ + +}; + +#endif +