OSDN Git Service

アイドルプロセス(仮)起動
authorMochi <master.c.mochi@gmail.com>
Sat, 18 Mar 2017 09:43:34 +0000 (18:43 +0900)
committerMochi <master.c.mochi@gmail.com>
Sat, 18 Mar 2017 09:43:34 +0000 (18:43 +0900)
src/kernel/InitCtrl/InitCtrlInit.c
src/kernel/IntMng/IntMngHdl.c
src/kernel/ProcMng/ProcMngSched.c
src/kernel/ProcMng/ProcMngTask.c
src/kernel/ProcMng/ProcMngTask.h
src/kernel/ProcMng/ProcMngTss.c
src/kernel/include/hardware/IA32/IA32Instruction.h

index edf9b7c..d502297 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/InitCtrl/InitCtrlInit.c                                         */
-/*                                                                 2017/03/11 */
+/*                                                                 2017/03/18 */
 /* Copyright (C) 2016-2017 Mochi.                                             */
 /******************************************************************************/
 /******************************************************************************/
@@ -71,6 +71,10 @@ void InitCtrlInit( void )
     /* タイマ管理モジュール初期化 */
     TimerMngInit();
     
+    /* 割込み有効化 */
+    IntMngPicEnable();
+    IA32InstructionSti();
+    
     /* デバッグトレースログ出力 */
     DEBUG_LOG( "Idle running." );
     
index 19af7d1..3876b40 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/IntMng/IntMngHdl.c                                              */
-/*                                                                 2017/03/11 */
+/*                                                                 2017/03/16 */
 /* Copyright (C) 2016-2017 Mochi.                                             */
 /******************************************************************************/
 /******************************************************************************/
@@ -204,7 +204,7 @@ void IntMngHdlInit( void )
             gHdlCmnProcTbl[ intNo ],            /* オフセット         */
             0,                                  /* 引数コピーカウント */
             IA32_DESCRIPTOR_TYPE_GATE32_INT,    /* タイプ             */
-            IA32_DESCRIPTOR_DPL_3            ); /* 特権レベル         */
+            IA32_DESCRIPTOR_DPL_0            ); /* 特権レベル         */
     }
     
     /* デバッグトレースログ出力 */
@@ -267,6 +267,9 @@ HDL_CMN_PROC_16X( 0xF )
 /******************************************************************************/
 static void HdlIgnore( uint32_t intNo )
 {
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() intNo=%d", __func__, intNo );__asm__ __volatile__("hlt");
+    
     /* 何もしない */
     return;
 }
index 2002ea7..784fa07 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/ProcMng/ProcMngSched.c                                          */
-/*                                                                 2017/03/12 */
+/*                                                                 2017/03/18 */
 /* Copyright (C) 2017 Mochi.                                                  */
 /******************************************************************************/
 /******************************************************************************/
@@ -180,7 +180,7 @@ void ProcMngSchedExec( void )
     pTaskInfo   = NULL;
     
     /* デバッグトレースログ出力 */
-    DEBUG_LOG( "%s() start.", __func__ );
+    /*DEBUG_LOG( "%s() start.", __func__ );*/
     
     /* 実行中タスク判定 */
     if ( nowTaskId == PROCMNG_TASK_ID_IDLE ) {
@@ -192,6 +192,9 @@ void ProcMngSchedExec( void )
     } else {
         /* アイドルタスク以外 */
         
+        /* タスク実行済みフラグ設定 */
+        gSchedTbl.runFlg = true;
+        
         /* 実行予約タスクグループにキューイング */
         SchedEnqueueToReservedGrp( gSchedTbl.pRunningTaskInfo );
     }
@@ -239,13 +242,14 @@ void ProcMngSchedExec( void )
                 /* 実行可能タスクグループ役割切替 */
                 SchedSwitchRunGrpRole();
                 
-                /* å\86\8dã\82¹ã\82±ã\82¸ã\83¥ã\83¼ã\83ªã\83³ã\82° */
-                ProcMngSchedExec();
+                /* å®\9fè¡\8c中ã\82¿ã\82¹ã\82¯ã\82°ã\83«ã\83¼ã\83\97設å®\9a */
+                pRunningGrp = &gSchedTbl.runGrp[ gSchedTbl.runningGrpIdx ];
                 
-                /* デバッグトレースログ出力 */
-                DEBUG_LOG( "%s() end.", __func__ );
+                /* 実行中レベル初期化 */
+                level = SCHED_LEVEL_DRIVER;
                 
-                return;
+                /* 再スケジューリング */
+                continue;
             }
         }
         
@@ -262,7 +266,7 @@ void ProcMngSchedExec( void )
     SchedSwitchTask( nowTaskId, pTaskInfo->taskId );
     
     /* デバッグトレースログ出力 */
-    DEBUG_LOG( "%s() end.", __func__ );
+    /*DEBUG_LOG( "%s() end.", __func__ );*/
     
     return;
 }
