OSDN Git Service

I/Oメモリ管理機能追加
[mochi/master.git] / src / kernel / include / MemMng.h
1 /******************************************************************************/
2 /* src/kernel/include/MemMng.h                                                */
3 /*                                                                 2018/08/16 */
4 /* Copyright (C) 2016-2018 Mochi.                                             */
5 /******************************************************************************/
6 #ifndef MEMMNG_H
7 #define MEMMNG_H
8 /******************************************************************************/
9 /* インクルード                                                               */
10 /******************************************************************************/
11 /* 共通ヘッダ */
12 #include <stddef.h>
13 #include <stdint.h>
14 #include <firmware/bios/e820.h>
15 #include <hardware/IA32/IA32Paging.h>
16 #include <kernel/config.h>
17 #include <kernel/kernel.h>
18 #include <kernel/types.h>
19
20 /* 外部モジュールヘッダ */
21 #include <Cmn.h>
22 #include <TaskMng.h>
23
24
25 /******************************************************************************/
26 /* 定義                                                                       */
27 /******************************************************************************/
28 /* GDT定義 */
29 #define MEMMNG_GDT_ENTRY_FULL     (  0 )        /** GDTエントリ空き無し   */
30 #define MEMMNG_GDT_ENTRY_MIN      (  1 )        /** GDTエントリ番号最小値 */
31 #define MEMMNG_GDT_ENTRY_MAX      (  9 )        /** GDTエントリ番号最大値 */
32 #define MEMMNG_GDT_ENTRY_NUM        \
33     ( MEMMNG_GDT_ENTRY_MAX + 1 )                /** GDTエントリ数         */
34
35 /* セグメントセレクタ定義 */
36 #define MEMMNG_SEGSEL_KERNEL_CODE ( 1 * 8     ) /** カーネルコードセグメント */
37 #define MEMMNG_SEGSEL_KERNEL_DATA ( 2 * 8     ) /** カーネルデータセグメント */
38 #define MEMMNG_SEGSEL_APL_CODE    ( 3 * 8 + 3 ) /** アプリコードセグメント   */
39 #define MEMMNG_SEGSEL_APL_DATA    ( 4 * 8 + 3 ) /** アプリデータセグメント   */
40
41 /** ページディレクトリID */
42 #define MEMMNG_PAGE_DIR_ID_IDLE   ( 0 )         /** アイドルプロセス用PDID */
43 #define MEMMNG_PAGE_DIR_ID_MIN    ( 1 )         /** PDID最小値             */
44
45 /* ページディレクトリ定義 */
46 #define MEMMNG_PAGE_DIR_NUM       MK_CONFIG_PID_NUM     /** PD管理数   */
47 #define MEMMNG_PAGE_DIR_FULL      MEMMNG_PAGE_DIR_NUM   /** PD空き無し */
48
49 /* ページテーブル定義 */
50 #define MEMMNG_PAGE_TBL_NUM       ( 4096 )              /** PT管理数   */
51 #define MEMMNG_PAGE_TBL_FULL      MEMMNG_PAGE_TBL_NUM   /** PT空き無し */
52
53
54 /******************************************************************************/
55 /* グローバル関数宣言                                                         */
56 /******************************************************************************/
57 /*--------------*/
58 /* MemMngCtrl.c */
59 /*--------------*/
60 /* メモリコピー(仮想->物理) */
61 extern void MemMngCtrlCopyVirtToPhys( void   *pPAddr,
62                                       void   *pVAddr,
63                                       size_t size     );
64
65 /* メモリ設定 */
66 extern void MemMngCtrlSet( void    *pPAddr,
67                            uint8_t value,
68                            size_t  size     );
69
70
71 /*-------------*/
72 /* MemMngGdt.c */
73 /*-------------*/
74 /* GDTエントリ追加 */
75 extern uint16_t MemMngGdtAdd( void    *pBase,
76                               size_t  limit,
77                               uint8_t limitG,
78                               uint8_t sysFlg,
79                               uint8_t type,
80                               uint8_t level,
81                               uint8_t opSize  );
82
83
84 /*--------------*/
85 /* MemMngInit.c */
86 /*--------------*/
87 /* メモリ管理初期化 */
88 extern void MemMngInit( BiosE820Entry_t *pBiosE820,
89                         size_t          biosE820Num,
90                         MkMemMapEntry_t *pMemMap,
91                         size_t          memMapNum    );
92
93
94 /*------------*/
95 /* MemMngIo.c */
96 /*------------*/
97 /* I/Oメモリ領域割当 */
98 extern void *MemMngIoAlloc( void   *pAddr,
99                             size_t size    );
100
101 /* I/Oメモリ領域解放 */
102 extern CmnRet_t MemMngIoFree( void *pAddr );
103
104
105 /*-------------*/
106 /* MemMngMap.c */
107 /*-------------*/
108 extern CmnRet_t MemMngMapGetInfo( MkMemMapEntry_t *pInfo,
109                                   uint32_t        type    );
110
111 /*--------------*/
112 /* MemMngPage.c */
113 /*--------------*/
114 /* ページディレクトリ割当 */
115 extern uint32_t MemMngPageAllocDir( void );
116
117 /* ページディレクトリ解放 */
118 extern CmnRet_t MemMngPageFreeDir( uint32_t id );
119
120 /* ページディレクトリID取得 */
121 extern uint32_t MemMngPageGetDirId( void );
122
123 /* ページディレクトリ切替 */
124 extern IA32PagingPDBR_t MemMngPageSwitchDir( uint32_t pageDirId );
125
126 /* ページマッピング設定 */
127 extern CmnRet_t MemMngPageSet( uint32_t dirId,
128                                void     *pVAddr,
129                                void     *pPAddr,
130                                size_t   size,
131                                uint32_t attrGlobal,
132                                uint32_t attrUs,
133                                uint32_t attrRw      );
134
135 /* ページマッピング解除 */
136 extern void MemMngPageUnset( uint32_t dirId,
137                              void     *pVAddr,
138                              size_t   size     );
139
140
141 /*--------------*/
142 /* MemMngPhys.c */
143 /*--------------*/
144 /* 物理メモリ領域割当 */
145 extern void *MemMngPhysAlloc( size_t size );
146
147 /* 物理メモリ領域解放 */
148 extern CmnRet_t MemMngPhysFree( void *pAddr );
149
150
151 /*--------------*/
152 /* MemMngVirt.c */
153 /*--------------*/
154 /* 仮想メモリ領域割当 */
155 extern void *MemMngVirtAlloc( MkPid_t pid,
156                               size_t  size );
157
158 /* 指定仮想メモリ領域割当 */
159 extern void *MemMngVirtAllocSpecified( MkPid_t pid,
160                                        void    *pAddr,
161                                        size_t  size    );
162
163 /* 仮想メモリ領域管理終了 */
164 extern CmnRet_t MemMngVirtEnd( MkPid_t pid );
165
166 /* 仮想メモリ領域解放 */
167 extern CmnRet_t MemMngVirtFree( MkPid_t pid,
168                                 void    *pAddr );
169
170 /* 仮想メモリ領域管理開始 */
171 extern CmnRet_t MemMngVirtStart( MkPid_t pid );
172
173
174 /******************************************************************************/
175 #endif