Phoenix
Object-oriented orthogonally persistent operating system
vm_mm.h
Go to the documentation of this file.
00001 /*
00002  * /phoenix/kernel/sys/vm_mm.h
00003  *
00004  * This file is a part of Phoenix operating system.
00005  * Copyright (c) 2011-2012, Artyom Lebedev <artyom.lebedev@gmail.com>
00006  * All rights reserved.
00007  * See COPYING file for copyright details.
00008  */
00009 
00014 #ifndef VM_MM_H_
00015 #define VM_MM_H_
00016 
00017 #include <vm_page.h>
00018 
00019 namespace vm {
00020 
00022 class QuickMap {
00023 public:
00024     enum {
00026         MAX_PAGES = 64,
00027     };
00028 
00038     QuickMap(Vaddr mapBase, size_t numPages, void **mapPte);
00039     ~QuickMap();
00040 
00047     Vaddr Map(Paddr pa, long flags = LAT_EF_PRESENT | LAT_EF_WRITE);
00048 
00053     void Unmap(Vaddr va);
00054 
00055 private:
00056     BitString<MAX_PAGES> _mapped; 
00057     Vaddr _mapBase;
00058     size_t _numPages;
00059     void **_mapPte;
00060 };
00061 
00063 class MM {
00064 public:
00066     enum InitState {
00070         IS_INITIAL,
00074         IS_PREINITIALIZED,
00078         IS_INITIALIZING,
00082         IS_INITIALIZED,
00083     };
00084 
00086     static inline InitState GetInitState() { return MM::_initState; }
00087 
00098     static void PreInitialize(vaddr_t heap,
00099                               paddr_t defaultLatRoot,
00100                               vaddr_t quickMap,
00101                               void **quickMapPte);
00102 
00110     static void Initialize(void *memMap,
00111                            size_t memMapNumDesc,
00112                            size_t memMapDescSize,
00113                            u32 memMapDescVersion);
00114 
00122     inline Vaddr PhysToVirt(Paddr pa) {
00123         ASSERT(pa >= _physFirst && pa < _physFirst + _physRange);
00124         pa -= _physFirst;
00125         return _physMemMap + pa.IdentityVaddr();
00126     }
00127 
00133     inline Page &GetPage(Paddr pa) {
00134         ASSERT(pa >= _physFirst && pa < _physFirst + _physRange);
00135         return _pageDesc[(pa - _physFirst) / PAGE_SIZE];
00136     }
00137 
00138     inline bool IsPageManaged(Paddr pa) {
00139         if (pa < _physFirst || pa >= _physFirst + _physRange) {
00140             return false;
00141         }
00142         Page &page = GetPage(pa);
00143         return page.GetFlags() & Page::F_MANAGED;
00144     }
00145 
00146 private:
00147     friend class Page;
00148 
00149     static InitState _initState;
00150 
00158     MM(void *memMap, size_t memMapNumDesc, size_t memMapDescSize,
00159        u32 memMapDescVersion);
00160 
00162     QuickMap _quickMap;
00163 
00165     Vaddr _physMemMap;
00167     Paddr _physFirst;
00169     psize_t _physRange;
00171     Page *_pageDesc;
00172 
00174     psize_t _physMemSize;
00175 
00177     Paddr _initialStart;
00179     Paddr _initialEnd;
00180 
00182     Paddr _defLatRoot;
00183 
00192     void _InitializePhysMem(void *memMap, size_t memMapNumDesc,
00193                             size_t memMapDescSize, u32 memMapDescVersion);
00194 };
00195 
00197 extern MM *mm;
00198 
00199 } /* namespace vm */
00200 
00201 #endif /* VM_MM_H_ */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines