コード例 #1
0
ファイル: Main.c プロジェクト: SanguineGITHUB/source
/**
 *  아래 함수는 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 ) ;
}
コード例 #2
0
ファイル: InterruptHandler.c プロジェクト: liam38/MINT64
// 공용 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);
}
コード例 #3
0
ファイル: InterruptHandler.c プロジェクト: liam38/MINT64
// 키보드 인터럽트 핸들러
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);
}
コード例 #4
0
ファイル: InterruptHandler.c プロジェクト: liam38/MINT64
// 공용 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);
}
コード例 #5
0
ファイル: Main.c プロジェクト: myroomun/GIT_LunarOS
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();
}
コード例 #6
0
ファイル: main.c プロジェクト: cocojk/os
// 아래 함수는 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);
	
}
コード例 #7
0
ファイル: Main.c プロジェクト: ule1004/AliceOS
// Main 함수
void Main(void)
{
	kPrintString( 0, 3, "C Language Kernel Started~!!!" );

	while(1);
}
コード例 #8
0
ファイル: Main.c プロジェクト: cd80/mint64os
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);
}
コード例 #9
0
ファイル: Main.c プロジェクト: SanguineGITHUB/source
/**
 *  아래 함수는 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;
                }
            }
        }
    }
}
コード例 #10
0
ファイル: Main.c プロジェクト: SanguineGITHUB/MINT64
void Main( void )
{
    kPrintString( 0, 10, "Switch To IA-32e Mode Success~!!" );
    kPrintString( 0, 11, "IA-32e C Language Kernel Start..............[Pass]" );
}