OSDN Git Service

プロセスイメージ読込と起動を実装
authorMochi <master.c.mochi@gmail.com>
Fri, 28 Jul 2017 13:03:54 +0000 (22:03 +0900)
committerMochi <master.c.mochi@gmail.com>
Fri, 28 Jul 2017 13:03:54 +0000 (22:03 +0900)
.gitignore
build/Makefile
src/booter/Debug/DebugLog.c
src/booter/InitCtrl/InitCtrlInit32.c
src/booter/LoadMng/LoadMngProc.c [new file with mode: 0644]
src/booter/Makefile
src/booter/include/Cmn.h
src/booter/include/LoadMng.h
src/include/kernel/MochiKernel.h
src/kernel/InitCtrl/InitCtrlInit.c
src/tools/makeimg/makeimg.c

index 34fb2f7..3f3ff25 100644 (file)
@@ -1,6 +1,8 @@
 build/mochi.img
+build/kernel.img
 build/objs/booter
 build/objs/kernel
+build/tools/*
 vm/vmware/*
 *.o
 *.a
index 28304d4..d8c9c56 100644 (file)
@@ -1,6 +1,6 @@
 #******************************************************************************#
 #* build/Makefile                                                             *#
-#*                                                                 2017/07/16 *#
+#*                                                                 2017/07/27 *#
 #* Copyright (C) 2016-2017 Mochi                                              *#
 #******************************************************************************#
 #******************************************************************************#
index a02da56..0a63be9 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/booter/Debug/DebugLog.c                                                */
-/*                                                                 2017/07/04 */
+/*                                                                 2017/07/19 */
 /* Copyright (C) 2017 Mochi.                                                  */
 /******************************************************************************/
 /******************************************************************************/
