* Cygwin이 자주 업데이트 되는 바람에 가상머신을 사용해서 개발하실 수 있도록 준비했습니다. 계속해서 빌드에 오류가 생기신다면 http://jsandroidapp.cafe24.com/xe/8920 에 가셔서 가상머신을 사용하시기 바랍니다. ^^

* 2014년 4월 13일자 Cygwin을 기준으로 내용이 업데이트 되었습니다 ^^

* 빌드에 문제가 생기거나 정상적으로 동작하지 않는다면, MINT64 OS 개발용 가상머신을 이용하세요 ^^

** 가상머신 이미지 다운로드: http://jsandroidapp.cafe24.com/xe/8920**

* 관련 내용은 64비트 멀티코어 OS 원리와 구조 QnA 사이트(www.mint64os.pe.kr)에서 계속 업데이트 되고 있습니다. ^^


제 책 "64비트 멀티코어 OS 원리와 구조" 가 나온지도 벌써 3년이 지났습니다. ^^;;; 책이 출간됨과 동시에 가장 많이 질문을 받는 것이 OS 제작을 위한 환경 구축 방법인데요...

얼마전부터 환경 구축에 어려움을 겪는 분들이 많아지셔서 Cygwin 최신 버전을 다운 받아서 빌드를 해봤습니다. ^^;;; 실제로 빌드를 진행하다보니 몇 가지 변경점이 보이더군요. ㅠㅠ 그래서 그 내용을 여기다가 정리해놓습니다. ㅠㅠ

<출처 - yes24.com>

ps1) 혹시 아래대로 수행했는데 빌드에 문제가 생기거나 정상적으로 동작하지 않는다면, 곧 업로드될 MINT64 OS 개발용 가상머신을 이용하세요 ^^ ps2) 안타깝게도 Cygwin에 덮어쓰는 방법은 이제 더이상 동작하지 않습니다.


