OSDN Git Service

VGAヘッダ追加、ページ管理・メモリ制御モジュール追加
authorMochi <master.c.mochi@gmail.com>
Wed, 24 May 2017 14:00:13 +0000 (23:00 +0900)
committerMochi <master.c.mochi@gmail.com>
Wed, 24 May 2017 14:00:13 +0000 (23:00 +0900)
22 files changed:
src/booter/Initctrl/InitctrlCpu.s
src/include/kernel/MochiKernel.h
src/kernel/Debug/DebugLog.c
src/kernel/InitCtrl/InitCtrlInit.c
src/kernel/IntMng/IntMngIdt.c
src/kernel/IntMng/IntMngInit.c
src/kernel/Makefile
src/kernel/MemMng/MemMngArea.c
src/kernel/MemMng/MemMngCtrl.c [new file with mode: 0644]
src/kernel/MemMng/MemMngInit.c
src/kernel/MemMng/MemMngPage.c [new file with mode: 0644]
src/kernel/MemMng/MemMngPage.h [new file with mode: 0644]
src/kernel/ProcMng/ProcMngSched.c
src/kernel/ProcMng/ProcMngTask.c
src/kernel/ProcMng/ProcMngTask.h
src/kernel/include/Cmn.h
src/kernel/include/MemMng.h
src/kernel/include/hardware/IA32/IA32.h
src/kernel/include/hardware/IA32/IA32Instruction.h
src/kernel/include/hardware/IA32/IA32Paging.h [new file with mode: 0644]
src/kernel/include/hardware/Vga/Vga.h [new file with mode: 0644]
vm/vmware/mochi.vmx

index 6e4a777..9ba9a6e 100644 (file)
@@ -46,7 +46,7 @@ setSegment:
     mov         ss, ax
     
     /* スタックポインタ変更 */
-    mov         esp, 0x03000000
+    mov         esp, 0x04000000
     
     /* カーネル実行 */
     jmp         0x00100000
index 6c4bd9d..4bf60f7 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/include/kernel/MochiKernel.h                                           */
-/*                                                                 2017/02/27 */
+/*                                                                 2017/05/24 */
 /* Copyright (C) 2017 Mochi                                                   */
 /******************************************************************************/
 #ifndef _MOCHI_KERNEL_H_
 /* 定義                                                                       */
 /******************************************************************************/
 /* メモリ領域タイプ */
-#define MOCHIKERNEL_MEMORY_TYPE_AVAILABLE ( 0x01 )  /**< 使用可能メモリ領域 */
-#define MOCHIKERNEL_MEMORY_TYPE_RESERVED  ( 0x02 )  /**< 使用不可メモリ領域 */
-#define MOCHIKERNEL_MEMORY_TYPE_ACPI      ( 0x03 )  /**< ACPIメモリ領域     */
-#define MOCHIKERNEL_MEMORY_TYPE_ACPI_NVS  ( 0x04 )  /**< ACPI NVSメモリ領域 */
+#define MOCHIKERNEL_MEMORY_TYPE_AVAILABLE ( 0x01 )  /** 使用可能メモリ領域 */
+#define MOCHIKERNEL_MEMORY_TYPE_RESERVED  ( 0x02 )  /** 使用不可メモリ領域 */
+#define MOCHIKERNEL_MEMORY_TYPE_ACPI      ( 0x03 )  /** ACPIメモリ領域     */
+#define MOCHIKERNEL_MEMORY_TYPE_ACPI_NVS  ( 0x04 )  /** ACPI NVSメモリ領域 */
+#define MOCHIKERNEL_MEMORY_TYPE_KERNEL    ( 0x05 )  /** MochiKernel領域    */
 
 /** メモリマップ */
 typedef struct {
index 5bb20ca..c3c54b9 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/Debug/DebugLog.c                                                */
-/*                                                                 2017/03/23 */
+/*                                                                 2017/05/24 */
 /* Copyright (C) 2017 Mochi.                                                  */
 /******************************************************************************/
 /******************************************************************************/
@@ -13,6 +13,7 @@
 
 /* 外部モジュールヘッダ */
 #include <Cmn.h>
+#include <hardware/Vga/Vga.h>
 
 /* 内部モジュールヘッダ */
 #include "DebugLog.h"
 /* 定義                                                                       */
 /******************************************************************************/
 /* 長さ定義 */
-#define LOG_LENGTH_ID      (  8 )   /**< 識別子文字数   */
-#define LOG_LENGTH_COLUMN  ( 80 )   /**< 一行最大文字数 */
-#define LOG_LENGTH_ROW     ( 25 )   /**< 最大行数       */
-#define LOG_LENGTH_LINENUM (  4 )   /**< 行番号文字数   */
-
-/** VRAM先頭アドレス */
-#define LOG_VRAM_ADDR ( 0xB8000 )
+#define LOG_LENGTH_ID      (  8 )   /** 識別子文字数 */
+#define LOG_LENGTH_LINENUM (  4 )   /** 行番号文字数 */
 
 /** カーソル位置アドレス計算 */
-#define LOG_CURSOR_ADDR( __ROW, __COLUMN )                      \
-    ( ( uint8_t * ) ( LOG_VRAM_ADDR +                           \
-                      ( __ROW ) * LOG_LENGTH_COLUMN * 2 +       \
-                      ( __COLUMN ) * 2                    ) )
+#define LOG_CURSOR_ADDR( __ROW, __COLUMN )                  \
+    ( ( uint8_t * ) ( VGA_M3_VRAM_ADDR +                    \
+                      ( __ROW ) * VGA_M3_COLUMN * 2 +       \
+                      ( __COLUMN ) * 2                ) )
 
 /** 文字色取得マクロ */
 #define LOG_ATTR_FG( __BASE )           ( __BASE & 0x0F )
 /** 背景色変更マクロ */
 #define LOG_ATTR_BG_CHG( __BASE, __BG ) ( LOG_ATTR_FG( __BASE ) | ( __BG ) )
 
-/* 文字属性 */
-#define LOG_ATTR_FG_BLACK  ( 0x00 ) /* 黒色文字属性 */
-#define LOG_ATTR_FG_BLUE   ( 0x01 ) /* 青色文字属性 */
-#define LOG_ATTR_FG_GREEN  ( 0x02 ) /* 緑色文字属性 */
-#define LOG_ATTR_FG_CYAN   ( 0x03 ) /* 水色文字属性 */
-#define LOG_ATTR_FG_RED    ( 0x04 ) /* 赤色文字属性 */
-#define LOG_ATTR_FG_PURPLE ( 0x05 ) /* 紫色文字属性 */
-#define LOG_ATTR_FG_BROWN  ( 0x06 ) /* 茶色文字属性 */
-#define LOG_ATTR_FG_WHITE  ( 0x07 ) /* 白色文字属性 */
-#define LOG_ATTR_FG_BRIGHT ( 0x08 ) /* 明色文字属性 */
-#define LOG_ATTR_BG_BLACK  ( 0x00 ) /* 黒色背景属性 */
-#define LOG_ATTR_BG_BLUE   ( 0x10 ) /* 青色背景属性 */
-#define LOG_ATTR_BG_GREEN  ( 0x20 ) /* 緑色背景属性 */
-#define LOG_ATTR_BG_CYAN   ( 0x30 ) /* 水色背景属性 */
-#define LOG_ATTR_BG_RED    ( 0x40 ) /* 赤色背景属性 */
-#define LOG_ATTR_BG_PURPLE ( 0x50 ) /* 紫色背景属性 */
-#define LOG_ATTR_BG_BROWN  ( 0x60 ) /* 茶色背景属性 */
-#define LOG_ATTR_BG_WHITE  ( 0x70 ) /* 白色背景属性 */
-#define LOG_ATTR_BLINK     ( 0x80 ) /* 点滅文字属性 */
-
 /* 変換指定子フラグ */
 #define LOG_FLAG_LEFT      ( 0x01 ) /* 左寄せ       */
 #define LOG_FLAG_SIGN      ( 0x02 ) /* 符号表示     */
@@ -111,6 +87,8 @@ const static logIdTrans_t gIdTransTbl[ CMN_MODULE_NUM + 1 ] = {
     { CMN_MODULE_MEMMNG_INIT,   "MEM-INIT" },   /* メモリ管理(初期化)         */
     { CMN_MODULE_MEMMNG_GDT,    "MEM-GDT " },   /* メモリ管理(GDT管理)        */
     { CMN_MODULE_MEMMNG_AREA,   "MEM-AREA" },   /* メモリ管理(メモリ領域管理) */
+    { CMN_MODULE_MEMMNG_PAGE,   "MEM-PAGE" },   /* メモリ管理(ページ管理)     */
+    { CMN_MODULE_MEMMNG_CTRL,   "MEM-CTRL" },   /* メモリ管理(メモリ制御)     */
     { CMN_MODULE_INTMNG_INIT,   "INT-INIT" },   /* 割込管理(初期化)           */
     { CMN_MODULE_INTMNG_PIC,    "INT-PIC " },   /* 割込管理(PIC管理)          */
     { CMN_MODULE_INTMNG_IDT,    "INT-IDT " },   /* 割込管理(IDT管理)          */
@@ -192,9 +170,9 @@ void DebugLogInit( void )
     memset( &gLogTbl, 0, sizeof ( logTbl_t ) );
     
     /* 文字属性設定 */
-    gLogTbl.attr = LOG_ATTR_FG_WHITE  | /* 白色文字属性 */
-                   LOG_ATTR_FG_BRIGHT | /* 明色文字属性 */
-                   LOG_ATTR_BG_BLACK;   /* 黒色背景属性 */
+    gLogTbl.attr = VGA_M3_ATTR_FG_WHITE  |  /* 白色文字属性 */
+                   VGA_M3_ATTR_FG_BRIGHT |  /* 明色文字属性 */
+                   VGA_M3_ATTR_BG_BLACK;    /* 黒色背景属性 */
     
     return;
 }
@@ -211,6 +189,8 @@ void DebugLogInit( void )
  *                  - CMN_MODULE_MEMMNG_INIT   メモリ管理(初期化)
  *                  - CMN_MODULE_MEMMNG_GDT    メモリ管理(GDT管理)
  *                  - CMN_MODULE_MEMMNG_AREA   メモリ管理(メモリ領域管理)
+ *                  - CMN_MODULE_MEMMNG_PAGE   メモリ管理(ページ管理)
+ *                  - CMN_MODULE_MEMMNG_CTRL   メモリ管理(メモリ制御)
  *                  - CMN_MODULE_INTMNG_INIT   割込管理(初期化)
  *                  - CMN_MODULE_INTMNG_PIC    割込管理(PIC管理)
  *                  - CMN_MODULE_INTMNG_IDT    割込管理(IDT管理)
@@ -248,28 +228,28 @@ void DebugLogOutput( uint32_t moduleId,
     gLogTbl.column = 0;
     
     /* カーソル行範囲判定 */
-    if ( gLogTbl.row >= LOG_LENGTH_ROW ) {
+    if ( gLogTbl.row >= VGA_M3_ROW ) {
         /* 上限越え */
         
         /* カーソル行設定 */
-        gLogTbl.row = LOG_LENGTH_ROW - 1;
+        gLogTbl.row = VGA_M3_ROW - 1;
         
         /* 画面スクロール */
-        for ( row = 0; row < ( LOG_LENGTH_ROW - 1 ); row++ ) {
+        for ( row = 0; row < ( VGA_M3_ROW - 1 ); row++ ) {
             /* 一行コピー */
             memcpy( LOG_CURSOR_ADDR( row, 0 ),
                     LOG_CURSOR_ADDR( row + 1, 0 ),
-                    LOG_LENGTH_COLUMN * 2 );
+                    VGA_M3_COLUMN * 2 );
         }
         
         /* 最下行初期化 */
-        for ( column = 0; column < LOG_LENGTH_COLUMN; column++ ) {
+        for ( column = 0; column < VGA_M3_COLUMN; column++ ) {
             /* 一文字設定 */
             LOG_CURSOR_ADDR( row, column )[ 0 ] = ' ';
             LOG_CURSOR_ADDR( row, column )[ 1 ] =
-                LOG_ATTR_FG_WHITE  |    /* 白色文字属性 */
-                LOG_ATTR_FG_BRIGHT |    /* 明色文字属性 */
-                LOG_ATTR_BG_BLACK;      /* 黒色背景属性 */
+                VGA_M3_ATTR_FG_WHITE  |     /* 白色文字属性 */
+                VGA_M3_ATTR_FG_BRIGHT |     /* 明色文字属性 */
+                VGA_M3_ATTR_BG_BLACK;       /* 黒色背景属性 */
         }
     }
     
@@ -468,7 +448,7 @@ static void LogOutputChar( char c )
     uint8_t *pCursor;   /* カーソル */
     
     /* カーソル列チェック */
-    if ( gLogTbl.column >= LOG_LENGTH_COLUMN ) {
+    if ( gLogTbl.column >= VGA_M3_COLUMN ) {
         /* 行数超 */
         
         return;
@@ -518,11 +498,11 @@ static void LogOutputNumber( uint32_t value,
                              uint32_t flags,
                              int32_t  width  )
 {
-    char     buffer[ LOG_LENGTH_COLUMN ];   /* 出力バッファ     */
-    char     *pTrans;                       /* 数字変換表       */
-    int32_t  length;                        /* バッファ文字列長 */
-    uint32_t tmp;                           /* 一時変数         */
-    uint32_t idx;                           /* インデックス     */
+    char     buffer[ VGA_M3_COLUMN ];   /* 出力バッファ     */
+    char     *pTrans;                   /* 数字変換表       */
+    int32_t  length;                    /* バッファ文字列長 */
+    uint32_t tmp;                       /* 一時変数         */
+    uint32_t idx;                       /* インデックス     */
     
     /* 初期化 */
     memset( buffer, '0', sizeof ( buffer ) );
@@ -530,7 +510,7 @@ static void LogOutputNumber( uint32_t value,
     tmp    = value;
     
     /* 最小フィールド幅範囲チェック */
-    if ( ( width < 0 ) && ( LOG_LENGTH_COLUMN <= width ) ) {
+    if ( ( width < 0 ) && ( VGA_M3_COLUMN <= width ) ) {
         /* 0未満、LOG_LENGTH_COLUMN超過 */
         
         /* 最小フィールド幅初期化 */
@@ -868,9 +848,9 @@ static void LogProcEscapeAttr( uint32_t funcNo )
         case 0:
             /* 属性初期化 */
             
-            gLogTbl.attr = LOG_ATTR_FG_WHITE  | /* 白色文字属性 */
-                           LOG_ATTR_FG_BRIGHT | /* 明色文字属性 */
-                           LOG_ATTR_BG_BLACK;   /* 黒色背景属性 */
+            gLogTbl.attr = VGA_M3_ATTR_FG_WHITE  |  /* 白色文字属性 */
+                           VGA_M3_ATTR_FG_BRIGHT |  /* 明色文字属性 */
+                           VGA_M3_ATTR_BG_BLACK;    /* 黒色背景属性 */
             
             break;
             
@@ -878,8 +858,9 @@ static void LogProcEscapeAttr( uint32_t funcNo )
             /* 反転 */
             
             /* 反転 */
-            attr  = ( LOG_ATTR_BG( gLogTbl.attr ) >> 4 ) | LOG_ATTR_FG_BRIGHT;
-            attr &= ( LOG_ATTR_FG( gLogTbl.attr ) << 4 ) & ~LOG_ATTR_BLINK;
+            attr  = ( LOG_ATTR_BG( gLogTbl.attr ) >> 4 ) |
+                    VGA_M3_ATTR_FG_BRIGHT;
+            attr &= ( LOG_ATTR_FG( gLogTbl.attr ) << 4 ) & ~VGA_M3_ATTR_BLINK;
             
             /* 設定 */
             gLogTbl.attr = attr;
@@ -890,49 +871,50 @@ static void LogProcEscapeAttr( uint32_t funcNo )
             /* 黒色文字 */
             gLogTbl.attr =
                 LOG_ATTR_FG_CHG( gLogTbl.attr,
-                                 LOG_ATTR_FG_BLACK | LOG_ATTR_FG_BRIGHT );
+                                 VGA_M3_ATTR_FG_BLACK | VGA_M3_ATTR_FG_BRIGHT );
             break;
             
         case 31:
             /* 赤色文字 */
             gLogTbl.attr =
                 LOG_ATTR_FG_CHG( gLogTbl.attr,
-                                 LOG_ATTR_FG_RED | LOG_ATTR_FG_BRIGHT );
+                                 VGA_M3_ATTR_FG_RED | VGA_M3_ATTR_FG_BRIGHT );
             break;
             
         case 32:
             /* 緑色文字 */
             gLogTbl.attr =
                 LOG_ATTR_FG_CHG( gLogTbl.attr,
-                                 LOG_ATTR_FG_GREEN | LOG_ATTR_FG_BRIGHT );
+                                 VGA_M3_ATTR_FG_GREEN | VGA_M3_ATTR_FG_BRIGHT );
             break;
             
         case 33:
             /* 黄色文字 */
             gLogTbl.attr =
                 LOG_ATTR_FG_CHG( gLogTbl.attr,
-                                 LOG_ATTR_FG_BROWN | LOG_ATTR_FG_BRIGHT );
+                                 VGA_M3_ATTR_FG_BROWN | VGA_M3_ATTR_FG_BRIGHT );
             break;
             
         case 34:
             /* 青色文字 */
             gLogTbl.attr =
                 LOG_ATTR_FG_CHG( gLogTbl.attr,
-                                 LOG_ATTR_FG_BLUE | LOG_ATTR_FG_BRIGHT );
+                                 VGA_M3_ATTR_FG_BLUE | VGA_M3_ATTR_FG_BRIGHT );
             break;
             
         case 35:
             /* 紫色文字 */
             gLogTbl.attr =
                 LOG_ATTR_FG_CHG( gLogTbl.attr,
-                                 LOG_ATTR_FG_PURPLE | LOG_ATTR_FG_BRIGHT );
+                                 VGA_M3_ATTR_FG_PURPLE | 
+                                     VGA_M3_ATTR_FG_BRIGHT );
             break;
             
         case 36:
             /* 水色文字 */
             gLogTbl.attr =
                 LOG_ATTR_FG_CHG( gLogTbl.attr,
-                                 LOG_ATTR_FG_CYAN | LOG_ATTR_FG_BRIGHT );
+                                 VGA_M3_ATTR_FG_CYAN | VGA_M3_ATTR_FG_BRIGHT );
             break;
             
         case 37:
@@ -941,49 +923,53 @@ static void LogProcEscapeAttr( uint32_t funcNo )
             /* 標準色文字 */
             gLogTbl.attr =
                 LOG_ATTR_FG_CHG( gLogTbl.attr,
-                                 LOG_ATTR_FG_WHITE | LOG_ATTR_FG_BRIGHT );
+                                 VGA_M3_ATTR_FG_WHITE | VGA_M3_ATTR_FG_BRIGHT );
             break;
             
         case 40:
             /* 黒色背景 *//* FALL THROUGH */
         case 49:
             /* 標準色背景 */
-            gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr, LOG_ATTR_BG_BLACK );
+            gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr,
+                                            VGA_M3_ATTR_BG_BLACK );
             break;
             
         case 41:
             /* 赤色背景 */