@@ -93,6 +93,7 @@ const static logIdTrans_t gIdTransTbl[ CMN_MODULE_NUM + 1 ] = {
     { 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 " }  }; /* 終端                   */
index 67509a4..9a8dcbd 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/booter/InitCtrl/InitCtrlInit32.c                                       */
-/*                                                                 2017/07/11 */
+/*                                                                 2017/07/27 */
 /* Copyright (C) 2017 Mochi.                                                  */
 /******************************************************************************/
 /******************************************************************************/
@@ -89,6 +89,9 @@ void InitCtrlInit32( void )
     /* カーネル読込み */
     LoadMngKernelLoad();
     
+    /* プロセスファイル読込み */
+    LoadMngProcLoad();
+    
     /* 割込み無効化 */
     IA32InstructionCli();
     IntMngPicDisable();
diff --git a/src/booter/LoadMng/LoadMngProc.c b/src/booter/LoadMng/LoadMngProc.c
new file mode 100644 (file)
index 0000000..3df2ff1
--- /dev/null
@@ -0,0 +1,121 @@
+/******************************************************************************/
+/* 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;
+}
+
+
+/******************************************************************************/
index 302b6f0..501c985 100644 (file)
@@ -1,6 +1,6 @@
 #******************************************************************************#
 #* src/booter/Makefile                                                        *#
-#*                                                                 2017/07/16 *#
+#*                                                                 2017/07/19 *#
 #* Copyright (C) 2016-2017 Mochi.                                             *#
 #******************************************************************************#
 #******************************************************************************#
@@ -28,6 +28,7 @@ MAIN_SRCS = InitCtrl/InitCtrlInit16.s \
             Driver/DriverAta.c        \
             LoadMng/LoadMngInit.c     \
             LoadMng/LoadMngKernel.c   \
+            LoadMng/LoadMngProc.c     \
             Debug/DebugInit.c         \
             Debug/DebugLog.c
 
index 7a1c886..facd829 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* 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;
index afe74ed..fa73751 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/booter/include/LoadMng.h                                               */
-/*                                                                 2017/07/11 */
+/*                                                                 2017/07/19 */
 /* Copyright (C) 2017 Mochi.                                                  */
 /******************************************************************************/
 #ifndef LOADMNG_H
@@ -22,5 +22,12 @@ extern void LoadMngInit( void );
 extern void LoadMngKernelLoad( void );
 
 
+/*---------------*
+ * LoadMngProc.c *
+ *---------------*/
+/* プロセスファイル読込み */
+extern void LoadMngProcLoad( void );
+
+
 /******************************************************************************/
 #endif
index 92ee05c..3bb1b55 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/include/kernel/MochiKernel.h                                           */
-/*                                                                 2017/07/16 */
+/*                                                                 2017/07/27 */
 /* Copyright (C) 2017 Mochi                                                   */
 /******************************************************************************/
 #ifndef _MOCHI_KERNEL_H_
@@ -16,8 +16,9 @@
 /* 定義                                                                       */
 /******************************************************************************/
 /* カーネル位置 */
-#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 )  /** 使用可能メモリ領域 */
index c977b78..69ee54d 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/InitCtrl/InitCtrlInit.c                                         */
-/*                                                                 2017/05/24 */
+/*                                                                 2017/07/27 */
 /* Copyright (C) 2016-2017 Mochi.                                             */
 /******************************************************************************/
 /******************************************************************************/
@@ -10,6 +10,7 @@
 #include <stdarg.h>
 #include <kernel/MochiKernel.h>
 #include <hardware/IA32/IA32Instruction.h>
+#include <MLib/Basic/MLibBasic.h>
 
 /* 外部モジュールヘッダ */
 #include <Cmn.h>
 
 
 /******************************************************************************/
+/* ローカル関数宣言                                                           */
+/******************************************************************************/
+static void InitLoadProcImg( void );
+
+
+/******************************************************************************/
 /* グローバル関数定義                                                         */
 /******************************************************************************/
 /******************************************************************************/
@@ -53,13 +60,13 @@ void InitCtrlInit( void )
             /* カーネル領域 */
             {
                 ( void * ) 0x00100000,              /* 先頭アドレス */
-                0x03F00000,                         /* メモリサイズ */
+                0x04F00000,                         /* メモリサイズ */
                 MOCHIKERNEL_MEMORY_TYPE_KERNEL      /* メモリタイプ */
             },
             /* 利用可能領域 */
             {
-                ( void * ) 0x04000000,              /* 先頭アドレス */
-                0x04000000,                         /* メモリサイズ */
+                ( void * ) 0x05000000,              /* 先頭アドレス */
+                0x03000000,                         /* メモリサイズ */
                 MOCHIKERNEL_MEMORY_TYPE_AVAILABLE   /* メモリタイプ */
             }
         };
@@ -82,6 +89,9 @@ void InitCtrlInit( void )
     /* タイマ管理モジュール初期化 */
     TimerMngInit();
     
+    /* プロセスイメージ読込 */
+    InitLoadProcImg();
+    
     /* 割込み有効化 */
     IntMngPicEnable();
     IA32InstructionSti();
@@ -100,3 +110,90 @@ void InitCtrlInit( void )
 
 
 /******************************************************************************/
+/* ローカル関数定義                                                           */
+/******************************************************************************/
+/******************************************************************************/
+/**
+ * @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;
+}
+
+
+/******************************************************************************/
index 55e965f..8e530aa 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/tools/makeimg/makeimg.c                                                */
-/*                                                                 2017/07/16 */
+/*                                                                 2017/07/20 */
 /* Copyright (C) 2017 Mochi.                                                  */
 /******************************************************************************/
 /******************************************************************************/
@@ -83,8 +83,13 @@ uint8_t gFileType;      /* 入力ファイルタイプ         */
 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 );
@@ -119,6 +124,26 @@ int main( int  argNum,
                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 ] );
@@ -161,7 +186,7 @@ static void addFile( int  imgFd,
     memset( &header, 0, sizeof ( MochiKernelImgHdr_t ) );
     
     /* イメージファイルシーク */
-    offset = lseek( imgFd, 512, SEEK_END );
+    offset = lseek( imgFd, 0, SEEK_END );
     
     /* シーク結果判定 */
     if ( ( ( ( int32_t ) offset       ) <  0 ) &&
@@ -169,7 +194,7 @@ static void addFile( int  imgFd,
         /* 失敗または異常 */
         
         /* アボート */
-        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 );
@@ -236,11 +261,27 @@ static void addFile( int  imgFd,
         
     } 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 );