Cross Compiler를 만들려면 먼저 Cygwin 사이트(http://www.cygwin.com/install.html)로 이동해서 32비트 Cygwin Installer를 다운로드 받습니다. Setup.exe 파일을 다운하면 됩니다. ^^;;;

다운로드 후 파일을 실행하면 어떻게 설치할 것이고 패키지 소스는 어디에서 다운 받을 것인지 선택하는 부분이 나오는데, 책에 나와있는 카이스트 사이트(ftp://ftp.kaist.ac.kr)가 더이상 유효하지 않으니 다른 사이트를 선택해야합니다.

우리나라 근처에 있는게 아무래도... 속도도 빠르니 가까운 일본 주소인 ftp://ftp.jaist.ac.jp를 선택하면 됩니다. ^^;;; 패키지 소스를 다운 받을 주소를 선택하고 난 뒤에는 "Select Package" 화면이 나올 때까지 적당히 Next를 선택해주면 됩니다. ^^;;;

"Select Package" 화면이 나오면 아래의 항목들을 설치해줍니다. 책을 쓸 때는 C++ 관련 항목이 없어도 정상적으로 빌드가 되었지만, 지금은 C++ 컴파일러를 설치하지 않으니 configure 중에 오류가 발생하더군요. ㅠㅠ

+Devel
    + binutils - 2.24.51-2 버전, 소스 및 바이너리 모두 설치
    + bison - 2.7.1-1 버전, 바이너리만 설치
    + flex - 2.5.35-1 버전, 바이너리만 설치
    + gcc-core - 4.8.2-2 버전, 소스 및 바이너리 모두 설치
    + gcc-g++ - 4.8.2-2 버전, 바이너리만 설치
    + libiconv - 1.14-2 버전, 바이너리만 설치
    + libtool - 2.4.1 버전, 바이너리만 설치
    + make - 4.0-2 버전, 바이너리만 설치
    + patchutils - 0.3.2-1 버전, 바이너리만 설치
+Libs
    + libgmp-devel - 6.0.0a-1 버전, 바이너리만 설치
    + libmpfr-devel -3.1.2-1 버전, 바이너리만 설치
    + libmpc-devel - 1.0.2-1 버전, 바이너리만 설치
    + libncurses-devel - 5.7-18 버전, 바이너리만 설치

위의 항목이 설치되고 나면 binutils부터 차례대로 빌드를 시작하면 됩니다.

binutils를 빌드하려면 /usr/src 디렉터리 아래에 있는 binutils 디렉터리로 이동해서 다음과 같은 순서로 커맨드를 입력하면 빌드와 설치가 끝납니다.

// 디렉터리 이동 후 아래 작업 수행
$> cd /usr/src/binutils-2.24.51-2   <== 디렉터리 이름은 binutils 버전에 따라 다를 수 있음    
$> export TARGET=x86_64-pc-linux
$> export PREFIX=/usr/cross
$> ./configure --target=$TARGET --prefix=$PREFIX --enable-64-bit-bfd --disable-shared --disable-nls
$> make configure-host
$> make LDFLAGS="-static"
$> make install

아래는 테스트를 위한 부분입니다. 아래처럼 커맨드를 실행했을 때 x86_64 관련 항목이 보이면 제대로 된 것입니다. ^^;;;;

$> /usr/cross/bin/x86_64-pc-linux-ld --help | grep "supported "
/usr/cross/bin/x86_64-pc-linux-ld: supported targets: elf64-x86-64 elf32-i386 a.
out-i386-linux efi-app-ia32 efi-bsdrv-ia32 efi-rtdrv-ia32 efi-app-x86_64 efi-bsd
rv-x86_64 efi-rtdrv-x86_64 elf64-little elf64-big elf32-little elf32-big srec sy
mbolsrec tekhex binary ihex
/usr/cross/bin/x86_64-pc-linux-ld: supported emulations: elf_x86_64 elf_i386 i38
6linux

binutils 빌드 및 설치가 끝났다면 gcc를 cross compile할 차례입니다. gcc는 아래와 같은 순서로 입력하면 빌드와 설치가 완료됩니다. ^^;;;

압축 해제, 파일명은 cygwin에서 다운받은 GCC 버전에 따라서 다를 수 있으니 실제 디렉터리를 확인하여 입력해야 합니다. ^^;;; 아래 패치 파일도 모두 마찬가지 입니다.

$> cd /usr/src
$> tar -xvf gcc-4.8.2.tar.bz2
$> export TARGET=x86_64-pc-linux
$> export PREFIX=/usr/cross
$> export PATH=$PREFIX/bin:$PATH

압축 해제가 끝났으니 소스가 있는 디렉터리 이동 후 나머지 작업 수행합니다.

$> cd /usr/src/gcc-4.8.2    <== 디렉터리 이름은 GCC 버전에 따라 다를 수 있음
$> ./configure --target=$TARGET --prefix=$PREFIX --disable-nls --enable-languages=c --without-headers --disable-shared --enable-multilib
$> make configure-host
$> make all-gcc
$> make install-gcc

빌드가 완료된 후 테스트용입니다. 아래와 같이 입력했을 때 m64가 보이면 정상적으로 설치된 것입니다.

$> /usr/cross/bin/x86_64-pc-linux-gcc -dumpspecs | grep -A1 multilib_options
*multilib_options:
m64/m32

빌드한 크로스 컴파일러는 MINT64 OS를 개발하는데 필요한 최소한의 환경만 구성되어 있습니다. 64비트 관련 gcc 라이브러리 등은 빌드되지 않은 상태이므로, 빌드된 컴파일러로 test.c 파일을 빌드했을 때 발생하는 오류는 무시하셔도 됩니다. ^^

자, 이제 64비트 바이너리를 생성할 수 있는 gcc가 생성되었으니, 즐거운 OS 프로그래밍하세요 ;)

64비트 멀티코어 OS 원리와 구조 세트가 출간된지 3년이 다 되어갑니다. 책에 대한 QnA 사이트가 필요해서 책 출간과 동시에 mint64os.pe.kr 사이트도 운영 중인데요, 지금까지 약 300개의 QnA가 달렸습니다. @0@)/~ (그중에 오탈자에 대한 문의도 다수 있다는 건 함정... 쿨럭..;;;)

<출처 - yes24.com>

질문에 대해서 답변을 달다보면 가끔 통찰력이 느껴지는 질문도 있는데요, 이런 질문들은 혼자보기가 아깝더라구요. ^^;;; 그래서 정리해서 공유하는게 어떨까하는 생각을 했습니다. 시간이 나는대로 틈틈이 정리해서 올려볼 예정이니 기대해주세요 >ㅁ<)/~

그럼 좋은 하루 되세요 ^^

OS 제작을 시도해본 분들은 아시겠지만...

OS를 개발하려면 PC 하드웨어부터 OS 관련 지식까지 많은 정보가 필요합니다. ^^;;;


저 역시 책도 많이 보고 웹 사이트도 많이 찾아다녔는데요,

OS를 개발할 때 도움이 되었던 책과 사이트를 정리해둘 필요가 있는 것 같아서 한자 남겨둡니다.


OS를 개발하시는 다른 분들에게 도움이 되었으면 좋겠네요.



책 목록



사이트 목록


