mov ss, ax
/* スタックポインタ変更 */
- mov esp, 0x03000000
+ mov esp, 0x04000000
/* カーネル実行 */
jmp 0x00100000
/******************************************************************************/
/* 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 {
/******************************************************************************/
/* src/kernel/Debug/DebugLog.c */
-/* 2017/03/23 */
+/* 2017/05/24 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
/* 外部モジュールヘッダ */
#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 ) /* 符号表示 */
{ 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管理) */
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;
}
* - 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管理)
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; /* 黒色背景属性 */
}
}
uint8_t *pCursor; /* カーソル */
/* カーソル列チェック */
- if ( gLogTbl.column >= LOG_LENGTH_COLUMN ) {
+ if ( gLogTbl.column >= VGA_M3_COLUMN ) {
/* 行数超 */
return;
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 ) );
tmp = value;
/* 最小フィールド幅範囲チェック */
- if ( ( width < 0 ) && ( LOG_LENGTH_COLUMN <= width ) ) {
+ if ( ( width < 0 ) && ( VGA_M3_COLUMN <= width ) ) {
/* 0未満、LOG_LENGTH_COLUMN超過 */
/* 最小フィールド幅初期化 */
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;
/* 反転 */
/* 反転 */
- 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;
/* 黒色文字 */
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:
/* 標準色文字 */
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:
/******************************************************************************/
/* 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();
DEBUG_LOG( "Mochi Kernel start!!!" );
/* メモリ管理モジュール初期化 */
- MemMngInit( &map, 1 );
+ MemMngInit( map, 2 );
/* プロセス管理モジュール初期化 */
ProcMngInit();
uint8_t type,
uint8_t level )
{
- /* デバッグトレースログ出力 */
+ /* デバッグトレースログ出力 *//*
DEBUG_LOG( "%s() start. index=%#x, selector=%u, ",
__func__,
index,
pOffset,
count,
type,
- level );
+ level );*/
/* ディスクリプタ設定 */
gIdt[ index ].offset_low = IA32_DESCRIPTOR_OFFSET_LOW( pOffset );
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;
}
/******************************************************************************/
/* src/kernel/IntMng/IntMngInit.c */
-/* 2017/03/11 */
+/* 2017/05/19 */
/* Copyright (C) 2016-2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
IntMngPicInit();
/* デバッグトレースログ出力 */
- DEBUG_LOG( "%s() start.", __func__ );
+ DEBUG_LOG( "%s() end.", __func__ );
return;
}
#******************************************************************************#
#* src/kernel/Makefile *#
-#* 2017/03/11 *#
+#* 2017/05/18 *#
#* Copyright (C) 2016-2017 Mochi. *#
#******************************************************************************#
#******************************************************************************#
MemMng/MemMngInit.c \
MemMng/MemMngGdt.c \
MemMng/MemMngArea.c \
+ MemMng/MemMngPage.c \
+ MemMng/MemMngCtrl.c \
IntMng/IntMngInit.c \
IntMng/IntMngIdt.c \
IntMng/IntMngHdl.c \
/******************************************************************************/
/* src/kernel/MemMng/MemMngArea.c */
-/* 2017/03/12 */
+/* 2017/05/24 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
/* 外部モジュールヘッダ */
#include <Cmn.h>
#include <Debug.h>
+#include <MemMng.h>
/* 内部モジュールヘッダ */
/******************************************************************************/
/**
+ * @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 指定したメモリアドレスが先頭アドレスのメモリ領域を解放する。
*
--- /dev/null
+/******************************************************************************/
+/* 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;
+}
+
+
+/******************************************************************************/
/******************************************************************************/
/* src/kernel/MemMng/MemMngInit.c */
-/* 2017/03/11 */
+/* 2017/03/26 */
/* Copyright (C) 2016-2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
/* 内部モジュールヘッダ */
#include "MemMngArea.h"
#include "MemMngGdt.h"
+#include "MemMngPage.h"
/******************************************************************************/
* @details GDT管理サブモジュールの初期化を呼び出し、メモリ管理機能を初期化
* する。
*
- * @param[in] *pMap メモリマップ
- * @param[in] size メモリマップサイズ
+ * @param[in] *pMap メモリマップ
+ * @param[in] mapSize メモリマップサイズ
*/
/******************************************************************************/
void MemMngInit( MochiKernelMemoryMap_t *pMap,
/* メモリ領域管理サブモジュール初期化 */
MemMngAreaInit( pMap, mapSize );
+ /* ページ管理サブモジュール初期化 */
+ MemMngPageInit();
+
/* デバッグトレースログ出力 */
DEBUG_LOG( "%s() end.", __func__ );
--- /dev/null
+/******************************************************************************/
+/* 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;
+}
+
+
+/******************************************************************************/
--- /dev/null
+/******************************************************************************/
+/* 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
/******************************************************************************/
/* src/kernel/ProcMng/ProcMngSched.c */
-/* 2017/03/18 */
+/* 2017/05/19 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
/* 外部モジュールヘッダ */
#include <Cmn.h>
#include <Debug.h>
+#include <MemMng.h>
/* 内部モジュールヘッダ */
#include "ProcMngTask.h"
/* 実行中タスク情報切り替え */
gSchedTbl.pRunningTaskInfo = pTaskInfo;
- /* タスクスイッチ */
- SchedSwitchTask( nowTaskId, pTaskInfo->taskId );
+ /* タスクID比較 */
+ if ( nowTaskId != pTaskInfo->taskId ) {
+ /* 別タスク */
+
+ /* タスクスイッチ */
+ SchedSwitchTask( nowTaskId, pTaskInfo->taskId );
+ }
/* デバッグトレースログ出力 */
/*DEBUG_LOG( "%s() end.", __func__ );*/
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 );*/
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,
/******************************************************************************/
/* src/kernel/ProcMng/ProcMngTask.c */
-/* 2017/03/16 */
+/* 2017/04/16 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
uint8_t state; /**< タスク状態 */
uint8_t reserved; /**< パディング */
ProcMngTaskContext_t context; /**< コンテキスト */
+ uint32_t pageDirId; /**< ページディレクトリID */
void *pEntryPoint; /**< エントリポイント */
taskStackInfo_t kernelStackInfo; /**< カーネルスタックアドレス */
taskStackInfo_t stackInfo; /**< スタックアドレス */
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;
/* デバッグトレースログ出力 */
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 );
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 );
/******************************************************************************/
/**
+ * @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のタスクタイプを取得する。
*
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__ );
/******************************************************************************/
/* src/kernel/ProcMng/ProcMngTask.h */
-/* 2017/03/18 */
+/* 2017/04/16 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
#ifndef PROCMNG_TASK_H
/* カーネルスタックアドレス取得 */
extern void *ProcMngTaskGetKernelStack( uint32_t taskId );
+/* ページディレクトリID取得 */
+extern uint32_t ProcMngTaskGetPageDirId( uint32_t taskId );
+
/* タスクタイプ取得 */
extern uint8_t ProcMngTaskGetType( uint32_t taskId );
/******************************************************************************/
/* src/kernel/include/Cmn.h */
-/* 2017/03/11 */
+/* 2017/05/16 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
#ifndef CMN_H
#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管理) */
#define CMN_MODULE_DEBUG_LOG ( 0x0602 ) /**< デバッグ制御(ログ管理) */
/** モジュール・サブモジュール数 */
-#define CMN_MODULE_NUM ( 16 )
+#define CMN_MODULE_NUM ( 18 )
/* 処理結果構造体 */
typedef int32_t CmnRet_t;
/******************************************************************************/
/* 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;
+
/******************************************************************************/
/* グローバル関数宣言 */
/* メモリ領域解放 */
extern CmnRet_t MemMngAreaFree( void *pAddr );
+/* メモリ領域情報取得 */
+extern CmnRet_t MemMngAreaGetInfo( MemMngAreaInfo_t *pInfo,
+ uint32_t type );
+
/*-------------*/
/* MemMngGdt.c */
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
/******************************************************************************/
/* 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
/******************************************************************************/
/* src/kernel/include/hardware/IA32/IA32Instruction.h */
-/* 2017/03/18 */
+/* 2017/03/30 */
/* Copyright (C) 2016-2017 Mochi. */
/******************************************************************************/
#ifndef IA32_INSTRUCTION_H
/******************************************************************************/
#include <stdint.h>
#include "IA32Descriptor.h"
+#include "IA32Paging.h"
/******************************************************************************/
{
/* pop命令実行 */
__asm__ __volatile__ ( "pop %0"
- : "=a" ( *pValue )
- :
- : );
+ : "=a" ( *pValue ) );
return;
}
}
+
/******************************************************************************/
/**
* @brief push(gs)命令実行
/******************************************************************************/
/**
+ * @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レジスタに設定する。
*
--- /dev/null
+/******************************************************************************/
+/* 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
--- /dev/null
+/******************************************************************************/
+/* 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
#******************************************************************************#\r
#* vm/vmware/mochi.vmx *#\r
-#* 2017/03/11 *#\r
+#* 2017/04/06 *#\r
#* Copyright (C) 2016-2017 Mochi. *#\r
#******************************************************************************#\r
# VMware基本設定\r
gui.exitOnCLIHLT = "FALSE"\r
\r
# メモリサイズ (MB)\r
-memsize = "64"\r
+memsize = "128"\r
\r
# IDE\r
ide0:0.present = "TRUE"\r