반응형

지난 시간에 64비트 멀티코어 OS를 만들기 위한 환경을 Windows 10 64bit에서 구축했다.

 

근데 생각해보니 처음에는 포스팅 용으로 환경 구축만 하고 버릴 것이기에 Windows 환경을 구축했는데

 

어느 순간 보니 Ubuntu는 내 머리 속에서 까맣게 잊혔고, 윈도우로 할 생각으로 가득 차 있더라..

 

그래서 얼른 정신차리고 얼른 우분투 환경을 구축했다.

 

평소에 윈도우를 게임할 때만 ㅎㅎㅎ 사용하다 보니 리눅스가 더 편했다.

 

그리고 보니 IT에 입문할 때 어디서 봤던 글 내용 중에 "윈도우의 마우스 클릭보다 리눅스의 명령어 입력이 더 편하다"라는 문장이 있었는데

 

이제... 나는... 이해가 된다.

 

처음에는 마우스로 클릭하는 윈도우가 더 편하지! 이랬는데 리눅스를 사용하면서 명령어 입력하고 vi 이용하고 하다 보니 어느 순간부터 리눅스가 훨씬 훨씬 편하더라

 

가끔 윈도우에서 메모장이나 다른 프로그램을 사용해서 문서 작성하면 나도 모르게 :wq를 입력하고 있다 ㅋㅋㅋㅋㅋㅋㅋㅋ

 

그래서 나중에 문서를 열면 글 내용 중에 :wq가 입력되어 있고... 이 상황을 이해하시는 사람이 있다면... 훌쩍 ;(

 

여튼

 

지난번에 윈도우 환경 구축 할 때 64bit 환경이었는데, 야미형의 블로그를 보니 이것 저것 패키지가 서적에 나온 패키지들보다 많아서

 

야미형이 블로깅 해둔 패키지들을 윈도우 64bit에서 설치해서도 해봤고, 그냥 서적에 있는 패키지들만 설치해서도 해봤는데

 

서적에 있는 패키지들만 설치해서 크로스 컴파일 만들기 파트를 해도 문제가 없었다.

 

아! 한 가지 문제가 있다면, windows의 환경이 64bit라면 크로스 컴파일러 생성 후 GCC 옵션에서 -m32가 안되고, 반대로 Windows의 환경이 32bit라면 GCC 옵션에서 -m64옵션이 안됐는데

 

이게 좀 이상해서 한승훈 저자 님의 블로그를 방문해보고 구글링도 해보니 예전에 나와 같은 상황이었던 분이 Mint64 OS 사이트에 글을 올려두셨더라고 그래서 따라 해보지는 않고 "아~ 이렇게 하면 되는구나" 했다. :)

 

그리고는 한승훈 저자 님에게 페메를 보내 이게 안 되는 게 맞나요.. 라고 물어보았음...

 

나는 원래 잘 안 물어보고 혼자 삽질하다가 답을 찾는데 분명 내가 테스트할 때는 서적에 나온 대로 크로스 컴파일러를 생성 후 64bit 모드와 32bit 모드를 체크하는 명령에서 서적과 같이 둘 다 정상적으로 동작한다고 떴는데 실제로 GCC에 -m32와 -m64 옵션을 줘서 해보니 64bit 환경에서는 -m32가 안되고 32bit 환경에서는 -m64가 안되더라고...

 

근데 다행히도 테스트 명령에서 32bit/64bit라고 뜨면 된다고 하여 이 부분은 크게 시간을 끌지 않고 잘 넘겼다.

 

그리고 binutils의 소스코드를 cygwin에서 받으면 자꾸 binutils 빌드에서 오류가 뜨길래 그냥 직접 binutils 사이트에서 소스코드를 받아 빌드했었다고 하니 이 부분에 대한 해결책도 한승훈 저자 님이 최신 패치하여 방법을 업데이트해주셨다.

github.com/kkamagui/mint64os-examples

 

기존의 binutils 빌드 관련 명령에서는 --disable-unit-tests 옵션이 없었는데, binutils에 유닛 테스트가 추가되어서 생긴 문제로 --disable-unit-tests 옵션을 추가로 넣어주면 정상적으로 빌드가 완료된다 ^^

 

이렇게 한승훈 저자 님에게 직접 연락하여 크로스 컴파일 부분을 잘 넘겼고, windows 10 64bit 환경과 32bit 환경 모두 테스트해본 결과 github.com/kkamagui/mint64os-examples 의 글을 보면서 따라 하면 잘 진행된다는 결론이 나왔다!

 

우분투 환경은 윈도우보다 진짜 진짜 진짜 진짜 편하고 빨라서 좋았음

 

그냥 apt 명령으로 패키지들과 nasm 그리고 Qemu까지 모두 설치 끝! eclipse 설치 끝! 

 

그다음 파트는 운영 모드와 레지스터 메모리 관리 기법에 관련된 것이었는데

 

와우~ 진짜 3번 정도 읽었다...

 

처음이니깐 한 번 읽고, 범용 레지스터는 그나마 쉽게 이해됐는데, 컨트롤 레지스터 부분이랑... 메모리 관리 기법 중 보호 모드와 IA-32e 모드 부분이 약간 시간이 걸렸지만 많은 시간을 들지 않고, 무난하게 블로깅까지 마쳤다.

 

약간 나에게 어려웠던 부분은 용어였던 거 같다.

 

너무 헷갈린다.

 

세그먼트 레지스터의 값, 세그먼트의 기준 주소부터 시작해서 페이지 디렉터리 엔트리 페이지 테이플 엔트리.. 무슨 오프셋... 페이지 오프셋 등

 

어우 너무 유사해서 헷갈리는 단어들 때문에 애 좀 먹었다 #f@#&*^$

 

그래도 꾸역꾸역 천천히 읽어가면서 이해한 것 같아서 다행인데... 블로깅이 너무 오래 걸린닼ㅋㅋㅋㅋ

 

그나마 레지스터 부분은 그렇게까지 오래 걸리지는 않았다.. 근데 메모리 관리 기법!!!!

 

저 자식이 문제다

 

나만 오래 걸린 건가.... 이해하면서 블로깅 쓰다 보니 한 6시간? 넘게 걸린 거 같았는데 흠..

 

그래도 이해했다고 느끼는 이유가 IA-32e 서브 모드 중 64bit의 페이징 과정에서 어떻게 값이 처리가 되는지 순서대로 나열하는 부분을 적으면서 살짝은 느렸지만 막힘없이 물리 주소로 변환하는 과정을 적었다.

(여기도 약간 오프셋... 엔트리... 등 용어 때문에 살짝 애 먹었다 ㅎㅎㅎ)

 

그래도 블로깅을 마치고 나니 속이 시원하다.

 

진짜 운영 모드와 레지스터 그리고 메모리 관리 기법 블로깅 하려고 하기 전에 완전 겁나 엄청 무지 매우 많이 귀차니즘이 와서 아 그냥 이 부분은 패스할까 생각했었닼ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

후하후하ㅜ하후ㅏ훟

 

이제 부트 로더 부분 들어가고 실제로 부트 로더를 만드니 약간 떨리기도 하고 재미도 있다!!

 

이제 한 이틀 뒤면 설인데 코로나 때문에 친척 분들을 뵙지도 못하니 책 진도나 많이 빼야겠다 :)

 

 

 

반응형

+ Recent posts