컴퓨터의 기본에 대해 궁금한게 있습니다.

leedk의 이미지

컴퓨터 구조시간에 cpu를 배웠는데,

cpu는

메모리로부터 레지스터로 데이터 가져와서

가져온 데이터 가지고

더하기, 빼기, AND, OR, SHIFT, MOV, STORE

정도의 명령어를 수행하는 기능을 가지고 있는데요.

그럼, 모니터에 화면이 출력되는 데에 있어서,

CPU의 역할은 무엇입니까?

모니터의 화면은 끊임없이 변하는데, 이를테면 마우스를 움직이면 마우스가 움직이는 것을

화면에 출력해주는데,

이 과정에서 CPU는 어떤 역할을 하는 건지 궁금합니다.

그리고 저희가 프로그램을 짜서 printf("1") 라고 할 때

cpu는 어떻게 이 명령어를 수행하게 되는건지도 궁금합니다.

pritf("1") 는 운영체제의 system call 을 호출해서

운영체제가 해당 플랫폼에 맞게 구현한 루틴이 돌아갈 거 같은데...

이 루틴은 어떤 식으로 제작이 되었는지 궁금하네요...

neogeo의 이미지

상기의 부분은 기초적으로는 I/O mapped memory 라는 개념을 공부하시면 도움이 되실 것 입니다.

그리고 흔히 cpu 에선 interrupt 라는 녀석을 통해 특정 행동을 수행합니다. ( INT 23 등등 )

두 부분을 잘 보시면 쉽게 될 것입니다.

혹은 printf 를 직접 어셈블리로 제작해 보시면 더더욱 이해가 빠르실 것으로 생각합니다.

Neogeo - Future is Now.

Neogeo - Future is Now.

leedk의 이미지

interrupt는 1)외부장치로부터 cpu로 보내는 전기적 신호

2)커널 모드의 명령어 루틴인 시스템 콜을 수행하기 위한 방법

으로 사용이 되고 있는 걸로 알고 있습니다.

INT 23 이면, system call 을 호출하는 거 같은데요.

결국, 운영체제의 루틴을 통해 printf가 수행이 되는 거 같습니다.

결국, stdio.h 를 추적해 보기로 했습니다.

stdio.h를 열어보니,

extern int printf (__const char *__restrict __format, ...);

이렇게 나왔는데;;;

구현은 어느 파일에 되어 있는 건지;;

neogeo의 이미지

stdio.h 의 구현 내용은 보통 CRT Lib 안에 포함되어 있을경우가 많으므로 ( 혹은 libc ) 소스 보기는 힘들겠고,

따로 찾아보신다면 c lib 의 소스 형태를 찾아보시길 권합니다.

그러나 저 부분은 va_list 등을 사용하므로 이런 부분 이해하려고 하면 배가 산으로 갈 공산이 크니,

ASM 으로 구현된 화면 출력예제를 보시면 훨씬 이해가 빠를것으로 생각됩니다.

ASM으로 공부하시고 va_list 를 알면 printf 를 직접 구현하실 수 있을것입니다.

Neogeo - Future is Now.

Neogeo - Future is Now.

jick의 이미지

printf는 보기에 비해 무지무지무지무지하게 복잡한 함수입니다. C로 짜기도 힘듭니다.

예전에 glibc 소스 코드 구경한 기억으로는 printf 하나만 (C로) 몇천 줄 나왔던 걸로 기억하는데...

neogeo의 이미지

asm 으로 된 printf 를 보라는게 아니라 asm 으로 된 "화면출력예제" 를 보라고 한 것입니다.

그리고 간략한 printf 는 va_list 와 화면 출력예제 만으로 충분히 구현 할 수 있습니다.

Neogeo - Future is Now.

Neogeo - Future is Now.

정태영의 이미지

GUI 환경이라면 비디오 메모리에 있는 값을 조작하는 역할을 하겠죠. 물론 비디오 메모리에 접근하는 것은 위에서 얘기하신 Memory Mapped I/O 를 사용할테구요.

--
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

anfl의 이미지

다음과 같은 것을 공부해보세요.

- linux kernel
- device driver

저도 어릴때는 1 + 1이 왜 2가 되는지 알고난 후에 어떻게해서 키보드에 a를 누르면 화면에 a가 찍히는지가 궁금했었죠.
해서 kernel을 공부했는데 그기에 답이 있더군요.


댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.