그럼 즐거운 OS 프로그래밍하세요 ;)
제 책 "64비트 멀티코어 OS 원리와 구조"가 나온지도 벌써 3달이 다되어 가는군요. ^^ 부족한 책이지만 많은 분들이 구매해주신 덕분에 순조롭게 진행되고 있는 것 같습니다(물론 손익 분기점까지는 아직 멀었지만 말입니다 ㅠㅠ).

<64비트 멀티코어 OS 원리와 구조>



책의 내용 중에서 가장 많이 질문 받는 내용 중에 두 가지가 초반에 환경 구축할 때 크로스 컴파일러를 만드는 과정과 QEMU 0.10.4 버전을 어디서 구하는가 하는 것입니다. ^^;;; 그래서 얼마전에 Cygwin 최신 버전으로 64비트 크로스 컴파일러를 만드는 글(http://kkamagui.tistory.com/762)을 올렸습니다.

이번에는 QEMU 0.10.4 버전을 어디서 다운로드할 수 있는가 하는 것인데... 가장 간단한 방법은 여기에 올려드린 첨부 파일을 다운로드 하는 것입니다. ^^;;; QEMU 0.10.4 버전은 제가 MINT64 OS를 만들기 시작할 때 쓰던 버전이라... 지금은 구하기가 힘들기 때문이지요.


QEMU에 최신 OS를 설치하려면 최신 버전을 다운로드하시는게 아무래도 이득이겠지만, MINT64 OS를 실습하는데는 0.10.4 버전을 사용하시는 것이 정신의 평화와 안정을 유지하는데 도움이 되실겁니다. ^^;;;;

그럼 즐거운 OS 프로그래밍하세요 ;)

이번 주는 휴가도 있었고 해서 금방 주말이 오더군요. 그래서 그런지 주말이 아주 짧은 것 같습니다. ㅠㅠ 뭐 어제가 금요일인 것 같은데... 벌써 일요일 오후군요. ㅠㅠ(이 짧은 문장 치는데 ㅠㅠ가 몇 번이나 들어갔는지... 어흑... ㅠㅠ)

“회사일 + 프로그램 개발 + 드라이버 업데이트”이 세 가지가 한꺼번에 들이 닥치는 바람에 한 주가 정말 정신 없이 지나갔습니다. 하루는 해 뜨는 거 보고 바로 출근하는 기염을 토하기도 했지요. ㅠㅠ 어흑... 그래서 주말은 내내 잠만 잔 것 같습니다(헉... 그래서 주말이 짧은 건가...^^;;)

아무리 피곤해도 MINT64 OS는 진행해야 하는지라... 졸린 눈을 비비며 작업한 결과~!!! 일단 대칭 I/O 모드(Symmetric I/O Mode)로 전환은 시켰습니다. 대칭 I/O 모드가 무엇인고 하니, 멀티 프로세서나 멀티코어 프로세서를 사용할 때 여러 코어에 인터럽트를 전달하는 방식을 말합니다. 이렇게 하려면 PIC 컨트롤러가 아닌 I/O APIC와 로컬 APIC를 사용해서 인터럽트를 처리해야 합니다. ㅎㅎ 이제 다른 OS들처럼 인터럽트 로드 밸런싱(Interrupt Load Balancing) 정도는 할 수 있는 거죠. ;)

image

<대칭 I/O 모드(Symmetric I/O Mode)> 

예전에 프로토타입을 만들 때는 인터럽트 로드 밸런싱 처리가 상당히 복잡했는데... 이번에는 아주 간단하게 끝냈습니다. ㅡ_ㅡa.. 역시 두어번은 짜봐야 제대로 된 로직이 나오는가 봅니다(사실 제가 허접해서... ㅡ_ㅡa...). 자세한 방법은 인터럽트 로드 밸런싱까지 처리되면 Milestone에 올리겠습니다. ㅎㅎ

아흐~ 오늘은 집 정리도 하기로 했는데... 시간이 좀 촉박할 것 같기도 하군요. 일단 또 한번 달려 봐야겠습니다. 다들 남은 주말 마무리 잘하세요 ;)

ps) 그냥 아무것도 안올리기가 뭐 해서, 대칭 I/O 모드로 전환해서 하드 디스크를 읽은 화면을 올립니다. ㅡ_ㅡa...

image

아우~ 이번 내용에 대한 정리는 지난 주부터 시작했는데, 이것 저것 일이 많아서 진도가 굉장히 안 나가는군요. ㅠㅠ 특히 온 주말을 디버깅에 투자했더니 더 그런 것 같습니다. ㅎㅎ 사실 한번 만들었던 걸 다시 만들려니 더 진도가 안 나가는 것 같기도 하네요. ㅎㅎ

