/** * 셸 도움말을 출력 */ void kHelp( const char* pcCommandBuffer ) { int i; int iCount; int iCursorX, iCursorY; int iLength, iMaxCommandLength = 0; kPrintf( "=========================================================\n" ); kPrintf( " MINT64 Shell Help \n" ); kPrintf( "=========================================================\n" ); iCount = sizeof( gs_vstCommandTable ) / sizeof( SHELLCOMMANDENTRY ); // 가장 긴 커맨드의 길이를 계산 for( i = 0 ; i < iCount ; i++ ) { iLength = kStrLen( gs_vstCommandTable[ i ].pcCommand ); if( iLength > iMaxCommandLength ) { iMaxCommandLength = iLength; } } // 도움말 출력 for( i = 0 ; i < iCount ; i++ ) { kPrintf( "%s", gs_vstCommandTable[ i ].pcCommand ); kGetCursor( &iCursorX, &iCursorY ); kSetCursor( iMaxCommandLength, iCursorY ); kPrintf( " - %s\n", gs_vstCommandTable[ i ].pcHelp ); } }
//============================================================================= // Process command //============================================================================= // Help void kHelp( const char * pcCommandBuffer ) { int i; int iCount; int iCursorX, iCursorY; int iLength, iMaxCommandLength = 0; kPrintf( "======================================================================\n" ); kPrintf( " KARLINUX SHELL HELP \n" ); kPrintf( "======================================================================\n" ); iCount = sizeof( gs_vstCommandTable ) / sizeof( SHELLCOMMANDENTRY ); // Calculate length of longest command for ( i = 0 ; i < iCount ; i++ ) { iLength = kStrLen( gs_vstCommandTable[i].pcCommand ); if ( iLength > iMaxCommandLength ) { iMaxCommandLength = iLength; } } // Print help for ( i = 0 ; i < iCount ; i++ ) { kPrintf( "%s", gs_vstCommandTable[i].pcCommand ); kGetCursor( &iCursorX, &iCursorY ); kSetCursor( iMaxCommandLength, iCursorY ); kPrintf( " - %s\n", gs_vstCommandTable[i].pcHelp ); } }
/** * 셸 도움말을 출력 */ static void kHelp( const char* pcCommandBuffer ) { int i; int iCount; int iCursorX, iCursorY; int iLength, iMaxCommandLength = 0; kPrintf( "=========================================================\n" ); kPrintf( " MINT64 Shell Help \n" ); kPrintf( "=========================================================\n" ); iCount = sizeof( gs_vstCommandTable ) / sizeof( SHELLCOMMANDENTRY ); // 가장 긴 커맨드의 길이를 계산 for( i = 0 ; i < iCount ; i++ ) { iLength = kStrLen( gs_vstCommandTable[ i ].pcCommand ); if( iLength > iMaxCommandLength ) { iMaxCommandLength = iLength; } } // 도움말 출력 for( i = 0 ; i < iCount ; i++ ) { kPrintf( "%s", gs_vstCommandTable[ i ].pcCommand ); kGetCursor( &iCursorX, &iCursorY ); kSetCursor( iMaxCommandLength, iCursorY ); kPrintf( " - %s\n", gs_vstCommandTable[ i ].pcHelp ); // 목록이 많을 경우 나눠서 보여줌 if( ( i != 0 ) && ( ( i % 20 ) == 0 ) ) { kPrintf( "Press any key to continue... ('q' is exit) : " ); if( kGetCh() == 'q' ) { kPrintf( "\n" ); break; } kPrintf( "\n" ); } } }
/** * 셸의 메인 루프 */ void kStartConsoleShell( void ) { char vcCommandBuffer[ CONSOLESHELL_MAXCOMMANDBUFFERCOUNT ]; int iCommandBufferIndex = 0; BYTE bKey; int iCursorX, iCursorY; CONSOLEMANAGER* pstConsoleManager; // 콘솔을 관리하는 자료구조를 반환 pstConsoleManager = kGetConsoleManager(); // 프롬프트 출력 kPrintf( CONSOLESHELL_PROMPTMESSAGE ); // 콘솔 셸 종료 플래그가 TRUE가 될 때까지 반복 while( pstConsoleManager->bExit == FALSE ) { bKey = kGetCh(); // 콘솔 셸 종료 플래그가 설정된 경우 루프를 종료 if( pstConsoleManager->bExit == TRUE ) { break; } if( bKey == KEY_BACKSPACE ) { if( iCommandBufferIndex > 0 ) { // 현재 커서 위치를 얻어서 한 문자 앞으로 이동한 다음 공백을 출력하고 // 커맨드 버퍼에서 마지막 문자 삭제 kGetCursor( &iCursorX, &iCursorY ); kPrintStringXY( iCursorX - 1, iCursorY, " " ); kSetCursor( iCursorX - 1, iCursorY ); iCommandBufferIndex--; } } else if( bKey == KEY_ENTER ) { kPrintf( "\n" ); if( iCommandBufferIndex > 0 ) { // 커맨드 버퍼에 있는 명령을 실행 vcCommandBuffer[ iCommandBufferIndex ] = '\0'; kExecuteCommand( vcCommandBuffer ); } // 프롬프트 출력 및 커맨드 버퍼 초기화 kPrintf( "%s", CONSOLESHELL_PROMPTMESSAGE ); kMemSet( vcCommandBuffer, '\0', CONSOLESHELL_MAXCOMMANDBUFFERCOUNT ); iCommandBufferIndex = 0; } // 시프트 키, CAPS Lock, NUM Lock, Scroll Lock은 무시 else if( ( bKey == KEY_LSHIFT ) || ( bKey == KEY_RSHIFT ) || ( bKey == KEY_CAPSLOCK ) || ( bKey == KEY_NUMLOCK ) || ( bKey == KEY_SCROLLLOCK ) ) { ; } else if( bKey < 128 ) { // TAB은 공백으로 전환 if( bKey == KEY_TAB ) { bKey = ' '; } // 버퍼가 남아있을 때만 가능 if( iCommandBufferIndex < CONSOLESHELL_MAXCOMMANDBUFFERCOUNT ) { vcCommandBuffer[ iCommandBufferIndex++ ] = bKey; kPrintf( "%c", bKey ); } } } }
void Main( void ) { int iCursorX, iCursorY; kPrintString( 45, 10,"Pass" ); kInitializeConsole( 0, 11); kPrintf("Success to enter 64-bit C Kernel\n"); kPrintf("Console Initialization......................[Pass]\n"); // 부팅상황 kGetCursor( &iCursorX, &iCursorY ); kPrintf("GDT Initialize And Switch For 64bit Mode....[ ]"); kInitializeGDTTableAndTSS(); kLoadGDTR( GDTR_STARTADDRESS ); kSetCursor( 45, iCursorY++); kPrintf("Pass\n"); kPrintf("TSS Segment Load............................[ ]" ); kLoadTR( GDT_TSSSEGMENT ); kSetCursor( 45, iCursorY++); kPrintf("Pass\n"); kPrintf("IDT Initialize..............................[ ]" ); kInitializeIDTTables(); kLoadIDTR( IDTR_STARTADDRESS ); kSetCursor( 45, iCursorY++); kPrintf("Pass\n"); kPrintf("Total RAM Size Check........................[ ]" ); kCheckTotalRAMSize(); kSetCursor( 45, iCursorY++); kPrintf("Pass], Size = %d MB\n", kGetTotalRAMSize()); kPrintf("TCB Pool And Scheduler Initialize...........[Pass]\n" ); iCursorY++; kInitializeScheduler(); kPrintf("Dynamic Memory Initialize...................[Pass]\n"); iCursorY++; kInitializeDynamicMemory(); // 1ms 당 인터럽트 발생 kInitializePIT( MSTOCOUNT(1), 1 ); kPrintf("Keyboard Activation.........................[ ]" ); if( kInitializeKeyboard() == TRUE ) { kSetCursor( 45, iCursorY++); kPrintf("Pass\n"); kChangeKeyboardLED(FALSE, FALSE, FALSE); } else { kSetCursor( 45, iCursorY++); kPrintf("Fail\n"); while(1) { ; } } kPrintf("PIC Controller And Interrupt Initialize.....[ ]" ); kInitializePIC(); kMaskPICInterrupt( 0 ); kEnableInterrupt(); kSetCursor( 45, iCursorY++); kPrintf("Pass\n"); kPrintf("HDD Initialize..............................[ ]" ); if(kInitializeHDD() == TRUE) { kSetCursor( 45, iCursorY++); kPrintf("Pass\n"); } else { kSetCursor( 45, iCursorY++); kPrintf("Fail\n"); } kPrintf("File System Initialize......................[ ]" ); if(kInitializeFileSystem() == TRUE) { kSetCursor( 45, iCursorY++); kPrintf("Pass\n"); } else { kSetCursor( 45, iCursorY++); kPrintf("Fail\n"); } kCreateTask( TASK_FLAGS_LOWEST | TASK_FLAGS_IDLE | TASK_FLAGS_SYSTEM | TASK_FLAGS_THREAD , 0, 0, (QWORD) kIdleTask ); kStartConsoleShell(); }
/** * 아래 함수는 C 언어 커널의 시작 부분임 */ void Main( void ) { int iCursorX, iCursorY; // 콘솔을 먼저 초기화한 후, 다음 작업을 수행 kInitializeConsole( 0, 10 ); kPrintf( "Switch To IA-32e Mode Success~!!\n" ); kPrintf( "IA-32e C Language Kernel Start..............[Pass]\n" ); kPrintf( "Initialize Console..........................[Pass]\n" ); // 부팅 상황을 화면에 출력 kGetCursor( &iCursorX, &iCursorY ); kPrintf( "GDT Initialize And Switch For IA-32e Mode...[ ]" ); kInitializeGDTTableAndTSS(); kLoadGDTR( GDTR_STARTADDRESS ); kSetCursor( 45, iCursorY++ ); kPrintf( "Pass\n" ); kPrintf( "TSS Segment Load............................[ ]" ); kLoadTR( GDT_TSSSEGMENT ); kSetCursor( 45, iCursorY++ ); kPrintf( "Pass\n" ); kPrintf( "IDT Initialize..............................[ ]" ); kInitializeIDTTables(); kLoadIDTR( IDTR_STARTADDRESS ); kSetCursor( 45, iCursorY++ ); kPrintf( "Pass\n" ); kPrintf( "Total RAM Size Check........................[ ]" ); kCheckTotalRAMSize(); kSetCursor( 45, iCursorY++ ); kPrintf( "Pass], Size = %d MB\n", kGetTotalRAMSize() ); kPrintf( "TCB Pool And Scheduler Initialize...........[Pass]\n" ); iCursorY++; kInitializeScheduler(); // 1ms당 한번씩 인터럽트가 발생하도록 설정 kInitializePIT( MSTOCOUNT( 1 ), 1 ); kPrintf( "Keyboard Activate And Queue Initialize......[ ]" ); // 키보드를 활성화 if( kInitializeKeyboard() == TRUE ) { kSetCursor( 45, iCursorY++ ); kPrintf( "Pass\n" ); kChangeKeyboardLED( FALSE, FALSE, FALSE ); } else { kSetCursor( 45, iCursorY++ ); kPrintf( "Fail\n" ); while( 1 ) ; } kPrintf( "PIC Controller And Interrupt Initialize.....[ ]" ); // PIC 컨트롤러 초기화 및 모든 인터럽트 활성화 kInitializePIC(); kMaskPICInterrupt( 0 ); kEnableInterrupt(); kSetCursor( 45, iCursorY++ ); kPrintf( "Pass\n" ); // 셸을 시작 kStartConsoleShell(); }
/** * 셸의 메인 루프 */ void kStartConsoleShell( void ) { char vcCommandBuffer[ CONSOLESHELL_MAXCOMMANDBUFFERCOUNT ]; int iCommandBufferIndex = 0; BYTE bKey; int iCursorX, iCursorY; // 프롬프트 출력 kPrintf( CONSOLESHELL_PROMPTMESSAGE ); while( 1 ) { // 키가 수신될 때까지 대기 bKey = kGetCh(); // Backspace 키 처리 if( bKey == KEY_BACKSPACE ) { if( iCommandBufferIndex > 0 ) { // 현재 커서 위치를 얻어서 한 문자 앞으로 이동한 다음 공백을 출력하고 // 커맨드 버퍼에서 마지막 문자 삭제 kGetCursor( &iCursorX, &iCursorY ); kPrintStringXY( iCursorX - 1, iCursorY, " " ); kSetCursor( iCursorX - 1, iCursorY ); iCommandBufferIndex--; } } // 엔터 키 처리 else if( bKey == KEY_ENTER ) { kPrintf( "\n" ); if( iCommandBufferIndex > 0 ) { // 커맨드 버퍼에 있는 명령을 실행 vcCommandBuffer[ iCommandBufferIndex ] = '\0'; kExecuteCommand( vcCommandBuffer ); } // 프롬프트 출력 및 커맨드 버퍼 초기화 kPrintf( "%s", CONSOLESHELL_PROMPTMESSAGE ); kMemSet( vcCommandBuffer, '\0', CONSOLESHELL_MAXCOMMANDBUFFERCOUNT ); iCommandBufferIndex = 0; } // 시프트 키, CAPS Lock, NUM Lock, Scroll Lock은 무시 else if( ( bKey == KEY_LSHIFT ) || ( bKey == KEY_RSHIFT ) || ( bKey == KEY_CAPSLOCK ) || ( bKey == KEY_NUMLOCK ) || ( bKey == KEY_SCROLLLOCK ) ) { ; } else { // TAB은 공백으로 전환 if( bKey == KEY_TAB ) { bKey = ' '; } // 버퍼에 공간이 남아있을 때만 가능 if( iCommandBufferIndex < CONSOLESHELL_MAXCOMMANDBUFFERCOUNT ) { vcCommandBuffer[ iCommandBufferIndex++ ] = bKey; kPrintf( "%c", bKey ); } } } }
//============================================================================= // Code for shell //============================================================================= // Main loop void kStartConsoleShell( void ) { char vcCommandBuffer[CONSOLESHELL_MAXCOMMANDBUFFERCOUNT]; int iCommandBufferIndex = 0; BYTE bKey; int iCursorX, iCursorY; // Print prompt kPrintf( CONSOLESHELL_PROMPTMESSAGE ); while( 1 ) { // Wait for key bKey = kGetCh(); // If backspace if ( bKey == KEY_BACKSPACE ) { if ( iCommandBufferIndex > 0 ) { // Get current cursor point, move back on point // print white space, // delete last character in command buffer kGetCursor( &iCursorX, &iCursorY ); kPrintStringXY( iCursorX - 1, iCursorY, " " ); kSetCursor( iCursorX - 1, iCursorY ); iCommandBufferIndex--; } } // Process enter key else if ( bKey == KEY_ENTER ) { kPrintf( "\n" ); if ( iCommandBufferIndex > 0 ) { // Execute command in buffer vcCommandBuffer[iCommandBufferIndex] = '\0'; kExecuteCommand( vcCommandBuffer ); } // Print prompt and Initialize command buffer kPrintf( "%s", CONSOLESHELL_PROMPTMESSAGE ); kMemSet( vcCommandBuffer, '\0', CONSOLESHELL_MAXCOMMANDBUFFERCOUNT ); iCommandBufferIndex = 0; } // Ignore Shift key, Caps lock, Num lock, Scroll lock else if ( ( bKey == KEY_LSHIFT ) || ( bKey == KEY_RSHIFT ) || ( bKey == KEY_CAPSLOCK ) || ( bKey == KEY_NUMLOCK ) || ( bKey == KEY_SCROLLLOCK ) ) { ; } else { // Switch TAB to white space if ( bKey == KEY_TAB ) { bKey = ' '; } // If buffer have room if ( iCommandBufferIndex < CONSOLESHELL_MAXCOMMANDBUFFERCOUNT ) { vcCommandBuffer[iCommandBufferIndex++] = bKey; kPrintf( "%c", bKey ); } } } }
// Bootstrap Processor용 C 언어 커널 엔트리 포인트 void main( void ) { int iCursorX, iCursorY; // 부트 로더에 있는 BSP 플래그를 읽어서 Application Processor이면 // 해당 코어용 초기화 함수로 이동 if(*((BYTE*)BOOTSTRAPPROCESSOR_FLAGADDESS)==0) { mainForApplicationProcessor(); } // Bootstrap Processor가 부팅을 완료했으므로, 0x7C09에 있는 Bootstrap Processor를 // 나타내는 플래그를 0으로 설정하여 Application Processor용으로 코드 실행 경로를 변경 *((BYTE*)BOOTSTRAPPROCESSOR_FLAGADDESS)=0; // 콘솔을 먼저 초기화한 후, 다음 작업을 수행 kInitializeConsole( 0, 10 ); kPrintf( "Switch To IA-32e Mode Success~!!\n" ); kPrintf( "IA-32e C Language Kernel Start..............[Pass]\n" ); kPrintf( "Initialize Console..........................[Pass]\n" ); // 부팅 상황을 화면에 출력 kGetCursor( &iCursorX, &iCursorY ); kPrintf( "GDT Initialize And Switch For IA-32e Mode...[ ]" ); kInitializeGDTTableAndTSS(); kLoadGDTR( GDTR_STARTADDRESS ); kSetCursor( 45, iCursorY++ ); kPrintf( "Pass\n" ); kPrintf( "TSS Segment Load............................[ ]" ); kLoadTR( GDT_TSSSEGMENT ); kSetCursor( 45, iCursorY++ ); kPrintf( "Pass\n" ); kPrintf( "IDT Initialize..............................[ ]" ); kInitializeIDTTables(); kLoadIDTR( IDTR_STARTADDRESS ); kSetCursor( 45, iCursorY++ ); kPrintf( "Pass\n" ); kPrintf( "Total RAM Size Check........................[ ]" ); kCheckTotalRAMSize(); kSetCursor( 45, iCursorY++ ); kPrintf( "Pass], Size = %d MB\n", kGetTotalRAMSize() ); kPrintf("TCB Poll And Scheduler Initialize...........[Pass]\n"); iCursorY++; kInitializeScheduler(); // 동적 메모리 초기화 kPrintf("Dynamic Memory Initialize...................[Pass]\n"); iCursorY++; kInitializeDynamicMemory(); // 1ms당 한 번씩 인터럽트가 발생하도록 설정 kInitializePIT(MSTOCOUNT(1),1); kPrintf( "Keyboard Activate And Queue Initialize......[ ]" ); // 키보드를 활성화 if( kInitializeKeyboard() == TRUE ) { kSetCursor( 45, iCursorY++ ); kPrintf( "Pass\n" ); kChangeKeyboardLED( FALSE, FALSE, FALSE ); } else { kSetCursor( 45, iCursorY++ ); kPrintf( "Fail\n" ); while( 1 ) ; } kPrintf( "PIC Controller And Interrupt Initialize.....[ ]" ); // PIC 컨트롤러 초기화 및 모든 인터럽트 활성화 kInitializePIC(); kMaskPICInterrupt( 0 ); kEnableInterrupt(); kSetCursor( 45, iCursorY++ ); kPrintf( "Pass\n" ); // 파일 시스템을 초기화 kPrintf("File System Initialize......................[ ]"); if(kInitializeFileSystem()==TRUE) { kSetCursor(45,iCursorY++); kPrintf("Pass\n"); } else { kSetCursor(45,iCursorY++); kPrintf("Fail\n"); } // 시리얼 포트 초기화 kPrintf("Serial Port Initialize......................[Pass]\n"); iCursorY++; kInitializeSerialPort(); // 유후 태스크를 시스템 스레드로 생성하고 셸을 시작 kCreateTask(TASK_FLAGS_LOWEST | TASK_FLAGS_THREAD | TASK_FLAGS_SYSTEM | TASK_FLAGS_IDLE,0,0,(QWORD)kIdleTask,kGetAPICID()); // 그래픽 모드가 아니면 콘솔 셸 실행 if(*(BYTE*)VBE_STARTGRAPHICMODEFLAGADDRESS==0) { kStartConsoleShell(); } // 그래픽 모드면 그래픽 모드 테스트 함수 실행 else { kStartGraphicModeTest(); } }