O/S 만들기 위한 hello world(?)에 대해서..

shs0917의 이미지

요즘 틈틈히 OS 만드는거를 공부하고 있는데.. ROM에서 절대로더를 부르는 코드를 대체 어떤 식으로 작성해서 어떻게 실행해야 하는지가 궁금합니다.
전체적인 흐름만 좀 알고 싶은데.. 한수 부탁 드립니다.

charsyam의 이미지

음냐, 일단 전원이 들어와서 바이오스로 제어가 넘어가면, 일단 바이오스는 부팅 매체를 찾습니다. 하드디스크, 플로피, 씨디롬 등요, 그리고 그 우선순위 대로 매체가 있으면(우선순위는 바이오스에 설정하죠) 거기의 MBR(Master Boot Sector) 라는 첫번째 섹터를 읽어서 메모리의 0000:7c00 번지로 데이터를 복사한 다음 그 쪽으로 제어를 옮깁니다. 그러면 이제 그 루틴이 실행이 되는거죠. 리눅스 소스나, 작은 OS 소스들을 보면 그 내용이 많이 들어있습니다. 고운 하루되시길...

=========================
CharSyam ^^ --- 고운 하루
=========================

shs0917의 이미지

감사합니다.. 결국 BOIS가 알아서 부팅 매체를 찾는다는 말씀이시죠?
MBR에다가 hello 출력하는 코드 넣어두면.. 이걸로 부팅 시키면
hello를 찍을수 있는게 맞는건가요?? 제가 잘못 이해했낭..
어쨌거나 저쨌거나.. 한번 부트로더에 관련된 소스를 한번 찾아봐야 겠습니다.

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

simpid의 이미지

shs0917 wrote:
감사합니다.. 결국 BOIS가 알아서 부팅 매체를 찾는다는 말씀이시죠?
MBR에다가 hello 출력하는 코드 넣어두면.. 이걸로 부팅 시키면
hello를 찍을수 있는게 맞는건가요?? 제가 잘못 이해했낭..
어쨌거나 저쨌거나.. 한번 부트로더에 관련된 소스를 한번 찾아봐야 겠습니다.

물론 MBR에 hello출력하는 코드를 넣어두면 출력이 되긴 합니다.
하지만 해야할께 많습니다.

CPU종류에 따라 다르겠지만... x86이라고 가정하면
CPU의 동작 모드 설정하고... 그 모드에 따라 세그먼트 레지스터나 디스크립터를 적절하게 설정하여야 하며, 각종 인터럽트 핸들러 만들어야 합니다.

PC의 BIOS코드를 그대로 사용할 수 있게 잘 설정한다면 Hello를 조금 쉽게 출력할 수 있지만... 일단은 모든 하드웨어를 직접 제어해야 하구요.

재미있는 주제이지만 참으로 공부할께 많죠.
하지만 Linux나 Minix의 소스는 공개되어 있으니까 공부할 수 있는 소스는 충분히 많습니다.

좋은 결과 얻으시기 바랍니다.

shs0917의 이미지

아.. 해야할게 아주 많은가보네요.. 쩝.. 다음달 가기 전에 hello 출력하는게
목표입니다.. :oops: 제가 작성한 코드로 비록 아무것도 할 수 없더라도
컴퓨터를 깨울수 있을거란 생각에 벌써부터 두근거리네요..ㅎㅎ

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

charsyam의 이미지

shs0917 wrote:
아.. 해야할게 아주 많은가보네요.. 쩝.. 다음달 가기 전에 hello 출력하는게
목표입니다.. :oops: 제가 작성한 코드로 비록 아무것도 할 수 없더라도
컴퓨터를 깨울수 있을거란 생각에 벌써부터 두근거리네요..ㅎㅎ

오직 목표가 Hello, World 의 출력이시라면야 -_- 뭐, 그렇게 힘들지는 않습니다. ^^ 하지만, 좀더 OS 다운걸 만드실려면 다함께 삽질을 ^^

