Search

'CLKH64 OS'에 해당되는 글 37건

  1. 2013.01.19 11장 깨달은거 1

11장 깨달은거

CLKH64 OS/11장 2013. 1. 19. 18:33 Posted by 알 수 없는 사용자

1. NASM에서 빌드하는 Asm파일은 헤더와는 아무런 상관이 없다.

global로 선언 되어있으면 어디서든지 참조 가능. 심지어 Extern이 없어도, 그리고 C나 헤더파일에서 선언을 안해도! 사용 가능하다.

단지 링커가 연결해줄 뿐이다. 헤더파일은 C파일과 엮여서 오브젝트 파일이 된다는걸 기억하자.

 

2. 인라인 어셈은 Calling Convention과 관계가 없다. C언어 안에서 호출되기 때문이다.

따라서 굳이 asm volatile 부분에서 push eax 이딴짓 안해도 된다. 그건 이미 어셈구문을 포함하는 C함수 들어오면서 한거.

내가 할일은 변수의 출력과 입력을 짝지어주면 되는거다.

 

3. kWritePortByte, KReadPortByte 포팅한거

AssemblyUtility.asm

InlineAssemblyUtility.c

InlineAssemblyUtility.h

ㅁㄴㅇ

#include "InlineAssemblyUtility.h"

BYTE kReadPortByte(WORD wPort)
{
	BYTE bData;

	__asm__ __volatile__ (
							"mov	$0, %%rax\n"
							"in	%%dx, %%al\n"
							:"=a"(bData)
							:"d"(wPort)
	);

	return bData;

}

void kWritePortByte(WORD wPort, BYTE bData)
{
	__asm__ __volatile__ (
							"out	%%al,	%%dx\n"
							:
							:"d"(wPort), "a"(bData)
	);
}

 

4. Keyboard 함수 포팅한거. 원래껀 Waiting하는걸 모듈화 안해놨었다.

Keyboard.c

 

 

void kWaitingInputBuffer(BOOL bAction)
{
	int i;

	for (i = 0; i < 0xFFFF; i++)
	{
		if (kIsInputBufferFull() == bAction) {
			break;
		}
	}
}

void kWaitingOutputBuffer(BOOL bAction)
{
	int i;

	for (i = 0; i < 0xFFFF; i++) {
		if (kIsOutputBufferFull() == bAction) {
			break;
		}
	}
}

void kWaitingInputBufferEmpty(void)
{
	kWaitingInputBuffer(FALSE);
}

void kWaitingOutputBufferFull(void)
{
	kWaitingOutputBuffer(TRUE);
}

BOOL kIsOutputBufferFull(void)
{
	// Controller Command Register.OUTB(0)
	if (kReadPortByte(0x64) & 0x01)
	{
		return TRUE;
	}

	return FALSE;
}

BOOL kIsInputBufferFull(void)
{
	// Controller Command Register.INPB(1)

	if (kReadPortByte(0x64) & 0x02) {
		return TRUE;
	}

	return FALSE;
}



BOOL kWaitingAckFromKeyboard(void)
{
	int i;

	for(i = 0; i<100; i++) {
		kWaitingOutputBufferFull();

		// 0xFA == ACK
		if ( kReadPortByte(0x60) == 0xFA ) {
			return TRUE;
		}
	}

	return FALSE;
}

 

'CLKH64 OS > 11장' 카테고리의 다른 글

오늘의 핫한 이슈, 가상메모리  (0) 2013.01.21
11장 Calling convention, ABI  (0) 2013.01.19
8042 datasheet  (0) 2013.01.19