build/mochi.img
+build/kernel.img
build/objs/booter
build/objs/kernel
+build/tools/*
vm/vmware/*
*.o
*.a
#******************************************************************************#
#* build/Makefile *#
-#* 2017/07/16 *#
+#* 2017/07/27 *#
#* Copyright (C) 2016-2017 Mochi *#
#******************************************************************************#
#******************************************************************************#
/******************************************************************************/
/* src/booter/Debug/DebugLog.c */
-/* 2017/07/04 */
+/* 2017/07/19 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
{ CMN_MODULE_DRIVER_ATA, "DRV-ATA " }, /* ドライバ(ATA) */
{ CMN_MODULE_LOADMNG_INIT, "LDM-INIT" }, /* 読込管理 */
{ CMN_MODULE_LOADMNG_KERNEL, "LDM-KRNL" }, /* 読込管理(カーネル) */
+ { CMN_MODULE_LOADMNG_PROC, "LDM-PROC" }, /* 読込管理(プロセス) */
{ CMN_MODULE_DEBUG_INIT, "DBG-INIT" }, /* デバッグ制御(初期化) */
{ CMN_MODULE_DEBUG_LOG, "DBG-LOG " }, /* デバッグ制御(ログ管理) */
{ 0, "UNKNOWN " } }; /* 終端 */
/******************************************************************************/
/* src/booter/InitCtrl/InitCtrlInit32.c */
-/* 2017/07/11 */
+/* 2017/07/27 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
/* カーネル読込み */
LoadMngKernelLoad();
+ /* プロセスファイル読込み */
+ LoadMngProcLoad();
+
/* 割込み無効化 */
IA32InstructionCli();
IntMngPicDisable();
--- /dev/null
+/******************************************************************************/
+/* src/booter/LoadMng/LoadMngProc.c */
+/* 2017/07/27 */
+/* Copyright (C) 2017 Mochi. */
+/******************************************************************************/
+/******************************************************************************/
+/* インクルード */
+/******************************************************************************/
+/* 共通ヘッダ */
+#include <stdarg.h>
+#include <kernel/MochiKernel.h>
+#include <MLib/Basic/MLibBasic.h>
+
+/* 外部モジュールヘッダ */
+#include <Cmn.h>
+#include <Debug.h>
+#include <Driver.h>
+#include <LoadMng.h>
+
+/* 内部モジュールヘッダ */
+#include "LoadMngInit.h"
+
+
+/******************************************************************************/
+/* 定義 */
+/******************************************************************************/
+/* デバッグトレースログ出力マクロ */
+#ifdef DEBUG_LOG_ENABLE
+#define DEBUG_LOG( ... ) \
+ DebugLogOutput( CMN_MODULE_LOADMNG_PROC, \
+ __LINE__, \
+ __VA_ARGS__ )
+#else
+#define DEBUG_LOG( ... )
+#endif
+
+
+/******************************************************************************/
+/* グローバル関数定義 */
+/******************************************************************************/
+/******************************************************************************/
+/**
+ * @brief プロセスファイル読込み
+ * @details プロセスファイルを読み込む
+ */
+/******************************************************************************/
+void LoadMngProcLoad( void )
+{
+ void *pDstAddr; /* 読込み先アドレス */
+ uint32_t srcLbaAddr; /* 読込元LBAアドレス */
+ uint32_t srcLbaSize; /* 読込元LBAサイズ */
+ MochiKernelImgHdr_t *pHeader; /* ファイルヘッダ */
+ MochiKernelImgHdr_t kernelHeader; /* カーネルバイナリヘッダ */
+
+ /* トレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
+ /* 初期化 */
+ pDstAddr = ( void * ) MOCHIKERNEL_ADDR_PROCIMG;
+ srcLbaAddr = gLoadMngInitPt[ 1 ].lbaFirstAddr;
+ srcLbaSize = MLIB_BASIC_ALIGN( sizeof ( MochiKernelImgHdr_t ), 512 ) / 512;
+
+ /* カーネルバイナリヘッダ読込み */
+ DriverAtaRead( &kernelHeader,
+ srcLbaAddr,
+ srcLbaSize );
+
+ /* 読込み元LBAアドレス設定 */
+ srcLbaAddr += srcLbaSize;
+ srcLbaAddr += MLIB_BASIC_ALIGN( kernelHeader.fileSize, 512 ) / 512;
+
+ /* ファイル毎に繰り返し */
+ do {
+ /* アドレス設定 */
+ pHeader = ( MochiKernelImgHdr_t * ) pDstAddr;
+
+ /* ヘッダ読込み */
+ DriverAtaRead( pHeader,
+ srcLbaAddr,
+ srcLbaSize );
+
+ /* ファイルサイズチェック */
+ if ( pHeader->fileSize == 0 ) {
+ /* ファイル無し */
+
+ break;
+ }
+
+ /* トレースログ出力 */
+ DEBUG_LOG( "%s() read process( %s: type=%d, size=%d ).",
+ __func__,
+ pHeader->fileName,
+ pHeader->fileType,
+ pHeader->fileSize );
+
+ /* アドレス・サイズ設定 */
+ pDstAddr += srcLbaSize * 512;
+ srcLbaAddr += srcLbaSize;
+ srcLbaSize = MLIB_BASIC_ALIGN( pHeader->fileSize, 512 ) / 512;
+
+ /* ファイル読込み */
+ DriverAtaRead( pDstAddr,
+ srcLbaAddr,
+ srcLbaSize );
+
+ /* アドレス・サイズ設定 */
+ pDstAddr += srcLbaSize * 512;
+ srcLbaAddr += srcLbaSize;
+ srcLbaSize = MLIB_BASIC_ALIGN( sizeof ( MochiKernelImgHdr_t ), 512 ) /
+ 512;
+
+ } while ( true );
+
+ /* トレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
+ return;
+}
+
+
+/******************************************************************************/
#******************************************************************************#
#* src/booter/Makefile *#
-#* 2017/07/16 *#
+#* 2017/07/19 *#
#* Copyright (C) 2016-2017 Mochi. *#
#******************************************************************************#
#******************************************************************************#
Driver/DriverAta.c \
LoadMng/LoadMngInit.c \
LoadMng/LoadMngKernel.c \
+ LoadMng/LoadMngProc.c \
Debug/DebugInit.c \
Debug/DebugLog.c
/******************************************************************************/
/* src/booter/include/Cmn.h */
-/* 2017/07/04 */
+/* 2017/07/19 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
#ifndef CMN_H
#define CMN_MODULE_DRIVER_ATA ( 0x0303 ) /** ドライバ(ATA) */
#define CMN_MODULE_LOADMNG_INIT ( 0x0401 ) /** 読込管理(初期化) */
#define CMN_MODULE_LOADMNG_KERNEL ( 0x0402 ) /** 読込管理(カーネル) */
+#define CMN_MODULE_LOADMNG_PROC ( 0x0403 ) /** 読込管理(プロセス) */
#define CMN_MODULE_DEBUG_INIT ( 0x0401 ) /** デバッグ制御(初期化) */
#define CMN_MODULE_DEBUG_LOG ( 0x0402 ) /** デバッグ制御(ログ管理) */
/** モジュール・サブモジュール数 */
-#define CMN_MODULE_NUM ( 12 )
+#define CMN_MODULE_NUM ( 13 )
/** 処理結果構造体 */
typedef int32_t CmnRet_t;
/******************************************************************************/
/* src/booter/include/LoadMng.h */
-/* 2017/07/11 */
+/* 2017/07/19 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
#ifndef LOADMNG_H
extern void LoadMngKernelLoad( void );
+/*---------------*
+ * LoadMngProc.c *
+ *---------------*/
+/* プロセスファイル読込み */
+extern void LoadMngProcLoad( void );
+
+
/******************************************************************************/
#endif
/******************************************************************************/
/* src/include/kernel/MochiKernel.h */
-/* 2017/07/16 */
+/* 2017/07/27 */
/* Copyright (C) 2017 Mochi */
/******************************************************************************/
#ifndef _MOCHI_KERNEL_H_
/* 定義 */
/******************************************************************************/
/* カーネル位置 */
-#define MOCHIKERNEL_ADDR_ENTRY ( 0x00100000 ) /** エントリポイント */
-#define MOCHIKERNEL_ADDR_STACK ( 0x04000000 ) /** スタックアドレス */
+#define MOCHIKERNEL_ADDR_ENTRY ( 0x00100000 ) /** エントリポイント */
+#define MOCHIKERNEL_ADDR_STACK ( 0x04000000 ) /** スタックアドレス */
+#define MOCHIKERNEL_ADDR_PROCIMG ( 0x04000000 ) /** プロセスイメージ */
/* メモリ領域タイプ */
#define MOCHIKERNEL_MEMORY_TYPE_AVAILABLE ( 0x01 ) /** 使用可能メモリ領域 */
/******************************************************************************/
/* src/kernel/InitCtrl/InitCtrlInit.c */
-/* 2017/05/24 */
+/* 2017/07/27 */
/* Copyright (C) 2016-2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
#include <stdarg.h>
#include <kernel/MochiKernel.h>
#include <hardware/IA32/IA32Instruction.h>
+#include <MLib/Basic/MLibBasic.h>
/* 外部モジュールヘッダ */
#include <Cmn.h>
/******************************************************************************/
+/* ローカル関数宣言 */
+/******************************************************************************/
+static void InitLoadProcImg( void );
+
+
+/******************************************************************************/
/* グローバル関数定義 */
/******************************************************************************/
/******************************************************************************/
/* カーネル領域 */
{
( void * ) 0x00100000, /* 先頭アドレス */
- 0x03F00000, /* メモリサイズ */
+ 0x04F00000, /* メモリサイズ */
MOCHIKERNEL_MEMORY_TYPE_KERNEL /* メモリタイプ */
},
/* 利用可能領域 */
{
- ( void * ) 0x04000000, /* 先頭アドレス */
- 0x04000000, /* メモリサイズ */
+ ( void * ) 0x05000000, /* 先頭アドレス */
+ 0x03000000, /* メモリサイズ */
MOCHIKERNEL_MEMORY_TYPE_AVAILABLE /* メモリタイプ */
}
};
/* タイマ管理モジュール初期化 */
TimerMngInit();
+ /* プロセスイメージ読込 */
+ InitLoadProcImg();
+
/* 割込み有効化 */
IntMngPicEnable();
IA32InstructionSti();
/******************************************************************************/
+/* ローカル関数定義 */
+/******************************************************************************/
+/******************************************************************************/
+/**
+ * @brief プロセスイメージ読込
+ * @details プロセスイメージを読み込み、タスクを追加する。
+ */
+/******************************************************************************/
+static void InitLoadProcImg( void )
+{
+ void *pAddr; /* ファイルアドレス */
+ uint8_t type; /* プロセスタイプ */
+ uint32_t taskId; /* タスクID */
+ MochiKernelImgHdr_t *pHeader; /* ファイルヘッダ */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
+ /* 初期化 */
+ pAddr = ( void * ) MOCHIKERNEL_ADDR_PROCIMG;
+ pHeader = ( MochiKernelImgHdr_t * ) pAddr;
+
+ /* ファイル毎に繰り返し */
+ while ( pHeader->fileSize != 0 ) {
+
+ /* ファイルヘッダアドレス設定 */
+ pAddr = pAddr + sizeof ( MochiKernelImgHdr_t );
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "Header:" );
+ DEBUG_LOG( " Name=%s", pHeader->fileName );
+ DEBUG_LOG( " Size=%d", pHeader->fileSize );
+ DEBUG_LOG( " Type=%d", pHeader->fileType );
+
+ /* プロセスタイプ判定 */
+ if ( pHeader->fileType == MOCHIKERNEL_PROCESS_TYPE_DRIVER ) {
+ /* ドライバ */
+
+ /* プロセスタイプ変換 */
+ type = PROCMNG_TASK_TYPE_DRIVER;
+
+ } else if ( pHeader->fileType == MOCHIKERNEL_PROCESS_TYPE_SERVER ) {
+ /* サーバ */
+
+ /* プロセスタイプ変換 */
+ type = PROCMNG_TASK_TYPE_SERVER;
+
+ } else if ( pHeader->fileType == MOCHIKERNEL_PROCESS_TYPE_USER ) {
+ /* ユーザ */
+
+ /* プロセスタイプ変換 */
+ type = PROCMNG_TASK_TYPE_USER;
+ }
+
+ /* タスク追加 */
+ taskId = ProcMngTaskAdd(
+ type,
+ ( ( void * ) pHeader ) + sizeof ( MochiKernelImgHdr_t ),
+ pHeader->fileSize );
+
+ /* タスク追加結果判定 */
+ if ( taskId == PROCMNG_TASK_ID_NULL ) {
+ /* 失敗 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "ProcMngTaskAdd() error." );
+
+ } else {
+ /* 成功 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "ProcMngTaskAdd() OK. taskId=%d", taskId );
+ }
+
+ /* アドレス更新 */
+ pAddr = pAddr + MLIB_BASIC_ALIGN( pHeader->fileSize, 512 );
+ pHeader = ( MochiKernelImgHdr_t * ) pAddr;
+ }
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
+ return;
+}
+
+
+/******************************************************************************/
/******************************************************************************/
/* src/tools/makeimg/makeimg.c */
-/* 2017/07/16 */
+/* 2017/07/20 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
int main( int argNum,
char *pArg[] )
{
- int imgFd; /* イメージファイルディスクリプタ */
- int flags; /* オープンフラグ */
+ int imgFd; /* イメージファイルディスクリプタ */
+ int flags; /* オープンフラグ */
+ ssize_t writeSize; /* 書込みサイズ */
+ MochiKernelImgHdr_t header; /* 空ヘッダ */
+
+ /* 初期化 */
+ memset( &header, 0, sizeof ( MochiKernelImgHdr_t ) );
/* オプションチェック */
checkOptions( argNum, pArg );
errno );
}
+ /* 書込みタイプチェック */
+ if ( gFileType == MOCHIKERNEL_PROCESS_TYPE_KERNEL ) {
+ /* カーネル */
+
+ /* 空ヘッダ書込み */
+ writeSize = write( imgFd, &header, sizeof ( MochiKernelImgHdr_t ) );
+
+ /* 書込み結果判定 */
+ if ( writeSize != sizeof ( MochiKernelImgHdr_t ) ) {
+ /* 失敗 */
+
+ /* アボート */
+ ABORT( "ERROR(%04u): Can't write %s. ret=%d, errno=%d.\n",
+ __LINE__,
+ gpImgPath,
+ ( int32_t ) writeSize,
+ errno );
+ }
+ }
+
/* ファイル書込み */
for ( ; optind < argNum; optind++ ) {
addFile( imgFd, pArg[ optind ] );
memset( &header, 0, sizeof ( MochiKernelImgHdr_t ) );
/* イメージファイルシーク */
- offset = lseek( imgFd, 512, SEEK_END );
+ offset = lseek( imgFd, 0, SEEK_END );
/* シーク結果判定 */
if ( ( ( ( int32_t ) offset ) < 0 ) &&
/* 失敗または異常 */
/* アボート */
- ABORT( "ERROR(%04u): Can't seek at the image. ret=%d, errno%d.\n",
+ ABORT( "ERROR(%04u): Can't seek at the image. ret=%d, errno=%d.\n",
__LINE__,
( int32_t ) offset,
errno );
} while ( readSize == BUFFER_SIZE );
+ /* 空ヘッダ書込み */
+ writeSize = write( imgFd, &header, sizeof ( MochiKernelImgHdr_t ) );
+
+ /* 書込み結果判定 */
+ if ( writeSize != sizeof ( MochiKernelImgHdr_t ) ) {
+ /* 失敗 */
+
+ /* アボート */
+ ABORT( "ERROR(%04u): Can't write %s. ret=%d, errno=%d.\n",
+ __LINE__,
+ pPath,
+ ( int32_t ) writeSize,
+ errno );
+ }
+
/* ファイルヘッダ設定 */
getFileName( header.fileName, pPath, sizeof ( header.fileName ) - 1 );
header.fileSize = size;
header.fileType = gFileType;
+
/* イメージファイルシーク */
offset = lseek( imgFd, headerOffset, SEEK_SET );