2013-03-09 3 views
6

문자열을 인쇄하는 자체 포함 C 함수를 만들고 싶습니다. 이것은 운영 체제의 일부이므로, stdio.h을 사용할 수 없습니다. stdio.h을 사용하지 않고 전달한 문자열을 출력하는 함수는 어떻게 만들 수 있습니까? 어셈블리에 써야합니까?문자열을 인쇄하는 자체 C 루틴

+0

운영 체제가 무엇을 참조 이것에 대해 더 배우고, 다른 osdev 주제하려면? – md5

+1

stdio.h 내부를 살펴 보았습니까? – JuanPi

+0

@JuanPi OP는'stdio.h '를 사용할 수 없다고 말했다. – Rob

답변

3

BSD 라이선스가있는 FreeBSD C 라이브러리의 stdio functions으로 소스를 보거나 사용하는 것이 좋습니다.

출력을 실제로 생성하려면 출력 장치에 문자를 쓸 수있는 최소한의 기능이 필요합니다. 이를 위해 stdio 루틴은 결국 커널에 syscall을 수행하는 write을 호출합니다.

+0

OP가 "운영 체제의 일부"가 되길 원한다면 OP는이를 구현하는 운영 체제 호출을 합리적으로 사용할 수 없습니다. –

+0

@IraBaxter : 예. 그것은 그가 이행해야 할 부분 일 것입니다. 나는 BSD 커널을 사용하지 않는다는 것이 분명하다고 생각했다. – sfstewman

+1

당신은 기본적으로 C 라이브러리를 취미 OS에 이식하는 것에 대해 이야기하고 있습니다.이 작업은 일반적으로해야 할 일이지만, 길을가는 길은 길입니다. 아마 비디오 메모리에 직접 읽고 쓰기를 시작해야합니다. –

4

X86 PC에서 이것을 수행한다고 가정하면 주소가 0xB8000 인 비디오 메모리를 직접 읽고 써야합니다. 컬러 모니터의 경우 색상을 나타낼 수있는 ASCII 문자 바이트와 속성 바이트를 지정해야합니다. 이 메모리에 액세스 할 때 매크로를 사용하는 것이 일반적입니다.

#define VIDEO_BASE_ADDR 0xB8000 
#define VIDEO_ADDR(x,y) (unsigned short *)(VIDEO_BASE_ADDR + 2 * ((y) * SCREEN_X_SIZE + (x))) 

그런 다음 자신의 IO 루틴을 작성합니다. 아래는 화면 버퍼에서 쓰는 데 사용했던 간단한 함수입니다. 조잡한 스크롤링 기능을 구현하는 데이 방법을 사용했습니다.

void c_write_window(unsigned int x, unsigned int y, unsigned short c) 
{ 
    if ((win_offset + y) >= BUFFER_ROWS) { 
    int overlap = ((win_offset + y) - BUFFER_ROWS); 
    *VIDEO_ADDR(x,y) = screen_buffer[overlap][x] = c; 
    } else { 
    *VIDEO_ADDR(x,y) = screen_buffer[win_offset + y][x] = c; 
    } 
} 

http://wiki.osdev.org/Printing_To_Screen

+3

"문자 매핑 된"비디오 메모리를 구현하는 시스템/그래픽 카드에서만 가능합니다. PC 하드웨어, 즉 "VGA"유형 BIOS가있는 그래픽 카드가있는 x86/x64 기반 컴퓨터를 제외하고는 (원하는 경우 장치 드라이버 유형이라고 함) 이는 그렇지 않습니다. PC 유형 그래픽 카드의 문자 매핑 기능은 카드 하드웨어가 아닌 BIOS에 의해 수행됩니다. 예를 들어, RaspberryPI에서 이렇게하려면 _Framebuffer Device Driver_를 작성해야합니다. 따라서 VGA BIOS 기능의 사용은'write()'시스템 호출을 통해 콘솔 유형 드라이버를 사용하는 것과는 많이 다릅니다. –

관련 문제