kernel-mania.org 로 와보시는것도 ^^ 좋으실듯

고운 하루되세요.

=========================
CharSyam ^^ --- 고운 하루
=========================

RedPain의 이미지

부팅하면 부트로더가 0x7C00으로 올라가구요.
리얼모드 상태니까 그냥 바이오스 펑션 쓰면 됩니다.
어셈블링할 때 ELF나 a.out으로 만들면 안 됩니다.
플로피 디스크에 만든다고 가정했을 때 $ cat bootimage > /dev/fd0 라고 하시면 됩니다.
바이오스가 512byte만 올리기 때문에 크기는 512byte를 넘으면 안 됩니다.
마지막 2 byte는 0xAA55로 해야 합니다.
이것이 있어야 바이오스가 이것을 부트로더로 인식하고 메모리에 올립니다.
즉, 메직넘버죠.
흠...대충 생각나는 데로 주절주절 썼습니다.
도움이 되셨으면 좋겠군요. ^^
좋은 하루되세요. ^^

envia의 이미지

----

It is essential, if man is not to be compelled to have recourse, as a last resort, to rebellion against tyranny and oppression, that human rights should be protected by the rule of law.
[Universal Declaration of Human Rights]

shs0917의 이미지

아.. 답변이 아주 많이 올라오는군요.. 이렇게 많은 관심을 보여주실줄이야..
아.. 물론 헬로우만 찍고 그만둘건 아닙니다. 올해 작품 발표회때..
콘솔 모드 정도는 구현해보고 싶어서.. 요즘 자료구조도 공부하고..
이것저것 다른 것들도 많이 보고 있는데요.. 휴.. 정말 알아야 할것이 왜
이리도 많은건지.. 답변하신것 중에 리얼모드에서 그냥 BIOS 펑션 쓰시면
된다고 하셨는데.. 제가 OS제작의 정석이란 책을 조금 봤는데..
거기 말로는 멀티태스킹을 지원하려면 이렇게 리얼모드로 띄우면
안된다고 되어 있었던 걸로 기억합니다. 제가 잘못 이해한건지..
다시 한번 봐야 겠네요.

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

Prentice의 이미지

shs0917 wrote:
거기 말로는 멀티태스킹을 지원하려면 이렇게 리얼모드로 띄우면
안된다고 되어 있었던 걸로 기억합니다.

멀티태스킹을 하시려면 리얼 모드에서 프로텍티드 모드로 전환을 언젠가(?)는 하셔야겠죠.. ==33=3
charsyam의 이미지

shs0917 wrote:
아.. 답변이 아주 많이 올라오는군요.. 이렇게 많은 관심을 보여주실줄이야..
아.. 물론 헬로우만 찍고 그만둘건 아닙니다. 올해 작품 발표회때..
콘솔 모드 정도는 구현해보고 싶어서.. 요즘 자료구조도 공부하고..
이것저것 다른 것들도 많이 보고 있는데요.. 휴.. 정말 알아야 할것이 왜
이리도 많은건지.. 답변하신것 중에 리얼모드에서 그냥 BIOS 펑션 쓰시면
된다고 하셨는데.. 제가 OS제작의 정석이란 책을 조금 봤는데..
거기 말로는 멀티태스킹을 지원하려면 이렇게 리얼모드로 띄우면
안된다고 되어 있었던 걸로 기억합니다. 제가 잘못 이해한건지..
다시 한번 봐야 겠네요.

멀티 태스킹을 하는것과 Hello, World 를 출력하는 것은 천지차이입니다.
(뭐, 그렇게 까지는 아니지만 ^^), 리얼모드에서는 Bios 콜을 이용해서 출력을 할 수 있지만, 프로텍테드 모드에서는 기본적으로 I/O를 통해서 해야합니다. 그리고, 메모리도 관리해야 되고 할께 많죠 고운 하루되세요.

=========================
CharSyam ^^ --- 고운 하루
=========================

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.