@@ -360,7 +364,7 @@ static void SchedEnqueueToReservedGrp( schedTaskInfo_t *pTaskInfo )
     retMLib      = MLIB_FAILURE;
     
     /* デバッグトレースログ出力 */
-    DEBUG_LOG( "%s() start. pTaskInfo=%010p", __func__, pTaskInfo );
+    /*DEBUG_LOG( "%s() start. pTaskInfo=%010p", __func__, pTaskInfo );*/
     
     /* タスクタイプ取得 */
     taskType = ProcMngTaskGetType( pTaskInfo->taskId );
@@ -397,7 +401,7 @@ static void SchedEnqueueToReservedGrp( schedTaskInfo_t *pTaskInfo )
     }
     
     /* デバッグトレースログ出力 */
-    DEBUG_LOG( "%s() end.", __func__ );
+    /*DEBUG_LOG( "%s() end.", __func__ );*/
     
     return;
 }
@@ -412,7 +416,7 @@ static void SchedEnqueueToReservedGrp( schedTaskInfo_t *pTaskInfo )
 static void SchedSwitchRunGrpRole( void )
 {
     /* デバッグトレースログ出力 */
-    DEBUG_LOG( "%s() start.", __func__ );
+    /*DEBUG_LOG( "%s() start.", __func__ );*/
     
     /* グループ役割切替 */
     gSchedTbl.runningGrpIdx  ^= 1;
@@ -422,7 +426,7 @@ static void SchedSwitchRunGrpRole( void )
     gSchedTbl.runFlg = false;
     
     /* デバッグトレースログ出力 */
-    DEBUG_LOG( "%s() end.", __func__ );
+    /*DEBUG_LOG( "%s() end.", __func__ );*/
     
     return;
 }
@@ -438,17 +442,18 @@ static void SchedSwitchRunGrpRole( void )
  * @param[in]   nextTaskId タスクスイッチ先タスクID
  */
 /******************************************************************************/
