요즘 회사일 때문에 눈코 뜰새 없이 바쁜지라 거의 블로그를 버려뒀습니다. ㅠㅠ 회사에서 머리를 풀 회전시키고 집에 와서 잠시 쉬었다가 다시 작업하고 이런 날들을 거의 추석 근처부터 반복했더니만... 머리가 타는 듯(?) 하네요. ㅠㅠ 그래도 작업은 꾸준히 해야 하는지라 틈틈이 기능을 추가해서 화면 그리기 알고리즘 업그레이드 + 작업 표시줄 + 시스템 모니터까지 진행되었습니다. 아래는 진행된 것을 캡쳐한 화면입니다.

<작업 표시줄과 시스템 모니터가 추가된 화면>


이제 조금만 더 만들어서 콘솔 쉘까지 추가하면 그럴듯해지겠군요. ㅎㅎ 이번에는 동영상보다 직접 실행할 수 있는 QEMU의 이미지를 올렸습니다(절대 동영상을 찍기 싫어서가 아닙니다. ㅠㅠ). 어떻게 돌아가는지 궁금하신 분들은 한번 다운 받아서 실행해보시면 얼마나 허접한지(?) 볼 수 있을 겁니다. ㅎㅎ 파일을 다운받아서 압축을 푼 후 디렉터리 안에 있는 MINT64OS.bat를 실행하시면 됩니다.



아우... 새벽형 인간으로 거듭난지 꽤 되었지만 아침에 일찍 일어나는 건 여전히 힘드네요 ㅎㅎ 이제 그만 또 작업하러 가봐야겠습니다. ;) 다음 글이 또 언제 올라올지 모르겠지만, 틈나는 대로 진행상황을 올리겠습니다. 그럼 다들 좋은 하루 되세요 ;)

이번 주 금요일에 급히 쉘 관련 파트를 끝내고, 주말 내내 PIT 컨트롤러쪽 작업을 하면서 문서를 정리하고 있었습니다. 처음에는 진도가 꽤나 잘 나가는 듯 했으나, 언제나 그렇듯이 문제에 봉착했습니다.

PIT 컨트롤러의 카운터 0를 사용하는 경우, IRQ 0 인터럽트가 발생하기 때문에 인터럽트를 통해 간접적으로 타이머가 완료되었음을 알 수 있습니다. 하지만 인터럽트가 "언제나" 가능하지는 않기 때문에, 직접 카운터 0를 읽어서 처리하는 함수를 만들었습니다. 처음 작성한 코드는 대략 아래와 같았습니다.


실행해보니 뭔가 이상했습니다. 함수를 실행하자마자 루프를 바로 빠져나왔기 때문입니다. 이상해서 곰곰히 코드를 보고 있었는데 도무지 감을 잡을 수가 없었습니다. 그러던 중... 갑자기 머리를 팍~!! 하고 뭔가 스쳤습니다. 차를 구할 때 이전 값보다 현재 값이 크다고 생각했기 때문에, (현재 값 - 이전 값)으로 구했는데.... 타이머의 카운터는 증가하는 것이 아니라 1씩 감소했던 겁니다. 즉 이전 값이 현재 값보다 더 크다는 것이지요. ㅠㅠ 코드가 제대로 동작하려면 아래와 같이 순서를 바꿔야 합니다.


어흑... 이것 때문에 몇시간을 날렸는지 모르겠네요. 이것 말고도 손가락으로 초를 쟀다가 시계의 초보다 1.5배는 빨리 카운팅해서... ㅠㅠ 디버깅을 계속한 걸 생각하면... 흑흑... ㅠㅠ 왜 손가락으로 카운팅하는 속도와 초침이 움직이는 속도가 같다고 생각했는지... ㅠㅠ

그래도 어떻게든 해결했으니 다행입니다. 에궁... 이번 주 안에 RTDSC랑 RTC 쪽도 끝내려고 하는데... 시간이 될런지 모르겠군요. 이번 주도 미친듯이 집에 일찍 와야겠습니다.

