# createvirtualspace.c

Go to the documentation of this file.

    00001 /*****************************************************************************************
    00002  Copyright (c) 2002 The UbixOS Project
    00003  All rights reserved.
    00004
    00005 Redistribution and use in source and binary forms, with or without modification, are
    00006 permitted provided that the following conditions are met:
    00007
    00008 Redistributions of source code must retain the above copyright notice, this list of
    00009 conditions, the following disclaimer and the list of authors.  Redistributions in binary
    00010 form must reproduce the above copyright notice, this list of conditions, the following
    00011 disclaimer and the list of authors in the documentation and/or other materials provided
    00012 with the distribution. Neither the name of the UbixOS Project nor the names of its
    00013 contributors may be used to endorse or promote products derived from this software
    00014 without specific prior written permission.
    00015
    00016 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
    00017 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    00018 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
    00019 THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    00020 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
    00021 OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    00022 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
    00023 TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    00024 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    00025
    00026  $Log: createvirtualspace_8c-source.html,v $
    00026  Revision 1.7  2006/12/15 17:47:04  reddawg
    00026  Updates
    00026
    00027  Revision 1.1.1.1  2006/06/01 12:46:13  reddawg
    00028  ubix2
    00029
    00030  Revision 1.2  2005/10/12 00:13:38  reddawg
    00031  Removed
    00032
    00033  Revision 1.1.1.1  2005/09/26 17:24:50  reddawg
    00034  no message
    00035
    00036  Revision 1.2  2004/07/28 15:05:43  reddawg
    00037  Major:
    00038    Pages now have strict security enforcement.
    00039    Many null dereferences have been resolved.
    00040    When apps loaded permissions set for pages rw and ro
    00041
    00042  Revision 1.1.1.1  2004/04/15 12:06:51  reddawg
    00043  UbixOS v1.0
    00044
    00045  Revision 1.8  2004/04/13 16:36:34  reddawg
    00046  Changed our copyright, it is all now under a BSD-Style license
    00047
    00048
    00049
    00050  $Id: createvirtualspace_8c-source.html 88 2016-01-12 00:11:29Z reddawg $
    00051
    00052 *****************************************************************************************/
    00053
    00054 #include <vmm/vmm.h>
    00055
    00056
    00057 /************************************************************************
    00058
    00059 Function: void *vmmCreateVirtualSpace(pid_t);
    00060 Description: Creates A Virtual Space For A New Task
    00061 Notes:
    00062
    00063 07/30/02 - This Is Going To Create A New VM Space However Its Going To
    00064            Share The Same Top 1GB Space With The Kernels VM And Lower
    00065            1MB Of VM Space With The Kernel
    00066
    00067 07/30/02 - Note This Is Going To Get The Top 1Gig And Lower 1MB Region
    00068            From The Currently Loaded Page Directory This Is Safe Because
    00069            All VM Spaces Will Share These Regions
    00070
    00071 07/30/02 - Note I Realized A Mistake The First Page Table Will Need To Be
    00072            A Copy But The Page Tables For The Top 1GB Will Not Reason For
    00073            This Is That We Just Share The First 1MB In The First Page Table
    00074            So We Will Just Share Physical Pages.
    00075
    00076 08/02/02 - Added Passing Of pid_t pid For Better Tracking Of Who Has Which
    00077            Set Of Pages
    00078
    00079 ************************************************************************/
    00080 void           *
    00081 vmmCreateVirtualSpace(pid_t pid)
    00082 {
    00083   void           *newPageDirectoryAddress = 0x0;
    00084   uInt32         *parentPageDirectory = 0x0, *newPageDirectory = 0x0;
    00085   uInt32         *parentPageTable = 0x0, *newPageTable = 0x0;
    00086   int             x = 0;
    00087
    00088   /* Set Address Of Parent Page Directory */
    00089   parentPageDirectory = (uInt32 *) parentPageDirAddr;
    00090   /* Allocate A New Page For The New Page Directory */
    00091   newPageDirectory = (uInt32 *) vmmGetFreePage(pid);
    00092   /* Set newPageDirectoryAddress To The Newly Created Page Directories Page */
    00093   newPageDirectoryAddress = (void *)vmm_getPhysicalAddr((uInt32) newPageDirectory);
    00094   /* First Set Up A Flushed Page Directory */
    00095   for (x = 0; x < pageEntries; x++) {
    00096     (uInt32) newPageDirectory[x] = (uInt32) 0x0;
    00097   }
    00098   /* Map The Top 1GB Region Of The VM Space */
    00099   for (x = 768; x < pageEntries; x++) {
    00100     newPageDirectory[x] = parentPageDirectory[x];
    00101   }
    00102   /*
    00103    * Allocate A New Page For The The First Page Table Where We Will Map The
    00104    * Lower Region
    00105    */
    00106   newPageTable = (uInt32 *) vmmGetFreePage(pid);
    00107   /* Flush The Page From Garbage In Memory */
    00108   for (x = 0; x < pageEntries; x++) {
    00109     (uInt32) newPageTable[x] = (uInt32) 0x0;
    00110   }
    00111   /* Map This Into The Page Directory */
    00112   newPageDirectory[0] = (vmm_getPhysicalAddr((uInt32) newPageTable) | PAGE_DEFAULT);
    00113   /* Set Address Of Parents Page Table */
    00114   parentPageTable = (uInt32 *) tablesBaseAddress;
    00115   /* Map The First 1MB Worth Of Pages */
    00116   for (x = 0; x < (pageEntries / 4); x++) {
    00117     newPageTable[x] = parentPageTable[x];
    00118   }
    00119   /* Set Virtual Mapping For Page Directory */
    00120   newPageTable[256] = (vmm_getPhysicalAddr((uInt32) newPageDirectory) | PAGE_DEFAULT);
    00121
    00122   /*
    00123    * Now The Fun Stuff Build The Initial Virtual Page Space So We Don't Have
    00124    * To Worry About Mapping Them In Later How Ever I'm Concerned This May
    00125    * Become A Security Issue
    00126    */
    00127   /* First Lets Unmap The Previously Allocated Page Table */
    00128   vmmUnmapPage((uInt32) newPageTable, 1);
    00129   /* Allocate A New Page Table */
    00130   newPageTable = (uInt32 *) vmmGetFreePage(pid);
    00131   /* First Set Our Page Directory To Contain This */
    00132   newPageDirectory[767] = vmm_getPhysicalAddr((uInt32) newPageTable) | PAGE_DEFAULT;
    00133   /* Now Lets Build The Page Table */
    00134   for (x = 0; x < pageEntries; x++) {
    00135     newPageTable[x] = newPageDirectory[x];
    00136   }
    00137   /* Now We Are Done So Lets Unmap This Page */
    00138   vmmUnmapPage((uInt32) newPageTable, 1);
    00139   /* Now We Are Done With The Page Directory So Lets Unmap That Too */
    00140   vmmUnmapPage((uInt32) newPageDirectory, 1);
    00141   /* Return Physical Address Of Page Directory */
    00142   return (newPageDirectoryAddress);
    00143 }
    00144
    00145 /***
    00146  END
    00147  ***/
    00148