-static void SchedSwitchTask( uint32_t nowTaskId,
-                             uint32_t nextTaskId )
+static __attribute__ ( ( noinline ) )
+    void SchedSwitchTask( uint32_t nowTaskId,
+                          uint32_t nextTaskId )
 {
     void                 *pKernelStack; /* カーネルスタック */
     ProcMngTaskContext_t context;       /* コンテキスト     */
     
     /* デバッグトレースログ出力 */
-    DEBUG_LOG( "%s() start. nowTaskId=%u, nextTaskId=%u",
+    /*DEBUG_LOG( "%s() start. nowTaskId=%u, nextTaskId=%u",
                __func__,
                nowTaskId,
-               nextTaskId );
+               nextTaskId );*/
     
     /* 初期化 */
     memset( &context, 0, sizeof ( ProcMngTaskContext_t ) );
@@ -456,6 +461,7 @@ static void SchedSwitchTask( uint32_t nowTaskId,
     /* コンテキスト退避 */
     context.eip = ( uint32_t ) SchedSwitchTaskEnd;
     context.esp = IA32InstructionGetEsp();
+    context.ebp = IA32InstructionGetEbp();
     ProcMngTaskSetContext( nowTaskId, &context );
     
     /* コンテキスト復旧 */
@@ -467,13 +473,14 @@ static void SchedSwitchTask( uint32_t nowTaskId,
     
     /* タスクスイッチ */
     IA32InstructionSwitchTask( ( void * ) context.eip,
-                               ( void * ) context.esp  );
+                               ( void * ) context.esp,
+                               ( void * ) context.ebp  );
     
     /* ラベル */
     __asm__ __volatile__ ( "SchedSwitchTaskEnd:" );
     
     /* デバッグトレースログ出力 */
-    DEBUG_LOG( "%s() end.", __func__ );
+    /*DEBUG_LOG( "%s() end.", __func__ );*/
     
     return;
 }
index 68edfa5..ae5cec7 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/ProcMng/ProcMngTask.c                                           */
-/*                                                                 2017/03/11 */
+/*                                                                 2017/03/16 */
 /* Copyright (C) 2017 Mochi.                                                  */
 /******************************************************************************/
 /******************************************************************************/
@@ -42,8 +42,8 @@
 #define TASK_ID_USED   ( 1 )    /** 使用済 */
 
 /* スタックサイズ */
-#define TASK_KERNEL_STACK_SIZE ( 8192 ) /**< カーネルスタックサイズ */
-#define TASK_STACK_SIZE        ( 8192 ) /**< スタックサイズ         */
+#define TASK_KERNEL_STACK_SIZE ( 1024000 )  /**< カーネルスタックサイズ */
+#define TASK_STACK_SIZE        ( 1024000 )  /**< スタックサイズ         */
 
 /** タスクスタック情報 */
 typedef struct {
@@ -141,7 +141,7 @@ uint32_t ProcMngTaskAdd( uint8_t taskType,
             gTaskTbl[ taskId ].type        = taskType;
             gTaskTbl[ taskId ].state       = 0;
             gTaskTbl[ taskId ].context.eip = ( uint32_t ) ProcMngTaskStart;
-            gTaskTbl[ taskId ].context.esp = ( uint32_t ) pKernelStack;
+            gTaskTbl[ taskId ].context.esp = ( uint32_t ) pKernelStack + TASK_KERNEL_STACK_SIZE;
             gTaskTbl[ taskId ].pEntryPoint = pEntryPoint;
             
             /* カーネルスタック情報設定 */
@@ -303,6 +303,9 @@ void ProcMngTaskStart( void )
     uint32_t  dataSegSel;   /* データセグメントセレクタ */
     taskTbl_t *pTask;       /* タスク管理情報           */
     
+    /* デバッグトレースログ出力 */
+    DEBUG_LOG( "%s() start.", __func__ );
+    
     /* 初期化 */
     taskId      = ProcMngSchedGetTaskId();      /* タスクID         */
     pTask       = &( gTaskTbl[ taskId ] );      /* タスク管理情報   */
@@ -311,7 +314,10 @@ void ProcMngTaskStart( void )
     taskType    = pTask->type;                  /* タスクタイプ     */
     
     /* デバッグトレースログ出力 */
-    DEBUG_LOG( "%s() start.", __func__ );
+    DEBUG_LOG( "taskId=%d, pEntryPoint=%p, pStack=%p",
+               taskId,
+               pEntryPoint,
+               pStack );
     
     /* タスクタイプ判定 */
     if ( taskType == PROCMNG_TASK_TYPE_DRIVER ) {
index 811ca02..31f43f2 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/ProcMng/ProcMngTask.h                                           */
-/*                                                                 2017/03/01 */
+/*                                                                 2017/03/18 */
 /* Copyright (C) 2017 Mochi.                                                  */
 /******************************************************************************/
 #ifndef PROCMNG_TASK_H
@@ -22,6 +22,7 @@
 typedef struct {
     uint32_t eip;   /**< eipレジスタ */
     uint32_t esp;   /**< espレジスタ */
+    uint32_t ebp;   /**< ebpレジスタ */
 } ProcMngTaskContext_t;
 
 
index c50618a..be5f555 100644 (file)
@@ -63,6 +63,9 @@ void ProcMngTssInit( void )
     /* TSS初期化 */
     memset( &gTss, 0, sizeof ( IA32Tss_t ) );
     
+    /* TSS設定 */
+    gTss.ss0 = MEMMNG_SEGSEL_KERNEL_DATA;
+    
     /* TSSディスクリプタ設定 */
     index = MemMngGdtAdd(
                 &gTss,                          /* セグメントベース     */
index 8fc37a9..17a2405 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/include/hardware/IA32/IA32Instruction.h                         */
-/*                                                                 2017/01/09 */
+/*                                                                 2017/03/18 */
 /* Copyright (C) 2016-2017 Mochi.                                             */
 /******************************************************************************/
 #ifndef IA32_INSTRUCTION_H
@@ -70,6 +70,28 @@ static inline void IA32InstructionCli( void )
 
 /******************************************************************************/
 /**
+ * @brief       ebpレジスタ値取得
+ * @details     ebpレジスタの値を返す。
+ * 
+ * @return      ebpレジスタ値
+ */
+/******************************************************************************/
+static inline uint32_t IA32InstructionGetEbp( void )
+{
+    uint32_t ebp;   /* ebpレジスタ値 */
+    
+    /* mov命令実行 */
+    __asm__ __volatile__ ( "mov %0, ebp"
+                           : "=m" ( *&ebp )
+                           :
+                           :                );
+    
+    return ebp;
+}
+
+
+/******************************************************************************/
+/**
  * @brief       espレジスタ値取得
  * @details     espレジスタの値を返す。
  * 
@@ -636,23 +658,26 @@ static inline void IA32InstructionSubEsp( int32_t value )
 /******************************************************************************/
 /**
  * @brief       タスクスイッチ
- * @details     指定したスタックポインタをespレジスタに設定し、jmp命令を用いて
- *              指定したアドレスを実行する。
+ * @details     指定したスタックポインタをespレジスタに、ベースポインタをebpレ
+ *              ジスタに設定し、jmp命令を用いて指定したアドレスを実行する。
  * 
  * @param[in]   *pEip 移動先アドレス
  * @param[in]   *pEsp スタックポインタ
+ * @param[in]   *pEbp ベースポインタ
  */
 /******************************************************************************/
 static inline void IA32InstructionSwitchTask( void *pEip,
-                                              void *pEsp )
+                                              void *pEsp,
+                                              void *pEbp  )
 {
     /* タスクスイッチ */
     __asm__ __volatile__ ( "mov eax, %0\n"
                            "mov esp, %1\n"
+                           "mov ebp, %2\n"
                            "jmp eax"
                            :
-                           : "m" ( pEip ), "m" ( pEsp )
-                           :                            );
+                           : "m" ( pEip ), "m" ( pEsp ), "m" ( pEbp )
+                           :                                          );
 }