다들 좋은 밤 되시고, 이번 주도 무사 칼퇴근하시기 바랍니다. ;) 야근불가~!!!
 Cywin에서 크로스 컴파일러를 만들기위해서는 먼저 소스 패키지를 설치해야합니다. setup.exe 를 실행해서 Devel 부분의 Binutil gcc-core 의 소스 패키지를 선택하고 설치를 수행하면 소스가 /usr/src 폴더에 설치될 겁니다. ^^

1.Binary Utility Build

 제일 먼저 해야할 일은 binutil을 빌드하는 일입니다. x86_64용 크로스컴파일러를 빌드하기 위해서는 x86_64용 ld와 as 등등 각종 링커와 어셈블러들이 필요하기 때문이지요 ;) bintul을 빌드하는 방법은 아래와 같습니다.
  • export PREFIX=/usr/cross
  • export TARGET=x86_64-pc-linux
  • ./configure --target=$TARGET --prefix=$PREFIX --enable-64-bit-bfd --disable-shared
  • make configure-host
  • make LDFLAGS="-all-static"
  • make install
 위와 같이 실행하고나면 정상적으로 build된 경우 /usr/cross 라는 폴더가 생성되어있을 겁니다. 그 폴더에 들어가보시면 빌드 결과물을 확인할 수 있습니다. ;) 현재 x86_64 용 glib가 생성되어있지 않은 상태이므로, 공유라이브러리를 사용하지 않도록 --disable-shared-all-static 옵션을 줘야합니다. 주지 않을 경우 나중에 gcc 빌드할 때 문제가 발생합니다. ㅜ_ㅜ crti.o가 없다고 계속 에러가... ㅠㅠ

2. GCC Build

 그 다음 해야할 일은 gcc를 생성하는 일입니다. cygwin에 포함된 gcc 소스에는 소스 파일과 패치파일을 포함하고 있습니다. 정상적으로 빌드하기위해서는 패치를 수행해야 하는데, 다행이도 gcc-3.4.4.sh 라는 스크립트가 있습니다. 아래의 빌드를 수행하기 전에 먼저 아래와 같이 입력해서 패치를 수행합니다.
  • gcc-3.4.4.sh prepare
 위 과정이 정상적으로 끝나고나면 gcc-3.4.4-3 이라는 폴더로 이름이 변경될겁니다. 그럼 해당 폴더로 이동해서  아래의 순서대로 실행합니다.
  • export PATH=$PREFIX/bin:$PATH
  • ./configure --target=$TARGET --prefix=$PREFIX --disable-nls --enable-languages=c --with-newlib --without-headers --disable-shared --disable-threads
  • make configure-host
  • make LDFLAGS="-static" all-gcc
  • make install-gcc
 위와 같이 실행하고나면 /usr/cross에서 gcc관련 파일들을 보실 수 있습니다.

 이 간단한걸 하려고 며칠을 해매었는지 모르겠군요. ㅜ_ㅜ)-b
 다른 분들은 이런 걸로 고생 안하셨으면 합니다. ㅜ_ㅜ
아아~ 진짜 거의 3일만에 성공했습니다. ㅜ_ㅜ 주말 내내 붙잡고 있다가 해결 못하고 있었는데... 구글의 자료를 뒤지다가 --disable-shared 옵션 및 LDFLAGS="-static" 으로 해결했습니다.

 ㅜ_ㅜ 진짜 되고 안되고가 한끗 차이더군요. 저런 옵션 하나때문에 몇시간을 날렸는지... ㅜ_ㅜ... 아래는 빌드가 끝나고 cygwin에 설치된 64bit 크로스 컴파일러(cross complier) 입니다. 감동해서 스샷 하나 찍어 올립니다(반갑다 애들아~ 우리 이제 잘해보자꾸나...). ㅜ_ㅜ)-b

사용자 삽입 이미지

 자세한 빌드 방법은 내일 정리해서 올리겠습니다. 앞으로는 저처럼 삽질하는 사람이 없었으면 하는 생각이 드는군요. 진짜 어의없습니다. ㅜ_ㅜ

 그럼 다들 좋은 밤 되시고, 내일 허접한 문서로 다시 찾아 뵙겠습니다. ㅜ_ㅜ)-b

+ Recent posts