/** * 아래 함수는 C 언어 커널의 시작 부분임 * 반드시 다른 함수들 보다 가장 앞쪽에 존재해야 함 */ void Main( void ) { DWORD i; kPrintString( 0, 3, "C Language Kernel Start.....................[Pass]" ); // 최소 메모리 크기를 만족하는 지 검사 kPrintString( 0, 4, "Minimum Memory Size Check...................[ ]" ); if( kIsMemoryEnough() == FALSE ) { kPrintString( 45, 4, "Fail" ); kPrintString( 0, 5, "Not Enough Memory~!! MINT64 OS Requires Over " "64Mbyte Memory~!!" ); while( 1 ) ; } else { kPrintString( 45, 4, "Pass" ); } // IA-32e 모드의 커널 영역을 초기화 kPrintString( 0, 5, "IA-32e Kernel Area Initialize...............[ ]" ); if( kInitializeKernel64Area() == FALSE ) { kPrintString( 45, 5, "Fail" ); kPrintString( 0, 6, "Kernel Area Initialization Fail~!!" ); while( 1 ) ; } kPrintString( 45, 5, "Pass" ); while( 1 ) ; }
// 공용 Exception Handler void kCommonExceptionHandler(int iVectorNumber, QWORD qwErrorCode) { char vcBuffer[3] = {0}; // Printing Interrupt Vector vcBuffer[0] = '0' + iVectorNumber / 10; vcBuffer[1] = '0' + iVectorNumber % 10; kPrintString(0, 0, "======================================================"); kPrintString(0, 1, " Exception Occur "); kPrintString(0, 2, " Vector: "); kPrintString(27, 2, vcBuffer); kPrintString(0, 3, "======================================================"); //while(1); }
// 키보드 인터럽트 핸들러 void kKeyboardHandler(int iVectorNumber) { char vcBuffer[] = "[INT: , ]"; static int g_iKeyboardInterruptCount = 0; BYTE bTemp; //============================================================ // Interrupt 발생 메시지 출력 // Interrupt Vector 출력 vcBuffer[5] = '0' + iVectorNumber / 10; vcBuffer[6] = '0' + iVectorNumber % 10; // Interrupt 발생 횟수 출력 vcBuffer[8] = '0' + g_iKeyboardInterruptCount; g_iKeyboardInterruptCount = (g_iKeyboardInterruptCount + 1) % 10; kPrintString(0, 0, vcBuffer); //============================================================ // 키보드 컨트롤러에서 데이터를 읽어서 ASCII로 변환하여 큐에 삽입 if(kIsOutputBufferFull() == TRUE) { bTemp = kGetKeyboardScanCode(); kConvertScanCodeAndPutQueue(bTemp); } // Send EOI. kSendEOIToPIC(iVectorNumber - PIC_IRQSTARTVECTOR); }
// 공용 Interrupt Handler void kCommonInterruptHandler(int iVectorNumber) { char vcBuffer[] = "[INT: , ]"; static int g_iCommonInterruptCount = 0; //============================================================ // Interrupt 발생 메시지 출력 // Interrupt Vector 출력 vcBuffer[5] = '0' + iVectorNumber / 10; vcBuffer[6] = '0' + iVectorNumber % 10; // Interrupt 발생 횟수 출력 vcBuffer[8] = '0' + g_iCommonInterruptCount; g_iCommonInterruptCount = (g_iCommonInterruptCount + 1) % 10; kPrintString(70, 0, vcBuffer); //============================================================ // Send EOI. kSendEOIToPIC(iVectorNumber - PIC_IRQSTARTVECTOR); }
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) { DWORD i; DWORD dwEAX, dwEBX, dwECX, dwEDX; char vcVendorString[13]={0,}; // Application Processor이면 아래의 코드를 생략하고 바로 64비트 모드로 전환 if(*((BYTE*)BOOTSTRAPPROCESSOR_FLAGADDRESS)==0) { kSwitchAndExecute64bitKernel(); while(1); } //======================================================================================== // BSP만 수행하는 코드 //======================================================================================== kPrintString(0,3,"Protected Mode C Language kernel start........................[Pass]"); // 최소 메모리 크기를 만족하는 지 검사 kPrintString(0,4,"Minimum Memory Size Check...................[ ]"); if(kIsMemoryEnough()==FALSE) { kPrintString(45,4,"Fail"); kPrintString(0,5,"Not Enough Memory~!! MINT64 OS Requires Over 64MByte Memory~!!"); while(1); } else { kPrintString(45,4,"Pass"); } // IA-32e 모드의 커널 영역을 초기화 kPrintString(0,5,"IA-32e kernel Area Initialize...............[ ]"); if(kInitializeKernel64Area()==FALSE) { kPrintString(45,4,"Fail"); kPrintString(0,4,"Kernel Area Initialization Fail~!!"); while(1); } kPrintString(45,5,"Pass"); // IA-32e 모드 커널을 위한 페이지 테이블 생성 kPrintString(0,6,"IA-32e Page Tables Initialize...............[ ]"); kInitializePageTables(); kPrintString(45,6,"Pass"); // 프로세서 제조사 정보 읽기 kReadCPUID(0x00,&dwEAX,&dwEBX,&dwECX,&dwEDX); *(DWORD*)vcVendorString=dwEBX; *((DWORD*)vcVendorString+1)=dwEDX; *((DWORD*)vcVendorString+2)=dwECX; kPrintString(0,7,"Processor Vendor String.....................[ ]"); kPrintString(45,7,vcVendorString); // 64비트 지원 유무 확인 kReadCPUID(0x80000001,&dwEAX,&dwEBX,&dwECX,&dwEDX); kPrintString(0,8,"64bit Mode Support Check....................[ ]"); if(dwEDX&(1<<29)) { kPrintString(45,8,"Pass"); } else { kPrintString(45,8,"Fail"); kPrintString(0,9,"This processor does not support 64bit mode~!!"); while(1); } // IA-32e 모드 커널을 0x200000(2Mbyte) 어드레스로 이동 kPrintString(0,9,"Copy IA-32e kernel To 2M Address............[ ]"); kCopyKernel64ImageTo2Mbyte(); kPrintString(45,9,"Pass"); // IA-32e 모드로 전환 kPrintString(0,10,"Switch To IA-32e Mode"); kSwitchAndExecute64bitKernel(); while(1); }
// Main 함수 void Main(void) { kPrintString( 0, 3, "C Language Kernel Started~!!!" ); while(1); }
void Main(void){ DWORD i; DWORD dwEAX, dwEBX, dwECX, dwEDX; char vcVendorString[13] = {0, }; kPrintString(0, 3, "C Language Kernel Start.....................[Pass]"); kPrintString(0, 4, "Minimum Memory Size Check...................[ ]"); if(kIsMemoryEnough() == FALSE){ kPrintString(45, 4, "Fail"); kPrintString(0, 5, "Not Enought Memory. Current memory size is lower than 64MB"); while(1); } else{ kPrintString(45, 4, "Pass"); } kPrintString(0, 5, "IA-32e Kernel Area Initialize...............[ ]"); if(kInitializeKernel64Area() == FALSE){ kPrintString(45, 5, "Fail"); } kPrintString(45, 5, "Pass"); kPrintString(0, 6, "IA-32e Page Tables Initialize...............[ ]"); kInitializePageTables(); kPrintString(45, 6, "Pass"); kReadCPUID( 0x00, &dwEAX, &dwEBX, &dwECX, &dwEDX ); *(DWORD *)vcVendorString = dwEBX; *(DWORD *)vcVendorString = dwEDX; *(DWORD *)vcVendorString = dwECX; kPrintString(0, 7, "Processor Vendor String.....................[ ]"); kPrintString(45, 7, vcVendorString); kReadCPUID(0x80000001, &dwEAX, &dwEBX, &dwECX, &dwEDX); kPrintString(0, 8, "64bit Mode Support Check....................[ ]"); if(dwEDX & ( 1 << 29)){ kPrintString(45, 8, "Pass"); } else{ kPrintString(45, 8, "Fail"); kPrintString(0, 9, "This processor does not support 64bit mode"); while(1); } kPrintString(0, 9, "Switch to IA-32e Mode"); // kSwitchAndExecute64bitKernel(); while(1); }
/** * 아래 함수는 C 언어 커널의 시작 부분임 */ void Main( void ) { char vcTemp[ 2 ] = { 0, }; BYTE bTemp; int i = 0; KEYDATA stData; kPrintString( 0, 10, "Switch To IA-32e Mode Success~!!" ); kPrintString( 0, 11, "IA-32e C Language Kernel Start..............[Pass]" ); kPrintString( 0, 12, "GDT Initialize And Switch For IA-32e Mode...[ ]" ); kInitializeGDTTableAndTSS(); kLoadGDTR( GDTR_STARTADDRESS ); kPrintString( 45, 12, "Pass" ); kPrintString( 0, 13, "TSS Segment Load............................[ ]" ); kLoadTR( GDT_TSSSEGMENT ); kPrintString( 45, 13, "Pass" ); kPrintString( 0, 14, "IDT Initialize..............................[ ]" ); kInitializeIDTTables(); kLoadIDTR( IDTR_STARTADDRESS ); kPrintString( 45, 14, "Pass" ); kPrintString( 0, 15, "Keyboard Activate And Queue Initialize......[ ]" ); // 키보드를 활성화 if( kInitializeKeyboard() == TRUE ) { kPrintString( 45, 15, "Pass" ); kChangeKeyboardLED( FALSE, FALSE, FALSE ); } else { kPrintString( 45, 15, "Fail" ); while( 1 ) ; } kPrintString( 0, 16, "PIC Controller And Interrupt Initialize.....[ ]" ); // PIC 컨트롤러 초기화 및 모든 인터럽트 활성화 kInitializePIC(); kMaskPICInterrupt( 0 ); kEnableInterrupt(); kPrintString( 45, 16, "Pass" ); while( 1 ) { // 키 큐에 데이터가 있으면 키를 처리함 if( kGetKeyFromKeyQueue( &stData ) == TRUE ) { // 키가 눌러졌으면 키의 ASCII 코드 값을 화면에 출력 if( stData.bFlags & KEY_FLAGS_DOWN ) { // 키 데이터의 ACII 코드 값을 저장 vcTemp[ 0 ] = stData.bASCIICode; kPrintString( i++, 17, vcTemp ); // 0이 입력되면 변수를 0으로 나누어 Divide Error 예외(벡터 0번)을 // 발생시킴 if( vcTemp[ 0 ] == '0' ) { // 아래 코드를 수행하면 Divide Error 예외가 발생하여 // 커널의 임시 핸들러가 수행됨 bTemp = bTemp / 0; } } } } }
void Main( void ) { kPrintString( 0, 10, "Switch To IA-32e Mode Success~!!" ); kPrintString( 0, 11, "IA-32e C Language Kernel Start..............[Pass]" ); }