-            gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr, LOG_ATTR_BG_RED );
+            gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr, VGA_M3_ATTR_BG_RED );
             break;
             
         case 42:
             /* 緑色背景 */
-            gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr, LOG_ATTR_BG_RED );
+            gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr, VGA_M3_ATTR_BG_RED );
             break;
             
         case 43:
             /* 黄色背景 */
-            gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr, LOG_ATTR_BG_BROWN );
+            gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr,
+                                            VGA_M3_ATTR_BG_BROWN );
             break;
             
         case 44:
             /* 青色背景 */
-            gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr, LOG_ATTR_BG_BLUE );
+            gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr, VGA_M3_ATTR_BG_BLUE );
             break;
             
         case 45:
             /* 紫色背景 */
-            gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr, LOG_ATTR_BG_PURPLE );
+            gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr,
+                                            VGA_M3_ATTR_BG_PURPLE );
             break;
             
         case 46:
             /* 水色背景 */
-            gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr, LOG_ATTR_BG_CYAN );
+            gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr, VGA_M3_ATTR_BG_CYAN );
             break;
             
         case 47:
             /* 白色背景 */
-            gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr, LOG_ATTR_BG_WHITE );
+            gLogTbl.attr = LOG_ATTR_BG_CHG( gLogTbl.attr,
+                                            VGA_M3_ATTR_BG_WHITE );
             break;
             
         default:
index d502297..c977b78 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/InitCtrl/InitCtrlInit.c                                         */
-/*                                                                 2017/03/18 */
+/*                                                                 2017/05/24 */
 /* Copyright (C) 2016-2017 Mochi.                                             */
 /******************************************************************************/
 /******************************************************************************/
 void InitCtrlInit( void )
 {
     /* [TODO]カーネル起動引数対応まで仮 */
-    MochiKernelMemoryMap_t map = {
-        ( void * ) 0x03000000,
-        0x500000,
-        MOCHIKERNEL_MEMORY_TYPE_AVAILABLE };
+    MochiKernelMemoryMap_t map[] =
+        {
+            /* カーネル領域 */
+            {
+                ( void * ) 0x00100000,              /* 先頭アドレス */
+                0x03F00000,                         /* メモリサイズ */
+                MOCHIKERNEL_MEMORY_TYPE_KERNEL      /* メモリタイプ */
+            },
+            /* 利用可能領域 */
+            {
+                ( void * ) 0x04000000,              /* 先頭アドレス */
+                0x04000000,                         /* メモリサイズ */
+                MOCHIKERNEL_MEMORY_TYPE_AVAILABLE   /* メモリタイプ */
+            }
+        };
     
     /* デバッグ制御初期化 */
     DebugInit();
@@ -60,7 +71,7 @@ void InitCtrlInit( void )
     DEBUG_LOG( "Mochi Kernel start!!!" );
     
     /* メモリ管理モジュール初期化 */
-    MemMngInit( &map, 1 );
+    MemMngInit( map, 2 );
     
     /* プロセス管理モジュール初期化 */
     ProcMngInit();
index 7ffe7d8..b7ac993 100644 (file)
@@ -108,7 +108,7 @@ void IntMngIdtSet( uint32_t index,
                    uint8_t  type,
                    uint8_t  level )
 {
-    /* デバッグトレースログ出力 */
+    /* デバッグトレースログ出力 *//*
     DEBUG_LOG( "%s() start. index=%#x, selector=%u, ",
                __func__,
                index,
@@ -117,7 +117,7 @@ void IntMngIdtSet( uint32_t index,
                pOffset,
                count,
                type,
-               level );
+               level );*/
     
     /* ディスクリプタ設定 */
     gIdt[ index ].offset_low  = IA32_DESCRIPTOR_OFFSET_LOW( pOffset );
@@ -129,8 +129,8 @@ void IntMngIdtSet( uint32_t index,
     gIdt[ index ].attr_p      = IA32_DESCRIPTOR_P_YES;
     gIdt[ index ].offset_high = IA32_DESCRIPTOR_OFFSET_HIGH( pOffset );
     
-    /* デバッグトレースログ出力 */
-    DEBUG_LOG( "%s() end.", __func__ );
+    /* デバッグトレースログ出力 *//*
+    DEBUG_LOG( "%s() end.", __func__ );*/
     
     return;
 }
index 21918a9..a4d5929 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/IntMng/IntMngInit.c                                             */
-/*                                                                 2017/03/11 */
+/*                                                                 2017/05/19 */
 /* Copyright (C) 2016-2017 Mochi.                                             */
 /******************************************************************************/
 /******************************************************************************/
@@ -57,7 +57,7 @@ void IntMngInit( void )
     IntMngPicInit();
     
     /* デバッグトレースログ出力 */
-    DEBUG_LOG( "%s() start.", __func__ );
+    DEBUG_LOG( "%s() end.", __func__ );
     
     return;
 }
index 825e2ce..cd38d07 100644 (file)
@@ -1,6 +1,6 @@
 #******************************************************************************#
 #* src/kernel/Makefile                                                        *#
-#*                                                                 2017/03/11 *#
+#*                                                                 2017/05/18 *#
 #* Copyright (C) 2016-2017 Mochi.                                             *#
 #******************************************************************************#
 #******************************************************************************#
@@ -17,6 +17,8 @@ SRCS = InitCtrl/InitCtrlInit.c \
        MemMng/MemMngInit.c     \
        MemMng/MemMngGdt.c      \
        MemMng/MemMngArea.c     \
+       MemMng/MemMngPage.c     \
+       MemMng/MemMngCtrl.c     \
        IntMng/IntMngInit.c     \
        IntMng/IntMngIdt.c      \
        IntMng/IntMngHdl.c      \
index 3873c7c..bd80fac 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/MemMng/MemMngArea.c                                             */
-/*                                                                 2017/03/12 */
+/*                                                                 2017/05/24 */
 /* Copyright (C) 2017 Mochi.                                                  */
 /******************************************************************************/
 /******************************************************************************/
@@ -18,6 +18,7 @@
 /* 外部モジュールヘッダ */
 #include <Cmn.h>
 #include <Debug.h>
+#include <MemMng.h>
 
 /* 内部モジュールヘッダ */
 
@@ -194,6 +195,83 @@ void *MemMngAreaAlloc( size_t size )
 
 /******************************************************************************/
 /**
+ * @brief       メモリ領域情報取得
+ * @details     指定したメモリ領域情報を取得する。
+ * 
+ * @param[out]  *pInfo メモリ領域情報
+ * @param[in]   type   メモリ領域種別
+ *                  - MOCHIKERNEL_MEMORY_TYPE_ACPI     ACPIメモリ領域
+ *                  - MOCHIKERNEL_MEMORY_TYPE_ACPI_NVS ACPI NVSメモリ領域
+ *                  - MOCHIKERNEL_MEMORY_TYPE_KERNEL   MochiKernel領域
+ * 
+ * @retval      CMN_SUCCESS 正常終了
+ * @retval      CMN_FAILURE 異常終了
+ * 
+ * @note        下記メモリ領域情報は取得不可。
+ *              - 使用可能メモリ領域
+ *              - 使用不可メモリ領域
+ */
+/******************************************************************************/
+CmnRet_t MemMngAreaGetInfo( MemMngAreaInfo_t *pInfo,
+                            uint32_t         type    )
+{
+    uint32_t               index;   /* インデックス         */
+    MochiKernelMemoryMap_t *pEntry; /* メモリマップエントリ */
+    
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() start. pInfo=%010p, type=%u", __func__, pInfo, type );
+    
+    /* メモリ領域情報チェック */
+    if ( pInfo == NULL ) {
+        /* 不正値 */
+        
+        /* デバッグトレースログ出力 */
+        DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+        
+        return CMN_FAILURE;
+    }
+    
+    /* メモリ領域種別チェック */
+    if ( ( type != MOCHIKERNEL_MEMORY_TYPE_ACPI     ) &&
+         ( type != MOCHIKERNEL_MEMORY_TYPE_ACPI_NVS ) &&
+         ( type != MOCHIKERNEL_MEMORY_TYPE_KERNEL   )    ) {
+        /* 不正値 */
+        
+        /* デバッグトレースログ出力 */
+        DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+        
+        return CMN_FAILURE;
+    }
+    
+    /* メモリマップ全エントリ毎に繰り返し */
+    for ( index = 0; index < gAreaTbl.memoryMapSize; index++ ) {
+        /* メモリマップ参照変数設定 */
+        pEntry = &gAreaTbl.pMemoryMap[ index ];
+        
+        /* メモリ領域タイプ判定 */
+        if ( pEntry->type == type ) {
+            /* 一致 */
+            
+            /* メモリ領域情報設定 */
+            pInfo->pAddr = pEntry->pAddr;
+            pInfo->size  = pEntry->size;
+            
+            /* デバッグトレースログ出力 */
+            DEBUG_LOG( "%s() end. ret=CMN_SUCCESS, index=%d" );
+            
+            return CMN_SUCCESS;
+        }
+    }
+    
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+    
+    return CMN_FAILURE;
+}
+
+
+/******************************************************************************/
+/**
  * @brief       メモリ領域解放
  * @details     指定したメモリアドレスが先頭アドレスのメモリ領域を解放する。
  * 
diff --git a/src/kernel/MemMng/MemMngCtrl.c b/src/kernel/MemMng/MemMngCtrl.c
new file mode 100644 (file)
index 0000000..24dd87a
--- /dev/null
@@ -0,0 +1,186 @@
+/******************************************************************************/
+/* src/kernel/MemMng/MemMngCtrl.c                                             */
+/*                                                                 2017/05/19 */
+/* Copyright (C) 2017 Mochi.                                                  */
+/******************************************************************************/
+/******************************************************************************/
+/* インクルード                                                               */
+/******************************************************************************/
+/* 共通ヘッダ */
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+#include <hardware/IA32/IA32Paging.h>
+
+/* 外部モジュールヘッダ */
+#include <Cmn.h>
+#include <Debug.h>
+#include <MemMng.h>
+
+/* 内部モジュールヘッダ */
+
+
+/******************************************************************************/
+/* 定義                                                                       */
+/******************************************************************************/
+/* デバッグトレースログ出力マクロ */
+#ifdef DEBUG_LOG_ENABLE
+#define DEBUG_LOG( ... )                     \
+    DebugLogOutput( CMN_MODULE_MEMMNG_CTRL,  \
+                    __LINE__,                \
+                    __VA_ARGS__ )
+#else
+#define DEBUG_LOG( ... )
+#endif
+
+/* 物理マッピング用領域定義 */
+#define CTRL_MAP_ADDR1 ( 0x3F000000 )   /** 物理マッピング用領域1先頭アドレス */
+#define CTRL_MAP_ADDR2 ( 0x3F800000 )   /** 物理マッピング用領域2先頭アドレス */
+#define CTRL_MAP_SIZE  ( 0x01000000 )   /** 物理マッピング用領域全サイズ      */
+#define CTRL_MAP_SIZE1 ( 0x00800000 )   /** 物理マッピング用領域1サイズ       */
+#define CTRL_MAP_SIZE2 ( 0x00800000 )   /** 物理マッピング用領域2サイズ       */
+
+
+/******************************************************************************/
+/* グローバル関数定義                                                         */
+/******************************************************************************/
+/******************************************************************************/
+/**
+ * @brief       メモリコピー(仮想->物理)
+ * @details     仮想アドレス空間から物理アドレス空間へメモリコピーを行う。
+ * 
+ * @param[in]   pPAddr コピー先物理アドレス
+ * @param[in]   pVAddr コピー元仮想アドレス
+ * @param[in]   size   コピーサイズ
+ * 
+ * @attention   引数pPhysAddrは4KiBアライメントであること。
+ */
+/******************************************************************************/
+void MemMngCtrlCopyVirtToPhys( void   *pPAddr,
+                               void   *pVAddr,
+                               size_t size     )
+{
+    uint32_t dirId; /* ページディレクトリID */
+    uint32_t idx;   /* インデックス         */
+    size_t   count; /* コピーサイズ         */
+    
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() start.", __func__ );
+    DEBUG_LOG( " pPAddr=%010p, pVAddr=%010p, size=%#X",
+               pPAddr,
+               pVAddr,
+               size );
+    
+    /* ページディレクトリID取得 */
+    dirId = MemMngPageGetDirId();
+    
+    /* 物理マッピング用領域サイズ毎に繰り返し */
+    for ( idx = 0; idx < size; idx += CTRL_MAP_SIZE ) {
+        /* 次コピー有無判定 */
+        if ( ( size - idx ) > CTRL_MAP_SIZE ) {
+            /* 次コピー有 */
+            
+            /* コピーサイズ設定 */
+            count = CTRL_MAP_SIZE;
+            
+        } else {
+            /* 次コピー無 */
+            
+            /* コピーサイズ設定 */
+            count = size - idx;
+        }
+        
+        /* ページマッピング設定 */
+        MemMngPageSet( dirId,
+                       ( void * ) CTRL_MAP_ADDR1,
+                       pPAddr + idx,
+                       count,
+                       IA32_PAGING_G_NO,
+                       IA32_PAGING_US_SV,
+                       IA32_PAGING_RW_RW  );
+        
+        /* コピー */
+        memcpy( ( void * ) CTRL_MAP_ADDR1, pVAddr + idx, count );
+    }
+    
+    /* ページマッピング解除 */
+    MemMngPageUnset( dirId, ( void * ) CTRL_MAP_ADDR1, CTRL_MAP_SIZE );
+    
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() end.", __func__ );
+    
+    return;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief       メモリ設定
+ * @details     物理アドレス空間のメモリ領域に指定値を設定する。
+ * 
+ * @param[in]   pPAddr 設定先物理アドレス
+ * @param[in]   value  設定値
+ * @param[in]   size   サイズ
+ * 
+ * @attention   引数pPhysAddrは4KiBアライメントであること。
+ */
+/******************************************************************************/
+void MemMngCtrlSet( void    *pPAddr,
+                    uint8_t value,
+                    size_t  size     )
+{
+    uint32_t dirId; /* ページディレクトリID */
+    uint32_t idx;   /* インデックス         */
+    size_t   count; /* コピーサイズ         */
+    
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() start. pPAddr=%010p, value=%0#4X, size=%#X",
+               __func__,
+               pPAddr,
+               value,
+               size );
+    
+    /* ページディレクトリID取得 */
+    dirId = MemMngPageGetDirId();
+    
+    /* 物理マッピング用領域サイズ毎に繰り返し */
+    for ( idx = 0; idx < size; idx += CTRL_MAP_SIZE ) {
+        /* 次設定有無判定 */
+        if ( ( size - idx ) > CTRL_MAP_SIZE ) {
+            /* 次設定有 */
+            
+            /* サイズ設定 */
+            count = CTRL_MAP_SIZE;
+            
+        } else {
+            /* 次設定無 */
+            
+            /* サイズ設定 */
+            count = size - idx;
+        }
+        
+        /* ページマッピング設定 */
+        MemMngPageSet( dirId,
+                       ( void * ) CTRL_MAP_ADDR1,
+                       pPAddr + idx,
+                       count,
+                       IA32_PAGING_G_NO,
+                       IA32_PAGING_US_SV,
+                       IA32_PAGING_RW_RW  );
+        
+        /* メモリ設定 */
+        memset( ( void * ) CTRL_MAP_ADDR1, value, count );
+    }
+    
+    /* ページマッピング解除 */
+    MemMngPageUnset( dirId, ( void * ) CTRL_MAP_ADDR1, CTRL_MAP_SIZE );
+    
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() end.", __func__ );
+    
+    return;
+}
+
+
+/******************************************************************************/
index 5391cda..3a1dd0d 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/MemMng/MemMngInit.c                                             */
-/*                                                                 2017/03/11 */
+/*                                                                 2017/03/26 */
 /* Copyright (C) 2016-2017 Mochi.                                             */
 /******************************************************************************/
 /******************************************************************************/
@@ -16,6 +16,7 @@
 /* 内部モジュールヘッダ */
 #include "MemMngArea.h"
 #include "MemMngGdt.h"
+#include "MemMngPage.h"
 
 
 /******************************************************************************/
@@ -41,8 +42,8 @@
  * @details     GDT管理サブモジュールの初期化を呼び出し、メモリ管理機能を初期化
  *              する。
  * 
- * @param[in]   *pMap メモリマップ
- * @param[in]   size  メモリマップサイズ
+ * @param[in]   *pMap   メモリマップ
+ * @param[in]   mapSize メモリマップサイズ
  */
 /******************************************************************************/
 void MemMngInit( MochiKernelMemoryMap_t *pMap,
@@ -57,6 +58,9 @@ void MemMngInit( MochiKernelMemoryMap_t *pMap,
     /* メモリ領域管理サブモジュール初期化 */
     MemMngAreaInit( pMap, mapSize );
     
+    /* ページ管理サブモジュール初期化 */
+    MemMngPageInit();
+    
     /* デバッグトレースログ出力 */
     DEBUG_LOG( "%s() end.", __func__ );
     
diff --git a/src/kernel/MemMng/MemMngPage.c b/src/kernel/MemMng/MemMngPage.c
new file mode 100644 (file)
index 0000000..8a8c39a
--- /dev/null
@@ -0,0 +1,805 @@
+/******************************************************************************/
+/* src/kernel/MemMng/MemMngPage.c                                             */
+/*                                                                 2017/05/21 */
+/* Copyright (C) 2017 Mochi.                                                  */
+/******************************************************************************/
+/******************************************************************************/
+/* インクルード                                                               */
+/******************************************************************************/
+/* 共通ヘッダ */
+#include <stdarg.h>
+#include <string.h>
+#include <hardware/IA32/IA32.h>
+#include <hardware/IA32/IA32Instruction.h>
+#include <hardware/IA32/IA32Paging.h>
+#include <hardware/Vga/Vga.h>
+
+/* 外部モジュールヘッダ */
+#include <Cmn.h>
+#include <Debug.h>
+#include <MemMng.h>
+
+/* 内部モジュールヘッダ */
+
+
+/******************************************************************************/
+/* 定義                                                                       */
+/******************************************************************************/
+/* デバッグトレースログ出力マクロ */
+#ifdef DEBUG_LOG_ENABLE
+#define DEBUG_LOG( ... )                    \
+    DebugLogOutput( CMN_MODULE_MEMMNG_PAGE, \
+                    __LINE__,               \
+                    __VA_ARGS__ )
+#else
+#define DEBUG_LOG( ... )
+#endif
+
+/* テーブル使用フラグ */
+#define PAGE_UNUSED ( 0 )   /**< 未使用テーブル */
+#define PAGE_USED   ( 1 )   /**< 使用中テーブル */
+
+/** ページ管理テーブル構造体 */
+typedef struct {
+    uint32_t nowDirId;                      /**< 現ページディレクトリID       */
+    uint8_t  usedDir[ MEMMNG_PAGE_DIR_NUM ];/**< ページディレクトリ使用フラグ */
+    uint8_t  usedTbl[ MEMMNG_PAGE_TBL_NUM ];/**< ページテーブル使用フラグ     */
+} PageTbl_t;
+
+
+/******************************************************************************/
+/* 変数定義                                                                   */
+/******************************************************************************/
+/** ページ管理テーブル */
+static PageTbl_t gPageMngTbl;
+
+/** ページディレクトリ管理テーブル */
+static IA32PagingDir_t gPageDir[ MEMMNG_PAGE_DIR_NUM ];
+
+/** ページテーブル管理テーブル */
+static IA32PagingTbl_t gPageTbl[ MEMMNG_PAGE_TBL_NUM ];
+
+
+/******************************************************************************/
+/* ローカル関数プロトタイプ宣言                                               */
+/******************************************************************************/
+/* ページテーブル割当 */
+static uint32_t PageAllocTbl( void );
+
+/* ページテーブル解放 */
+static CmnRet_t PageFreeTbl( uint32_t id );
+
+/* 4KiBページマッピング */
+static CmnRet_t PageSet( uint32_t dirId,
+                         void     *pVAddr,
+                         void     *pPAddr,
+                         uint32_t attrGlobal,
+                         uint32_t attrUs,
+                         uint32_t attrRw      );
+
+/* ページマッピングデフォルト設定 */
+static CmnRet_t PageSetDefault( uint32_t dirId );
+
+/* 4KiBページマッピング解除 */
+static void PageUnset( uint32_t dirId,
+                       void     *pVAddr );
+
+
+/******************************************************************************/
+/* グローバル関数定義                                                         */
+/******************************************************************************/
+/******************************************************************************/
+/**
+ * @brief       ページディレクトリ割当
+ * @details     未使用のページディレクトリを割り当てる。
+ * 
+ * @retval      MEMMNG_PAGE_DIR_FULL以外 正常終了
+ * @retval      MEMMNG_PAGE_DIR_FULL     異常終了
+ */
+/******************************************************************************/
+uint32_t MemMngPageAllocDir( void )
+{
+    uint32_t id;    /* ページディレクトリID */
+    
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() start.", __func__ );
+    
+    /* 1ページディレクトリ毎に繰り返し */
+    for ( id = MEMMNG_PAGE_DIR_ID_MIN; id < MEMMNG_PAGE_DIR_NUM; id++ ) {
+        /* 使用中判定 */
+        if ( gPageMngTbl.usedDir[ id ] == PAGE_UNUSED ) {
+            /* 未使用 */
+            
+            /* ページディレクトリ初期化 */
+            memcpy( &gPageDir[ id ],
+                    &gPageDir[ MEMMNG_PAGE_DIR_ID_IDLE ],
+                    sizeof ( IA32PagingDir_t )            );
+            
+            /* ページ使用中設定 */
+            gPageMngTbl.usedDir[ id ] = PAGE_USED;
+            
+            break;
+        }
+    }
+    
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() end. ret=%u", __func__, id );
+    
+    return id;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief       ページディレクトリ解放
+ * @details     使用済みページディレクトリを解放する。
+ * 
+ * @param[in]   id ページディレクトリID
+ * 
+ * @retval      CMN_SUCCESS 正常終了
+ * @retval      CMN_FAILURE 異常終了
+ */
+/******************************************************************************/
+CmnRet_t MemMngPageFreeDir( uint32_t id )
+{
+    uint32_t idx;   /* インデックス */
+    
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() start. id=%u", __func__, id );
+    
+    /* 識別子チェック */
+    if ( id >= MEMMNG_PAGE_DIR_NUM ) {
+        /* 範囲異常 */
+        
+        /* デバッグトレースログ出力 */
+        DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+        
+        return CMN_FAILURE;
+    }
+    
+    /* 使用中判定 */
+    if ( gPageMngTbl.usedDir[ id ] == PAGE_UNUSED ) {
+        /* 未使用 */
+        
+        /* デバッグトレースログ出力 */
+        DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+        
+        return CMN_FAILURE;
+    }
+    
+    /* 1ページディレクトリエントリ毎に繰り返し */
+    for ( idx = 0; idx < IA32_PAGING_PDE_NUM; idx++ ) {
+        /* 存在フラグ判定 */
+        if ( gPageDir[ id ].entry[ idx ].attr_p == IA32_PAGING_P_YES ) {
+            /* 存在 */
+            
+            /* [TODO]ページテーブル解放 */
+        }
+    }
+    
+    /* ページテーブル初期化 */
+    memset( &gPageDir[ id ], 0, sizeof ( IA32PagingDir_t ) );
+    
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() end. ret=CMN_SUCCESS", __func__ );
+    
+    return CMN_SUCCESS;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief       ページディレクトリID取得
+ * @details     現在設定されているページディレクトリのIDを取得する。
+ * 
+ * @return      ページディレクトリID
+ */
+/******************************************************************************/
+uint32_t MemMngPageGetDirId( void )
+{
+    return gPageMngTbl.nowDirId;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief       ページディレクトリ切替
+ * @details     指定したページディレクトリをCPUに設定する。
+ * 
+ * @param[in]   id ページディレクトリID
+ */
+/******************************************************************************/
+void MemMngPageSwitchDir( uint32_t id )
+{
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() start. id=%u", __func__, id );
+    
+    /* CPU設定 */
+    IA32InstructionSetCr3( &gPageDir[ id ],
+                           IA32_PAGING_PCD_ENABLE,
+                           IA32_PAGING_PWT_WB      );
+    
+    /* 現ページディレクトリID設定 */
+    gPageMngTbl.nowDirId = id;
+    
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() end.", __func__ );
+    
+    return;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief       ページ管理初期化
+ * @details     ページ管理を初期化しページングを有効化する。
+ */
+/******************************************************************************/
+void MemMngPageInit( void )
+{
+    CmnRet_t ret;   /* 戻り値 */
+    
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() start.", __func__ );
+    
+    /* 初期化 */
+    ret = CMN_FAILURE;
+    
+    /* テーブル初期化 */
+    memset( &gPageMngTbl, 0, sizeof ( gPageMngTbl ) );
+    memset( gPageDir,     0, sizeof ( gPageDir    ) );
+    memset( gPageTbl,     0, sizeof ( gPageTbl    ) );
+    
+    /* アイドルプロセス用ページディレクトリ設定 */
+    gPageMngTbl.usedDir[ MEMMNG_PAGE_DIR_ID_IDLE ] = PAGE_USED;
+    
+    /* ページマッピングデフォルト設定 */
+    ret = PageSetDefault( MEMMNG_PAGE_DIR_ID_IDLE );
+    
+    /* 設定結果判定 */
+    if ( ret != CMN_SUCCESS ) {
+        /* 失敗 */
+        
+        /* [TODO] */
+    }
+    
+    /* ページディレクトリ設定 */
+    MemMngPageSwitchDir( MEMMNG_PAGE_DIR_ID_IDLE );
+    
+    /* ページング有効化 */
+    IA32InstructionSetCr0( IA32_CR0_PG, IA32_CR0_PG );
+    
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() end.", __func__ );
+    
+    return;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief       ページマッピング設定
+ * @details     物理メモリをページにマッピングする。
+ * 
+ * @param[in]   dirId      ページディレクトリID
+ * @param[in]   *pVAddr    仮想アドレス
+ * @param[in]   *pPAddr    物理アドレス
+ * @param[in]   size       サイズ
+ * @param[in]   attrGlobal グローバルページ属性
+ *                  - IA32_PAGING_G_NO  非グローバルページ
+ *                  - IA32_PAGING_G_YES グローバルページ
+ * @param[in]   attrUs     ユーザ/スーパバイザ属性
+ *                  - IA32_PAGING_US_SV   スーパバイザ
+ *                  - IA32_PAGING_US_USER ユーザ
+ * @param[in]   attrRw     読込/書込許可属性
+ *                  - IA32_PAGING_RW_R  読込専用
+ *                  - IA32_PAGING_RW_RW 読込/書込可
+ * 
+ * @retval      CMN_SUCCESS 正常終了
+ * @retval      CMN_FAILURE 異常終了
+ * 
+ * @attention   引数pVAddr、pPAddr、sizeは4KiBアライメントであること。
+ */
+/******************************************************************************/
+CmnRet_t MemMngPageSet( uint32_t dirId,
+                        void     *pVAddr,
+                        void     *pPAddr,
+                        size_t   size,
+                        uint32_t attrGlobal,
+                        uint32_t attrUs,
+                        uint32_t attrRw      )
+{
+    CmnRet_t ret;   /* 関数戻り値 */
+    
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() start.", __func__ );
+    DEBUG_LOG( " dirId=%u, pVAddr=%010p, pPAddr=%010p,",
+               dirId,
+               pVAddr,
+               pPAddr );
+    DEBUG_LOG( " size=%#x, attrGlobal=%u, attrUs=%u, attrRw=%u",
+               size,
+               attrGlobal,
+               attrUs,
+               attrRw );
+    
+    /* 初期化 */
+    ret = CMN_FAILURE;
+    
+    /* 使用中判定 */
+    if ( gPageMngTbl.usedDir[ dirId ] == PAGE_UNUSED ) {
+        /* 未使用 */
+        
+        /* デバッグトレースログ出力 */
+        DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+        
+        return CMN_FAILURE;
+    }
+    
+    /* 4KiB毎に繰り返し */
+    while ( size >= IA32_PAGING_PAGE_SIZE ) {
+        /* 4KiBページマッピング設定 */
+        ret = PageSet( dirId, pVAddr, pPAddr, attrGlobal, attrUs, attrRw );
+        
+        /* ページマッピング結果判定 */
+        if ( ret == CMN_FAILURE ) {
+            /* 失敗 */
+            
+            break;
+        }
+        
+        /* アドレス更新 */
+        pVAddr += IA32_PAGING_PAGE_SIZE;
+        pPAddr += IA32_PAGING_PAGE_SIZE;
+        
+        /* サイズ更新 */
+        size -= IA32_PAGING_PAGE_SIZE;
+    }
+    
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() end. ret=%d", __func__, ret );
+    
+    return ret;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief       ページマッピング設定
+ * @details     物理メモリとページのマッピングを解除する。
+ * 
+ * @param[in]   dirId  ページディレクトリID
+ * @param[in]   pVAddr 仮想アドレス
+ * @param[in]   size   サイズ
+ * 
+ * @attention   引数pVAddr、sizeは4KiBアライメントであること。
+ */
+/******************************************************************************/
+void MemMngPageUnset( uint32_t dirId,
+                      void     *pVAddr,
+                      size_t   size     )
+{
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() start.", __func__ );
+    DEBUG_LOG( " dirId=%u, pVAddr=%010p, size=%#X",
+               dirId,
+               pVAddr,
+               size );
+    
+    /* 使用中判定 */
+    if ( gPageMngTbl.usedDir[ dirId ] == PAGE_UNUSED ) {
+        /* 未使用 */
+        
+        /* デバッグトレースログ出力 */
+        DEBUG_LOG( "%s() end.", __func__ );
+        
+        return;
+    }
+    
+    /* 4KiB毎に繰り返し */
+    while ( size >= IA32_PAGING_PAGE_SIZE ) {
+        /* 4KiBページマッピング */
+        PageUnset( dirId, pVAddr );
+        
+        /* アドレス更新 */
+        pVAddr += IA32_PAGING_PAGE_SIZE;
+        
+        /* サイズ更新 */
+        size -= IA32_PAGING_PAGE_SIZE;
+    }
+    
+    
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() end.", __func__ );
+    
+    return;
+}
+
+
+/******************************************************************************/
+/* ローカル関数定義                                                           */
+/******************************************************************************/
+/******************************************************************************/
+/**
+ * @brief       ページテーブル割当
+ * @details     未使用のページテーブルを割り当てる。
+ * 
+ * @retval      MEMMNG_PAGE_TBL_FULL以外 正常終了
+ * @retval      MEMMNG_PAGE_TBL_FULL     異常終了
+ */
+/******************************************************************************/
+static uint32_t PageAllocTbl( void )
+{
+    uint32_t id;    /* ページテーブルID */
+    
+    /* デバッグトレースログ出力 *//*
+    DEBUG_LOG( "%s() start.", __func__ );*/
+    
+    /* 1ページテーブル毎に繰り返し */
+    for ( id = 0; id < MEMMNG_PAGE_TBL_NUM; id++ ) {
+        /* 使用中判定 */
+        if ( gPageMngTbl.usedTbl[ id ] == PAGE_UNUSED ) {
+            /* 未使用 */
+            
+            /* ページテーブル初期化 */
+            memset( &gPageTbl[ id ], 0, sizeof ( IA32PagingTbl_t ) );
+            
+            /* ページ使用中設定 */
+            gPageMngTbl.usedTbl[ id ] = PAGE_USED;
+            
+            break;
+        }
+    }
+    
+    /* デバッグトレースログ出力 *//*
+    DEBUG_LOG( "%s() end. ret=%u", __func__, id );*/
+    
+    return id;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief       ページテーブル解放
+ * @details     指定したページテーブルを解放する。
+ * 
+ * @param[in]   id ページテーブル識別子
+ * 
+ * @retval      CMN_SUCCESS 正常終了
+ * @retval      CMN_FAILURE 異常終了
+ */
+/******************************************************************************/
+static CmnRet_t PageFreeTbl( uint32_t id )
+{
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() start. id=%u", __func__, id );
+    
+    /* 識別子チェック */
+    if ( id >= MEMMNG_PAGE_TBL_NUM ) {
+        /* 範囲異常 */
+        
+        /* デバッグトレースログ出力 */
+        DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+        
+        return CMN_FAILURE;
+    }
+    
+    /* 使用中判定 */
+    if ( gPageMngTbl.usedTbl[ id ] == PAGE_UNUSED ) {
+        /* 未使用 */
+        
+        /* デバッグトレースログ出力 */
+        DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+        
+        return CMN_FAILURE;
+    }
+    
+    /* ページテーブル初期化 */
+    memset( &gPageTbl[ id ], 0, sizeof ( IA32PagingTbl_t ) );
+    
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() end. ret=CMN_SUCCESS", __func__ );
+    
+    return CMN_SUCCESS;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief       4KiBページマッピング設定
+ * @details     4KiBの物理メモリをページにマッピングする。
+ * 
+ * @param[in]   dirId      ページディレクトリID
+ * @param[in]   *pVAddr    仮想アドレス
+ * @param[in]   *pPAddr    物理アドレス
+ * @param[in]   attrGlobal グローバルページ属性
+ *                  - IA32_PAGING_G_NO  非グローバルページ
+ *                  - IA32_PAGING_G_YES グローバルページ
+ * @param[in]   attrUs     ユーザ/スーパバイザ属性
+ *                  - IA32_PAGING_US_SV   スーパバイザ
+ *                  - IA32_PAGING_US_USER ユーザ
+ * @param[in]   attrRw     読込/書込許可属性
+ *                  - IA32_PAGING_RW_R  読込専用
+ *                  - IA32_PAGING_RW_RW 読込/書込可
+ * 
+ * @retval      CMN_SUCCESS 正常終了
+ * @retval      CMN_FAILURE 異常終了
+ * 
+ * @attention   引数pVAddr、pPAddr、sizeは4KiBアライメントであること。
+ */
+/******************************************************************************/
+static CmnRet_t PageSet( uint32_t dirId,
+                         void     *pVAddr,
+                         void     *pPAddr,
+                         uint32_t attrGlobal,
+                         uint32_t attrUs,
+                         uint32_t attrRw      )
+{
+    uint32_t        pdeIdx; /* PDEインデックス      */
+    uint32_t        pteIdx; /* PTEインデックス      */
+    uint32_t        tblId;  /* ページテーブル識別子 */
+    IA32PagingPDE_t *pPde;  /* PDE参照              */
+    IA32PagingPTE_t *pPte;  /* PTE参照              */
+    
+    /* デバッグトレースログ出力 *//*
+    DEBUG_LOG( "%s() start.", __func__ );
+    DEBUG_LOG( " dirId=%u, pVAddr=%010p, pPAddr=%010p,",
+               dirId,
+               pVAddr,
+               pPAddr );
+    DEBUG_LOG( " attrGlobal=%u, attrUs=%u, attrRw=%u",
+               attrGlobal,
+               attrUs,
+               attrRw );*/
+    
+    /* 初期化 */
+    pdeIdx = IA32_PAGING_GET_PDE_IDX( pVAddr );         /* PDEインデックス */
+    pteIdx = IA32_PAGING_GET_PTE_IDX( pVAddr );         /* PTEインデックス */
+    pPde   = &( gPageDir[ dirId ].entry[ pdeIdx ] );    /* PDE参照         */
+    
+    /* ページテーブル存在チェック */
+    if ( pPde->attr_p == IA32_PAGING_P_NO ) {
+        /* 存在しない */
+        
+        /* ページテーブル割当 */
+        tblId = PageAllocTbl();
+        
+        /* 割当結果判定 */
+        if ( tblId == MEMMNG_PAGE_TBL_FULL ) {
+            /* 失敗 */
+            
+            /* デバッグトレースログ出力 */
+            DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+            
+            return CMN_FAILURE;
+        }
+        
+        /* PDE設定 */
+        memset( pPde, 0, sizeof ( IA32PagingPDE_t ) );
+        IA32_PAGING_SET_BASE( pPde, &gPageTbl[ tblId ] );
+        pPde->attr_g   = IA32_PAGING_G_NO;
+        pPde->attr_ps  = IA32_PAGING_PS_4K;
+        pPde->attr_a   = IA32_PAGING_A_NO;
+        pPde->attr_pcd = IA32_PAGING_PCD_ENABLE;
+        pPde->attr_pwt = IA32_PAGING_PWT_WB;
+        pPde->attr_us  = IA32_PAGING_US_USER;
+        pPde->attr_rw  = IA32_PAGING_RW_RW;
+        pPde->attr_p   = IA32_PAGING_P_YES;
+        
+        /* PTE参照変数設定 */
+        pPte = &( gPageTbl[ tblId ].entry[ pteIdx ] );
+        
+    } else {
+        /* 存在する */
+        
+        /* PTE参照変数設定 */
+        pPte = &( ( ( IA32PagingTbl_t * ) IA32_PAGING_GET_BASE( pPde ) )->
+                  entry[ pteIdx ] );
+    }
+    
+    /* PTE設定 */
+    memset( pPte, 0, sizeof ( IA32PagingPTE_t ) );
+    IA32_PAGING_SET_BASE( pPte, pPAddr );
+    pPte->attr_g   = attrGlobal;
+    pPte->attr_a   = IA32_PAGING_A_NO;
+    pPte->attr_pcd = IA32_PAGING_PCD_ENABLE;
+    pPte->attr_pwt = IA32_PAGING_PWT_WB;
+    pPte->attr_us  = attrUs;
+    pPte->attr_rw  = attrRw;
+    pPte->attr_p   = IA32_PAGING_P_YES;
+    
+    /* デバッグトレースログ出力 *//*
+    DEBUG_LOG( "%s() end. ret=CMN_SUCCESS", __func__ );*/
+    
+    return CMN_SUCCESS;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief       ページマッピングデフォルト設定
+ * @details     カーネル領域をページにマッピングする。
+ * 
+ * @param[in]   dirId ページディレクトリID
+ * 
+ * @retval      CMN_SUCCESS 正常終了
+ * @retval      CMN_FAILURE 異常終了
+ */
+/******************************************************************************/
+static CmnRet_t PageSetDefault( uint32_t dirId )
+{
+    CmnRet_t         ret;       /* 戻り値         */
+    MemMngAreaInfo_t areaInfo;  /* メモリ領域情報 */
+    
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() start. dirId=%u", __func__, dirId );
+    
+    /* 初期化 */
+    ret = CMN_FAILURE;
+    memset( &areaInfo, 0, sizeof ( MemMngAreaInfo_t ) );
+    
+    /* ページテーブル存在チェック */
+    if ( gPageMngTbl.usedDir[ dirId ] == PAGE_UNUSED ) {
+        /* 存在しない */
+        
+        /* デバッグトレースログ出力 */
+        DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+        
+        return CMN_FAILURE;
+    }
+    
+#ifdef DEBUG_LOG_ENABLE
+    /* デバッグ用VRAM領域マッピング */
+    ret = MemMngPageSet(
+              dirId,                            /* ページディレクトリID    */
+              ( void * ) VGA_M3_VRAM_ADDR,      /* 仮想アドレス            */
+              ( void * ) VGA_M3_VRAM_ADDR,      /* 物理アドレス            */
+              VGA_M3_VRAM_SIZE,                 /* サイズ                  */
+              IA32_PAGING_G_YES,                /* グローバルページ属性    */
+              IA32_PAGING_US_SV,                /* ユーザ/スーパバイザ属性 */
+              IA32_PAGING_RW_RW            );   /* 読込/書込許可属性       */
+    
+    /* マッピング結果判定 */
+    if ( ret != CMN_SUCCESS ) {
+        /* 失敗 */
+        
+        /* デバッグトレースログ出力 */
+        DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+        
+        return CMN_FAILURE;
+    }
+#endif
+    
+    /* カーネル領域情報取得 */
+    ret = MemMngAreaGetInfo( &areaInfo, MOCHIKERNEL_MEMORY_TYPE_KERNEL );
+    
+    /* 取得結果判定 */
+    if ( ret != CMN_SUCCESS ) {
+        /* 失敗 */
+        
+        /* デバッグトレースログ出力 */
+        DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+        
+        return CMN_FAILURE;
+    }
+    
+    /* カーネル領域マッピング */
+    ret = MemMngPageSet( dirId,                 /* ページディレクトリID    */
+                         areaInfo.pAddr,        /* 仮想アドレス            */
+                         areaInfo.pAddr,        /* 物理アドレス            */
+                         areaInfo.size,         /* サイズ                  */
+                         IA32_PAGING_G_YES,     /* グローバルページ属性    */
+                         IA32_PAGING_US_SV,     /* ユーザ/スーパバイザ属性 */
+                         IA32_PAGING_RW_RW  );  /* 読込/書込許可属性       */
+    
+    /* マッピング結果判定 */
+    if ( ret != CMN_SUCCESS ) {
+        /* 失敗 */
+        
+        /* デバッグトレースログ出力 */
+        DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+        
+        return CMN_FAILURE;
+    }
+    
+    return CMN_SUCCESS;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief       4KiBページマッピング解除
+ * @details     4KiB物理メモリのページマッピングを解除する。
+ * 
+ * @param[in]   dirId   ページディレクトリID
+ * @param[in]   *pVAddr 仮想アドレス
+ * 
+ * @attention   引数pVAddrは4KiBアライメントであること。
+ */
+/******************************************************************************/
+static void PageUnset( uint32_t dirId,
+                       void     *pVAddr )
+{
+    uint32_t        id;         /* ページテーブルID   */
+    uint32_t        pdeIdx;     /* PDEインデックス    */
+    uint32_t        pteIdx;     /* PTEインデックス    */
+    IA32PagingPDE_t *pPde;      /* PDE参照            */
+    IA32PagingPTE_t *pPte;      /* PTE参照            */
+    IA32PagingTbl_t *pPageTbl;  /* ページテーブル参照 */
+    
+    /* デバッグトレースログ出力 *//*
+    DEBUG_LOG( "%s() start. dirId=%u, pVAddr=%010p",
+               __func__,
+               dirId,
+               pVAddr );*/
+    
+    /* 初期化 */
+    pdeIdx   = IA32_PAGING_GET_PDE_IDX( pVAddr );
+    pteIdx   = IA32_PAGING_GET_PTE_IDX( pVAddr );
+    pPde     = &( gPageDir[ dirId ].entry[ pdeIdx ] );
+    pPageTbl = ( IA32PagingTbl_t * ) IA32_PAGING_GET_BASE( pPde );
+    pPte     = &( pPageTbl->entry[ pteIdx ] );
+    
+    /* ページテーブル存在チェック */
+    if ( pPde->attr_p == IA32_PAGING_P_NO ) {
+        /* 存在しない */
+        
+        /* デバッグトレースログ出力 *//*
+        DEBUG_LOG( "%s() end.", __func__ );*/
+        
+        return;
+    }
+    
+    /* ページ存在チェック */
+    if ( pPte->attr_p == IA32_PAGING_P_NO ) {
+        /* 存在しない */
+        
+        /* デバッグトレースログ出力 *//*
+        DEBUG_LOG( "%s() end.", __func__ );*/
+        
+        return;
+    }
+    
+    /* PTE初期化 */
+    memset( pPte, 0, sizeof ( IA32PagingPTE_t ) );
+    
+    /* ページテーブル内全エントリ繰り返し */
+    for ( pteIdx = 0; pteIdx < IA32_PAGING_PTE_NUM; pteIdx++ ) {
+        /* PTE参照変数設定 */
+        pPte = &( pPageTbl->entry[ pteIdx ] );
+        
+        /* 使用中判定 */
+        if ( pPte->attr_p == IA32_PAGING_P_YES ) {
+            /* 使用中 */
+            
+            /* デバッグトレースログ出力 *//*
+            DEBUG_LOG( "%s() end.", __func__ );*/
+            
+            return;
+        }
+    }
+    
+    /* 1ページテーブル毎に繰り返し */
+    for ( id = 0; id < MEMMNG_PAGE_TBL_NUM; id++ ) {
+        /* ページテーブルアドレス比較 */
+        if ( &gPageTbl[ id ] == pPageTbl ) {
+            /* 一致 */
+            
+            /* ページテーブル解放 */
+            PageFreeTbl( id );
+            
+            break;
+        }
+    }
+    
+    /* PDE初期化 */
+    memset( pPde, 0, sizeof ( IA32PagingPDE_t ) );
+    
+    /* デバッグトレースログ出力 *//*
+    DEBUG_LOG( "%s() end.", __func__ );*/
+    
+    return;
+}
+
+
+/******************************************************************************/
diff --git a/src/kernel/MemMng/MemMngPage.h b/src/kernel/MemMng/MemMngPage.h
new file mode 100644 (file)
index 0000000..d14461b
--- /dev/null
@@ -0,0 +1,16 @@
+/******************************************************************************/
+/* src/kernel/MemMng/MemMngPage.h                                             */
+/*                                                                 2017/03/26 */
+/* Copyright (C) 2017 Mochi.                                                  */
+/******************************************************************************/
+#ifndef MEMMNG_PAGE_H
+#define MEMMNG_PAGE_H
+/******************************************************************************/
+/* グローバル関数プロトタイプ宣言                                             */
+/******************************************************************************/
+/* ページ管理初期化 */
+extern void MemMngPageInit( void );
+
+
+/******************************************************************************/
+#endif
index 784fa07..e93c05c 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/ProcMng/ProcMngSched.c                                          */
-/*                                                                 2017/03/18 */
+/*                                                                 2017/05/19 */
 /* Copyright (C) 2017 Mochi.                                                  */
 /******************************************************************************/
 /******************************************************************************/
@@ -18,6 +18,7 @@
 /* 外部モジュールヘッダ */
 #include <Cmn.h>
 #include <Debug.h>
+#include <MemMng.h>
 
 /* 内部モジュールヘッダ */
 #include "ProcMngTask.h"
@@ -262,8 +263,13 @@ void ProcMngSchedExec( void )
     /* 実行中タスク情報切り替え */
     gSchedTbl.pRunningTaskInfo = pTaskInfo;
     
-    /* タスクスイッチ */
-    SchedSwitchTask( nowTaskId, pTaskInfo->taskId );
+    /* タスクID比較 */
+    if ( nowTaskId != pTaskInfo->taskId ) {
+        /* 別タスク */
+        
+        /* タスクスイッチ */
+        SchedSwitchTask( nowTaskId, pTaskInfo->taskId );
+    }
     
     /* デバッグトレースログ出力 */
     /*DEBUG_LOG( "%s() end.", __func__ );*/
@@ -446,11 +452,12 @@ static __attribute__ ( ( noinline ) )
     void SchedSwitchTask( uint32_t nowTaskId,
                           uint32_t nextTaskId )
 {
-    void                 *pKernelStack; /* カーネルスタック */
-    ProcMngTaskContext_t context;       /* コンテキスト     */
+    void                 *pKernelStack; /* カーネルスタック     */
+    uint32_t             pdId;          /* ページディレクトリID */
+    ProcMngTaskContext_t context;       /* コンテキスト         */
     
-    /* デバッグトレースログ出力 */
-    /*DEBUG_LOG( "%s() start. nowTaskId=%u, nextTaskId=%u",
+    /* デバッグトレースログ出力 *//*
+    DEBUG_LOG( "%s() start. nowTaskId=%u, nextTaskId=%u",
                __func__,
                nowTaskId,
                nextTaskId );*/
@@ -464,13 +471,19 @@ static __attribute__ ( ( noinline ) )
     context.ebp = IA32InstructionGetEbp();
     ProcMngTaskSetContext( nowTaskId, &context );
     
-    /* ã\82³ã\83³ã\83\86ã\82­ã\82¹ã\83\88復æ\97§ */
+    /* ã\82³ã\83³ã\83\86ã\82­ã\82¹ã\83\88å\8f\96å¾\97 */
     context = ProcMngTaskGetContext( nextTaskId );
     
     /* カーネルスタック設定 */
     pKernelStack = ProcMngTaskGetKernelStack( nextTaskId );
     ProcMngTssSetEsp0( ( uint32_t ) pKernelStack );
     
+    /* ページディレクトリID取得 */
+    pdId = ProcMngTaskGetPageDirId( nextTaskId );
+    
+    /* ページディレクトリ切替 */
+    MemMngPageSwitchDir( pdId );
+    
     /* タスクスイッチ */
     IA32InstructionSwitchTask( ( void * ) context.eip,
                                ( void * ) context.esp,
index ae5cec7..e5b7e36 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/ProcMng/ProcMngTask.c                                           */
-/*                                                                 2017/03/16 */
+/*                                                                 2017/04/16 */
 /* Copyright (C) 2017 Mochi.                                                  */
 /******************************************************************************/
 /******************************************************************************/
@@ -59,6 +59,7 @@ typedef struct {
     uint8_t              state;             /**< タスク状態               */
     uint8_t              reserved;          /**< パディング               */
     ProcMngTaskContext_t context;           /**< コンテキスト             */
+    uint32_t             pageDirId;         /**< ページディレクトリID     */
     void                 *pEntryPoint;      /**< エントリポイント         */
     taskStackInfo_t      kernelStackInfo;   /**< カーネルスタックアドレス */
     taskStackInfo_t      stackInfo;         /**< スタックアドレス         */
@@ -94,17 +95,19 @@ static taskTbl_t gTaskTbl[ PROCMNG_TASK_ID_NUM ];
 uint32_t ProcMngTaskAdd( uint8_t taskType,
                          void    *pEntryPoint )
 {
-    void            *pKernelStack; /* カーネルスタック */
-    void            *pStack;       /* スタック         */
-    int32_t         ret;           /* 関数戻り値       */
-    uint32_t        taskId;        /* タスクID         */
-    taskStackInfo_t *pStackInfo;   /* スタック情報     */
+    void            *pKernelStack;  /* カーネルスタック     */
+    void            *pStack;        /* スタック             */
+    int32_t         ret;            /* 関数戻り値           */
+    uint32_t        taskId;         /* タスクID             */
+    uint32_t        pageDirId;      /* ページディレクトリID */
+    taskStackInfo_t *pStackInfo;    /* スタック情報         */
     
     /* 初期化 */
     pKernelStack = NULL;
     pStack       = NULL;
     ret          = CMN_FAILURE;
     taskId       = PROCMNG_TASK_ID_MIN;
+    pageDirId    = MEMMNG_PAGE_DIR_FULL;
     pStackInfo   = NULL;
     
     /* デバッグトレースログ出力 */
@@ -119,6 +122,19 @@ uint32_t ProcMngTaskAdd( uint8_t taskType,
         if ( gTaskTbl[ taskId ].used == TASK_ID_UNUSED ) {
             /* 未使用 */
             
+            /* ページディレクトリ割当 */
+            pageDirId = MemMngPageAllocDir();
+            
+            /* ページディレクトリ割当結果判定 */
+            if ( pageDirId == MEMMNG_PAGE_DIR_FULL ) {
+                /* 失敗 */
+                
+                /* [TODO] */
+                /* 設定したタスクを初期化する処理。異常処理はちょっと後回し */
+                
+                return PROCMNG_TASK_ID_NULL;
+            }
+            
             /* カーネルスタック領域割り当て */
             pKernelStack = MemMngAreaAlloc( TASK_KERNEL_STACK_SIZE );
             
@@ -136,13 +152,31 @@ uint32_t ProcMngTaskAdd( uint8_t taskType,
                 return PROCMNG_TASK_ID_NULL;
             }
             
+            /* ページマッピング(仮) */
+            MemMngPageMap( pageDirId,
+                           pKernelStack,
+                           pKernelStack,
+                           TASK_KERNEL_STACK_SIZE,
+                           IA32_PAGING_G_NO,
+                           IA32_PAGING_US_SV,
+                           IA32_PAGING_RW_RW       );
+            MemMngPageMap( pageDirId,
+                           pStack,
+                           pStack,
+                           TASK_STACK_SIZE,
+                           IA32_PAGING_G_NO,
+                           IA32_PAGING_US_USER,
+                           IA32_PAGING_RW_RW    );
+            
             /* タスク基本設定 */
             gTaskTbl[ taskId ].used        = TASK_ID_USED;
             gTaskTbl[ taskId ].type        = taskType;
             gTaskTbl[ taskId ].state       = 0;
             gTaskTbl[ taskId ].context.eip = ( uint32_t ) ProcMngTaskStart;
-            gTaskTbl[ taskId ].context.esp = ( uint32_t ) pKernelStack + TASK_KERNEL_STACK_SIZE;
+            gTaskTbl[ taskId ].context.esp = ( uint32_t ) pKernelStack +
+                                             TASK_KERNEL_STACK_SIZE;
             gTaskTbl[ taskId ].pEntryPoint = pEntryPoint;
+            gTaskTbl[ taskId ].pageDirId   = pageDirId;
             
             /* カーネルスタック情報設定 */
             pStackInfo              = &( gTaskTbl[ taskId ].kernelStackInfo );
@@ -223,6 +257,25 @@ void *ProcMngTaskGetKernelStack( uint32_t taskId )
 
 /******************************************************************************/
 /**
+ * @brief       ページディレクトリID取得
+ * @details     指定したタスクIDのページディレクトリIDを取得する。
+ * 
+ * @param[in]   taskId タスクID
+ *                  - PROCMNG_TASK_ID_MIN タスクID最小値
+ *                  - PROCMNG_TASK_ID_MAX タスクID最大値
+ * 
+ * @return      ページディレクトリID
+ */
+/******************************************************************************/
+uint32_t ProcMngTaskGetPageDirId( uint32_t taskId )
+{
+    /* ページディレクトリID返却 */
+    return gTaskTbl[ taskId ].pageDirId;
+}
+
+
+/******************************************************************************/
+/**
  * @brief       タスクタイプ取得
  * @details     指定したタスクIDのタスクタイプを取得する。
  * 
@@ -257,7 +310,8 @@ void ProcMngTaskInit( void )
     memset( gTaskTbl, 0, sizeof ( gTaskTbl ) );
     
     /* アイドルタスク設定 */
-    gTaskTbl[ PROCMNG_TASK_ID_IDLE ].used = TASK_ID_USED;   /* 使用フラグ */
+    gTaskTbl[ PROCMNG_TASK_ID_IDLE ].used      = TASK_ID_USED;
+    gTaskTbl[ PROCMNG_TASK_ID_IDLE ].pageDirId = MEMMNG_PAGE_DIR_ID_IDLE;
     
     /* デバッグトレースログ出力 */
     DEBUG_LOG( "%s() end.", __func__ );
index 31f43f2..66a66b0 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/ProcMng/ProcMngTask.h                                           */
-/*                                                                 2017/03/18 */
+/*                                                                 2017/04/16 */
 /* Copyright (C) 2017 Mochi.                                                  */
 /******************************************************************************/
 #ifndef PROCMNG_TASK_H
@@ -35,6 +35,9 @@ extern ProcMngTaskContext_t ProcMngTaskGetContext( uint32_t taskId );
 /* カーネルスタックアドレス取得 */
 extern void *ProcMngTaskGetKernelStack( uint32_t taskId );
 
+/* ページディレクトリID取得 */
+extern uint32_t ProcMngTaskGetPageDirId( uint32_t taskId );
+
 /* タスクタイプ取得 */
 extern uint8_t ProcMngTaskGetType( uint32_t taskId );
 
index c74e2fa..7ff3263 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/include/Cmn.h                                                   */
-/*                                                                 2017/03/11 */
+/*                                                                 2017/05/16 */
 /* Copyright (C) 2017 Mochi.                                                  */
 /******************************************************************************/
 #ifndef CMN_H
@@ -23,6 +23,8 @@
 #define CMN_MODULE_MEMMNG_INIT   ( 0x0201 ) /**< メモリ管理(初期化)         */
 #define CMN_MODULE_MEMMNG_GDT    ( 0x0202 ) /**< メモリ管理(GDT管理)        */
 #define CMN_MODULE_MEMMNG_AREA   ( 0x0203 ) /**< メモリ管理(メモリ領域管理) */
+#define CMN_MODULE_MEMMNG_PAGE   ( 0x0204 ) /**< メモリ管理(ページ管理)     */
+#define CMN_MODULE_MEMMNG_CTRL   ( 0x0205 ) /**< メモリ管理(メモリ制御)     */
 #define CMN_MODULE_INTMNG_INIT   ( 0x0301 ) /**< 割込管理(初期化)           */
 #define CMN_MODULE_INTMNG_PIC    ( 0x0302 ) /**< 割込管理(PIC管理)          */
 #define CMN_MODULE_INTMNG_IDT    ( 0x0303 ) /**< 割込管理(IDT管理)          */
@@ -37,7 +39,7 @@
 #define CMN_MODULE_DEBUG_LOG     ( 0x0602 ) /**< デバッグ制御(ログ管理)     */
 
 /** モジュール・サブモジュール数 */
-#define CMN_MODULE_NUM           ( 16 )
+#define CMN_MODULE_NUM           ( 18 )
 
 /* 処理結果構造体 */
 typedef int32_t CmnRet_t;
index aa8d960..82df8e1 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/include/MemMng.h                                                */
-/*                                                                 2017/02/27 */
+/*                                                                 2017/05/24 */
 /* Copyright (C) 2016-2017 Mochi.                                             */
 /******************************************************************************/
 #ifndef MEMMNG_H
 
 /* 外部モジュールヘッダ */
 #include <Cmn.h>
+#include <ProcMng.h>
 
 
 /******************************************************************************/
 /* 定義                                                                       */
 /******************************************************************************/
 /* GDT定義 */
-#define MEMMNG_GDT_ENTRY_FULL  (  0 )           /**< GDTエントリ空き無し   */
-#define MEMMNG_GDT_ENTRY_MIN   (  1 )           /**< GDTエントリ番号最小値 */
-#define MEMMNG_GDT_ENTRY_MAX   (  9 )           /**< GDTエントリ番号最大値 */
+#define MEMMNG_GDT_ENTRY_FULL     (  0 )        /**< GDTエントリ空き無し   */
+#define MEMMNG_GDT_ENTRY_MIN      (  1 )        /**< GDTエントリ番号最小値 */
+#define MEMMNG_GDT_ENTRY_MAX      (  9 )        /**< GDTエントリ番号最大値 */
 #define MEMMNG_GDT_ENTRY_NUM   \
     ( MEMMNG_GDT_ENTRY_MAX + 1 )                /**< GDTエントリ数         */
 
 #define MEMMNG_SEGSEL_USER_CODE   ( 7 * 8 + 3 ) /**< ユーザコードセグメント   */
 #define MEMMNG_SEGSEL_USER_DATA   ( 8 * 8 + 3 ) /**< ユーザデータセグメント   */
 
+/** ページディレクトリID */
+#define MEMMNG_PAGE_DIR_ID_IDLE   ( 0 )         /**< アイドルプロセス用PDID */
+#define MEMMNG_PAGE_DIR_ID_MIN    ( 1 )         /**< PDID最小値             */
+
+/* ページディレクトリ定義 */
+#define MEMMNG_PAGE_DIR_NUM       PROCMNG_TASK_ID_NUM   /** PD管理数   */
+#define MEMMNG_PAGE_DIR_FULL      MEMMNG_PAGE_DIR_NUM   /** PD空き無し */
+
+/* ページテーブル定義 */
+#define MEMMNG_PAGE_TBL_NUM       ( 4096 )              /** PT管理数   */
+#define MEMMNG_PAGE_TBL_FULL      MEMMNG_PAGE_TBL_NUM   /** PT空き無し */
+
+/** メモリ領域情報 */
+typedef struct {
+    void   *pAddr;      /**< 先頭アドレス */
+    size_t size;        /**< メモリサイズ */
+} MemMngAreaInfo_t;
+
 
 /******************************************************************************/
 /* グローバル関数宣言                                                         */
@@ -50,6 +69,10 @@ extern void *MemMngAreaAlloc( size_t size );
 /* メモリ領域解放 */
 extern CmnRet_t MemMngAreaFree( void *pAddr );
 
+/* メモリ領域情報取得 */
+extern CmnRet_t MemMngAreaGetInfo( MemMngAreaInfo_t *pInfo,
+                                   uint32_t         type    );
+
 
 /*-------------*/
 /* MemMngGdt.c */
@@ -72,5 +95,49 @@ extern void MemMngInit( MochiKernelMemoryMap_t *pMap,
                         size_t                 mapSize );
 
 
+/*--------------*/
+/* MemMngPage.c */
+/*--------------*/
+/* ページディレクトリ割当 */
+extern uint32_t MemMngPageAllocDir( void );
+
+/* ページディレクトリ解放 */
+extern CmnRet_t MemMngPageFreeDir( uint32_t id );
+
+/* ページディレクトリID取得 */
+extern uint32_t MemMngPageGetDirId( void );
+
+/* ページディレクトリ切替 */
+extern void MemMngPageSwitchDir( uint32_t id );
+
+/* ページマッピング設定 */
+extern CmnRet_t MemMngPageSet( uint32_t dirId,
+                               void     *pVAddr,
+                               void     *pPAddr,
+                               size_t   size,
+                               uint32_t attrGlobal,
+                               uint32_t attrUs,
+                               uint32_t attrRw      );
+
+/* ページマッピング解除 */
+extern void MemMngPageUnset( uint32_t dirId,
+                             void     *pVAddr,
+                             size_t   size     );
+
+
+/*--------------*/
+/* MemMngCtrl.c */
+/*--------------*/
+/* メモリコピー(仮想->物理) */
+extern void MemMngCtrlCopyVirtToPhys( void   *pPAddr,
+                                      void   *pVAddr,
+                                      size_t size     );
+
+/* メモリ設定 */
+extern void MemMngCtrlSet( void    *pPAddr,
+                           uint8_t value,
+                           size_t  size     );
+
+
 /******************************************************************************/
 #endif
index d079d68..1cec98e 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/include/hardware/IA32/IA32.h                                    */
-/*                                                                 2017/01/15 */
+/*                                                                 2017/03/31 */
 /* Copyright (C) 2016-2017 Mochi.                                             */
 /******************************************************************************/
 #ifndef IA32_H
 #define IA32_EFLAGS_RESERVED       ( 0x00000002 )
 #define IA32_EFLAGS_CF             ( 0x00000001 )
 
+/* CR0システムフラグ */
+#define IA32_CR0_PG ( 0x80000000 )  /** ページング               */
+#define IA32_CR0_CD ( 0x40000000 )  /** キャッシュディスエーブル */
+#define IA32_CR0_NW ( 0x20000000 )  /** ノットライトスルー       */
+#define IA32_CR0_AM ( 0x00040000 )  /** アライメントマスク       */
+#define IA32_CR0_WP ( 0x00010000 )  /** 書込み保護               */
+#define IA32_CR0_NE ( 0x00000020 )  /** 数値演算エラー           */
+#define IA32_CR0_ET ( 0x00000010 )  /** 拡張タイプ               */
+#define IA32_CR0_TS ( 0x00000008 )  /** タスクスイッチ           */
+#define IA32_CR0_EM ( 0x00000004 )  /** エミュレーション         */
+#define IA32_CR0_MP ( 0x00000002 )  /** モニタコプロセッサ       */
+#define IA32_CR0_PE ( 0x00000001 )  /** 保護イネーブル           */
+
 
 /******************************************************************************/
 #endif
index 17a2405..d482ee6 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/include/hardware/IA32/IA32Instruction.h                         */
-/*                                                                 2017/03/18 */
+/*                                                                 2017/03/30 */
 /* Copyright (C) 2016-2017 Mochi.                                             */
 /******************************************************************************/
 #ifndef IA32_INSTRUCTION_H
@@ -10,6 +10,7 @@
 /******************************************************************************/
 #include <stdint.h>
 #include "IA32Descriptor.h"
+#include "IA32Paging.h"
 
 
 /******************************************************************************/
@@ -365,9 +366,7 @@ static inline void IA32InstructionPop( uint32_t *pValue )
 {
     /* pop命令実行 */
     __asm__ __volatile__ ( "pop %0"
-                           : "=a" ( *pValue )
-                           :
-                           :                  );
+                           : "=a" ( *pValue ) );
     
     return;
 }
@@ -584,6 +583,7 @@ static inline void IA32InstructionPushFs( void )
 }
 
 
+
 /******************************************************************************/
 /**
  * @brief       push(gs)命令実行
@@ -603,6 +603,101 @@ static inline void IA32InstructionPushGs( void )
 
 /******************************************************************************/
 /**
+ * @brief       cr0レジスタ設定
+ * @details     cr0レジスタにシステム制御フラグを設定する。
+ * 
+ * @param[in]   cr0  システム制御フラグ
+ *                  - IA32_CR0_PG ページング
+ *                  - IA32_CR0_CD キャッシュディスエーブル
+ *                  - IA32_CR0_NW ノットライトスルー
+ *                  - IA32_CR0_AM アライメントマスク
+ *                  - IA32_CR0_WP 書込み保護
+ *                  - IA32_CR0_NE 数値演算エラー
+ *                  - IA32_CR0_ET 拡張タイプ
+ *                  - IA32_CR0_TS タスクスイッチ
+ *                  - IA32_CR0_EM エミュレーション
+ *                  - IA32_CR0_MP モニタコプロセッサ
+ *                  - IA32_CR0_PE 保護イネーブル
+ * @param[in]   mask 設定マスク
+ *                  - IA32_CR0_PG ページング
+ *                  - IA32_CR0_CD キャッシュディスエーブル
+ *                  - IA32_CR0_NW ノットライトスルー
+ *                  - IA32_CR0_AM アライメントマスク
+ *                  - IA32_CR0_WP 書込み保護
+ *                  - IA32_CR0_NE 数値演算エラー
+ *                  - IA32_CR0_ET 拡張タイプ
+ *                  - IA32_CR0_TS タスクスイッチ
+ *                  - IA32_CR0_EM エミュレーション
+ *                  - IA32_CR0_MP モニタコプロセッサ
+ *                  - IA32_CR0_PE 保護イネーブル
+ */
+/******************************************************************************/
+static inline void IA32InstructionSetCr0( uint32_t cr0,
+                                          uint32_t mask )
+{
+    /* 初期化 */
+    cr0  = cr0 & mask;
+    mask = ~mask;
+    
+    /* cr0レジスタ取得 */
+    __asm__ __volatile__ ( "mov eax, cr0"
+                           :
+                           :
+                           : "eax"        );
+    
+    /* システム制御フラグ設定 */
+    __asm__ __volatile__ ( "and eax, %0;"
+                           "or  eax, %1"
+                           :
+                           : "r" ( mask ), "r" ( cr0 )
+                           : "eax"                     );
+    
+    /* cr0レジスタ設定 */
+    __asm__ __volatile__ ( "mov cr0, eax"
+                           :
+                           :
+                           : "eax"        );
+    
+    return;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief       cr3レジスタ設定
+ * @details     cr3レジスタにページディレクトリのベースアドレスを設定する。
+ * 
+ * @param[in]   *pBase  ベースアドレス
+ * @param[in]   attrPcd ページレベルキャッシュディスエーブルフラグ
+ *                  - IA32_PAGING_PCD_ENABLE  キャッシング有効
+ *                  - IA32_PAGING_PCD_DISABLE キャッシング無効
+ * @param[in]   attrPwt ページレベルライトスルーフラグ
+ *                  - IA32_PAGING_PWT_WB ライトバックキャッシング
+ *                  - IA32_PAGING_PWT_WT ライトスルーキャッシング
+ */
+/******************************************************************************/
+static inline void IA32InstructionSetCr3( void     *pBase,
+                                          uint32_t attrPcd,
+                                          uint32_t attrPwt  )
+{
+    IA32PagingPDBR_t pdbr;  /* 設定値 */
+    
+    /* 値設定 */
+    *( ( uint32_t * ) &pdbr ) = ( ( uint32_t ) pBase ) & 0xFFFFF000;
+    pdbr.attr_pcd             = attrPcd;
+    pdbr.attr_pwt             = attrPwt;
+    
+    /* cr3レジスタ設定 */
+    __asm__ __volatile__ ( "mov cr3, %0"
+                           :
+                           : "a" ( pdbr ) );
+    
+    return;
+}
+
+
+/******************************************************************************/
+/**
  * @brief       espレジスタ設定
  * @details     指定した値をespレジスタに設定する。
  * 
diff --git a/src/kernel/include/hardware/IA32/IA32Paging.h b/src/kernel/include/hardware/IA32/IA32Paging.h
new file mode 100644 (file)
index 0000000..60665a6
--- /dev/null
@@ -0,0 +1,127 @@
+/******************************************************************************/
+/* src/kernel/include/hardware/IA32/IA32Paging.h                              */
+/*                                                                 2017/03/30 */
+/* Copyright (C) 2017 Mochi.                                                  */
+/******************************************************************************/
+#ifndef IA32_PAGING_H
+#define IA32_PAGING_H
+/******************************************************************************/
+/* インクルード                                                               */
+/******************************************************************************/
+#include <stdint.h>
+
+
+/******************************************************************************/
+/* 定義                                                                       */
+/******************************************************************************/
+/** ページディレクトリエントリインデックス取得マクロ */
+#define IA32_PAGING_GET_PDE_IDX( _PADDR ) \
+    ( ( ( ( uint32_t ) ( _PADDR ) ) >> 22 ) & 0x3FF )
+/** ページテーブルエントリインデックス取得マクロ */
+#define IA32_PAGING_GET_PTE_IDX( _PADDR ) \
+    ( ( ( ( uint32_t ) ( _PADDR ) ) >> 12 ) & 0x3FF )
+
+/** ページテーブル・ページベースアドレス設定マクロ */
+#define IA32_PAGING_SET_BASE( _PENTRY, _PBASE )              \
+    ( *( ( uint32_t * ) ( _PENTRY ) ) =                      \
+        (  ( ( uint32_t   ) ( _PBASE  ) ) & 0xFFFFF000 ) |   \
+        ( *( ( uint32_t * ) ( _PENTRY ) ) & 0x00000FFF )   )
+/** ページテーブル・ページベースアドレス取得マクロ */
+#define IA32_PAGING_GET_BASE( _PENTRY ) \
+    ( ( void * ) ( *( ( uint32_t * ) ( _PENTRY ) ) & 0xFFFFF000 ) )
+
+/* ページテーブル・ページ存在フラグ */
+#define IA32_PAGING_P_NO        ( 0 )       /** ページテーブル・ページ無し */
+#define IA32_PAGING_P_YES       ( 1 )       /** ページテーブル・ページ有り */
+
+/* 読込/書込フラグ */
+#define IA32_PAGING_RW_R        ( 0 )       /** 読込専用ページ    */
+#define IA32_PAGING_RW_RW       ( 1 )       /** 読込/書込可ページ */
+
+/* ユーザ/スーパバイザフラグ */
+#define IA32_PAGING_US_SV       ( 0 )       /** スーパバイザ特権レベル */
+#define IA32_PAGING_US_USER     ( 1 )       /** ユーザ特権レベル       */
+
+/* ページレベルライトスルーフラグ */
+#define IA32_PAGING_PWT_WB      ( 0 )       /** ライトバックキャッシング */
+#define IA32_PAGING_PWT_WT      ( 1 )       /** ライトスルーキャッシング */
+
+/* ページレベルキャッシュディスエーブルフラグ */
+#define IA32_PAGING_PCD_ENABLE  ( 0 )       /** キャッシング有効 */
+#define IA32_PAGING_PCD_DISABLE ( 1 )       /** キャッシング無効 */
+
+/* アクセス済みフラグ */
+#define IA32_PAGING_A_NO        ( 0 )       /** 未アクセス   */
+#define IA32_PAGING_A_YES       ( 1 )       /** アクセス済み */
+
+/* ダーティフラグ */
+#define IA32_PAGING_D_NO        ( 0 )       /** 未書込み   */
+#define IA32_PAGING_D_YES       ( 1 )       /** 書込み済み */
+
+/* ページサイズフラグ */
+#define IA32_PAGING_PS_4K       ( 0 )       /** 4KiBページサイズ           */
+#define IA32_PAGING_PS_4M2M     ( 1 )       /** 4MiBまたは2MiBページサイズ */
+
+/* グローバルフラグ */
+#define IA32_PAGING_G_NO        ( 0 )       /** 非グローバルページ */
+#define IA32_PAGING_G_YES       ( 1 )       /** グローバルページ   */
+
+/* エントリ数 */
+#define IA32_PAGING_PDE_NUM     ( 1024 )    /** ページディレクトリエントリ数 */
+#define IA32_PAGING_PTE_NUM     ( 1024 )    /** ページテーブルエントリ数     */
+
+/** ページサイズ */
+#define IA32_PAGING_PAGE_SIZE   ( 4096 )
+
+/** PDBR */
+typedef struct {
+    uint32_t reserved2:3;   /**< 予約済み                                   */
+    uint32_t attr_pwt:1;    /**< ページレベルライトスルーフラグ             */
+    uint32_t attr_pcd:1;    /**< ページレベルキャッシュディスエーブルフラグ */
+    uint32_t reserved1:7;   /**< 予約済み                                   */
+    uint32_t base     :20;  /**< ページディレクトリベースアドレス           */
+} IA32PagingPDBR_t;
+
+/** ページディレクトリエントリ */
+typedef struct {
+    uint32_t attr_p  :1;    /**< 存在フラグ                                 */
+    uint32_t attr_rw :1;    /**< 読込/書込フラグ                            */
+    uint32_t attr_us :1;    /**< ユーザ/スーパバイザフラグ                  */
+    uint32_t attr_pwt:1;    /**< ページレベルライトスルーフラグ             */
+    uint32_t attr_pcd:1;    /**< ページレベルキャッシュディスエーブルフラグ */
+    uint32_t attr_a  :1;    /**< アクセス済みフラグ                         */
+    uint32_t reserved:1;    /**< 予約済                                     */
+    uint32_t attr_ps :1;    /**< ページサイズフラグ                         */
+    uint32_t attr_g  :1;    /**< グローバルページ                           */
+    uint32_t attr_avl:3;    /**< 未使用                                     */
+    uint32_t base    :20;   /**< ページテーブルベースアドレス               */
+} IA32PagingPDE_t;
+
+/** ページディレクトリ */
+typedef struct {
+    IA32PagingPDE_t entry[ IA32_PAGING_PDE_NUM ];   /**< エントリ */
+} __attribute__( ( aligned( 4096 ) ) ) IA32PagingDir_t;
+
+/** ページテーブルエントリ */
+typedef struct {
+    uint32_t attr_p  :1;    /**< 存在フラグ                                 */
+    uint32_t attr_rw :1;    /**< 読込/書込フラグ                            */
+    uint32_t attr_us :1;    /**< ユーザ/スーパバイザフラグ                  */
+    uint32_t attr_pwt:1;    /**< ページレベルライトスルーフラグ             */
+    uint32_t attr_pcd:1;    /**< ページレベルキャッシュディスエーブルフラグ */
+    uint32_t attr_a  :1;    /**< アクセス済みフラグ                         */
+    uint32_t attr_d  :1;    /**< ダーティフラグ                             */
+    uint32_t attr_pat:1;    /**< ページ属性テーブルインデックスフラグ       */
+    uint32_t attr_g  :1;    /**< グローバルフラグ                           */
+    uint32_t attr_avl:3;    /**< 未使用                                     */
+    uint32_t base    :20;   /**< ページベースアドレス                       */
+} IA32PagingPTE_t;
+
+/** ページテーブル */
+typedef struct {
+    IA32PagingPTE_t entry[ IA32_PAGING_PTE_NUM ];   /**< エントリ */
+} __attribute__( ( aligned( 4096 ) ) ) IA32PagingTbl_t;
+
+
+/******************************************************************************/
+#endif
diff --git a/src/kernel/include/hardware/Vga/Vga.h b/src/kernel/include/hardware/Vga/Vga.h
new file mode 100644 (file)
index 0000000..757c1d1
--- /dev/null
@@ -0,0 +1,44 @@
+/******************************************************************************/
+/* src/kernel/include/hardware/Vga/Vga.h                                      */
+/*                                                                 2017/05/21 */
+/* Copyright (C) 2017 Mochi.                                                  */
+/******************************************************************************/
+#ifndef VGA_H
+#define VGA_H
+/******************************************************************************/
+/* 定義                                                                       */
+/******************************************************************************/
+/*------------------------------------*/
+/* ビデオモード0x03(テキストモード) */
+/*------------------------------------*/
+/* VRAM */
+#define VGA_M3_VRAM_ADDR      ( 0x000B8000 )/** VRAM先頭アドレス */
+#define VGA_M3_VRAM_SIZE      ( 0x00008000 )/** VRAM領域サイズ   */
+
+/* 画面文字数 */
+#define VGA_M3_COLUMN         ( 80 )        /** 最大列数 */
+#define VGA_M3_ROW            ( 25 )        /** 最大行数 */
+
+/* 文字属性 */
+#define VGA_M3_ATTR_FG_BLACK  ( 0x00 )      /** 黒色文字属性 */
+#define VGA_M3_ATTR_FG_BLUE   ( 0x01 )      /** 青色文字属性 */
+#define VGA_M3_ATTR_FG_GREEN  ( 0x02 )      /** 緑色文字属性 */
+#define VGA_M3_ATTR_FG_CYAN   ( 0x03 )      /** 水色文字属性 */
+#define VGA_M3_ATTR_FG_RED    ( 0x04 )      /** 赤色文字属性 */
+#define VGA_M3_ATTR_FG_PURPLE ( 0x05 )      /** 紫色文字属性 */
+#define VGA_M3_ATTR_FG_BROWN  ( 0x06 )      /** 茶色文字属性 */
+#define VGA_M3_ATTR_FG_WHITE  ( 0x07 )      /** 白色文字属性 */
+#define VGA_M3_ATTR_FG_BRIGHT ( 0x08 )      /** 明色文字属性 */
+#define VGA_M3_ATTR_BG_BLACK  ( 0x00 )      /** 黒色背景属性 */
+#define VGA_M3_ATTR_BG_BLUE   ( 0x10 )      /** 青色背景属性 */
+#define VGA_M3_ATTR_BG_GREEN  ( 0x20 )      /** 緑色背景属性 */
+#define VGA_M3_ATTR_BG_CYAN   ( 0x30 )      /** 水色背景属性 */
+#define VGA_M3_ATTR_BG_RED    ( 0x40 )      /** 赤色背景属性 */
+#define VGA_M3_ATTR_BG_PURPLE ( 0x50 )      /** 紫色背景属性 */
+#define VGA_M3_ATTR_BG_BROWN  ( 0x60 )      /** 茶色背景属性 */
+#define VGA_M3_ATTR_BG_WHITE  ( 0x70 )      /** 白色背景属性 */
+#define VGA_M3_ATTR_BLINK     ( 0x80 )      /** 点滅文字属性 */
+
+
+/******************************************************************************/
+#endif
index 29a1bce..580ba7d 100644 (file)
@@ -1,6 +1,6 @@
 #******************************************************************************#\r
 #* vm/vmware/mochi.vmx                                                        *#\r
-#*                                                                 2017/03/11 *#\r
+#*                                                                 2017/04/06 *#\r
 #* Copyright (C) 2016-2017 Mochi.                                             *#\r
 #******************************************************************************#\r
 # VMware基本設定\r
@@ -13,7 +13,7 @@ displayName = "Mochi"
 gui.exitOnCLIHLT = "FALSE"\r
 \r
 # メモリサイズ (MB)\r
-memsize = "64"\r
+memsize = "128"\r
 \r
 # IDE\r
 ide0:0.present = "TRUE"\r