드디어 기나긴 어셈블리어의 늪을 빠져 나와 C 코드로 접어들었습니다. 이제 대부분의 작업을 C 코드로 할 수 있겠군요. ㅎㅎ 물론 중간 중간에 꼭~!!! 어셈블리어로 처리해야 하는 부분이 있어서 완전히 빠져 나왔다고 보기는 어렵지만, 어찌되었든 C 코드를 쓸 수 있다는 데 의의가 있으니... ^^;;;

아흙...회식에서 술을 좀 퍼먹고 왔더니, 체력이 거의 바닥입니다. ㅎㅎ 자면서 코딩해서 내일 다시 뒤집어 엎는 게 아닌가 슬슬 걱정이 되는군요. 일단 뭐 대충 이만하면 됐으니 그만 자야겠습니다.

다들 좋은 밤 되세요 ;)

요즘 일 때문에 MINT64 OS라는 이름으로 새로 코드를 정리하고 있습니다. ㅎㅎ 이번에는 부트 로더에 OS 이미지를 로딩하는 기능을 추가하는 내용 때문에 만들었는데, 로딩하는 기능을 만들고 나니 커널이 없어서 테스트할 수가 없더군요. ㅠㅠ 그래서 가상 OS 이미지를 만든 후, 이를 부트 로더가 로딩하여 실행하도록 했습니다.

1024 섹터의 가상 OS 이미지를 만들어야 했는데, 처음에는 코드 블럭을 매크로를 만들어서 반복하려고 했습니다. 그런데 동일한 매크로를 1024번 반복해서 입력하려니 이것도 일이더군요. ㅡ_ㅡa.. 그래서 NASM 문서를 살펴봤더니 묘수가 떠올랐습니다. 바로 전처리기 문법을 사용하는 것입니다. 전처리기를 사용하니 엄청 간단하게 되더군요. @0@)-b 나중에 NASM 전처리기 문법에 대해서도 한번 정리할 필요가 있을 것 같습니다.  ㅎㅎ

아래는 가상 OS 이미지를 부트 로더가 로딩한 후 실행한 화면입니다. 1024개의 0~9가 정상적으로 실행되었다는 것을 표시하고 있습니다.

이제 조금만 더 정리하면 32bit 커널까지 가겠군요. 어찌 이래 갈 길이 먼지... ㅎㅎ 진짜 시간이 장난 아니게 걸리네요. ㅎㅎ 뭐 설마 밑 빠진 독에 물 붓기겠습니까? ^^;;; 언젠가는 차겠지요. ㅎㅎ

에궁~ 이만 자야겠습니다. 다들 좋은 밤 되세요. ㅎㅎ

아아~ 이거 글 쓰는 일이 쉽지 않군요. 챕터 하나 쓰는데 거의 3주 동안 하고 있습니다. 물론 그 중에 2주는 퇴근을 완전 늦게 해서 작업할 시간이 부족한 것도 있지만… 내용 자체가 워낙 많다 보니 장난이 아닙니다. @0@

지금 A4로 거의 30쪽째 쓰고 있는데, 퇴고 할 때마다 자꾸 내용이 추가됩니다. ㅠㅠ 챕터의 주제는 64bit 프로세서에 대한 내부 설명입니다만, 왜 이걸 넣었는지 후회가 되는군요. 실제로 코딩을 진행하면서 각 챕터 관련된 부분은 다시 설명할 예정이라 간단하게 정리하려고 시작했는데, x86-64 프로세서가 워낙 복잡하다 보니 쉽게 끝나지가 않습니다.

리얼 모드 + 보호 모드 + IA-32e 모드의 3가지에 대해서 각각 세그먼테이션, 페이징에 대해 설명하니 총 5개 정도가 되고, 그 앞에 각종 레지스터와 모드에 대한 설명이 또 들어가니 양이 정말 장난 아닙니다. ㅠㅠ 쓰는 것도 일이지만 퇴고하는 것도 일이군요. 어제 오늘 거의 4시간씩 투자하면서 읽고 수정했는데 아직 1/3이 남았다는… 크윽…

그래도 이번 챕터만 지나가면 다음부터는 직접 코딩하면서 만드는 과정이기 때문에, 이렇게 오래 걸리진 않을 꺼라 생각합니다. (사실 이거 하나 보고 계속 달리고 있는 중입니다. ㅠㅠ 도중에 몇번이나 목차에서 챕터를 날리고 싶은 충동이 밀려와서… ㅠㅠ)

아흑… 또 시간이 이렇게 흘렀군요. 언능 자고 내일도 최대한 빨리 와서 마무리 해야겠습니다. 에궁… 진짜 이건 아닌데… ㅠㅠ

그럼 다들 좋은 밤 되시길 ;)

+ Recent posts