이제 OS를 만드는 작업이 거의 막판까지 왔습니다. 커널에서는 이미 System Call 처리를 위한 준비를 끝낸 상태이며, 이제 응용프로그램을 적절히 로드해서 실행하는 것만 남았습니다. ^^;;; 그동안 작업을 주로 윈도우 환경에서 했기때문에 PE 파일 포맷을 주로 다뤘습니다(PE 파일 포맷에 대한 내용은 http://kkamagui.tistory.com/search/PE%20%ED%8C%8C%EC%9D%BC 을 참고하세요).

 이번에 ELF 파일 포맷 쪽을 다루는 김에 문서를 좀 남겨둘려고 허접하지만 문서 작업을 같이 했더니, 이해하는데 훨씬 도움이 되더군요. 물론 아는 내용을 정리하는 작업이 좀 지루하기는 하지만, 시간이 지나면 다 잊어먹으니 나중을 대비해서라도 정리하는 게 좋을 것 같더라구요. ㅎㅎ

 정리를 죽 하다보니, 머리로만 이해하고 있던 내용 중에 잘못된 것도 찾을 수 있었고, 확실히 보지 않으면 정리를 할 수 없으니 문서를 세세히 찾아볼 수 있었습니다. ^^;;; 어제 늦게 정리된 내용을 바탕으로 ELF64 Relocator(가칭)을 만들었는데, 나름대로 잘 동작하더군요. :)

 ELF64 Relocator는 Relocatable 파일 형식으로 생성된 ELF64 파일을 Relocation을 수행해서 마치 Executable 파일 형식으로 생성된 것 처럼 만들어주는 프로그램입니다. 만약 문서를 제대로 이해했다면 Relocatable 파일 형식으로 나온 것을 Relocation 시킨 결과나 Executable 파일 형식으로 만든 결과가 같아야 합니다. 간단한 테스트 프로그램으로 테스트 해본 결과 디스어셈블리한 결과가 똑같이 나왔습니다. >ㅁ<)-b

 아아~ 이제 남은 것은 OS에서 ELF64 형식을 그대로 쓰느냐, 아니면 별도의 가공을 통해 새로운 파일 포맷을 만드느냐인데... 사실 가장 좋은 방법은 ELF64의 Relocatable 파일 형식을 그대로 쓰는 겁니다. 이렇게되면 별 다른 수정없이 윈도우나 리눅스 계열에서 빌드된 ELF64 파일을 그대로 실행할 수 있는 장점이 있습니다. 하지만 단점은 커널에 들어있는 실행파일 로더(Loader)가 복잡해진다는 것이지요. ㅠㅠ

 새로운 파일 포맷을 만드는 방법은 커널에 있는 로더를 간단히 할 수 있는 장점이 있습니다만, 파일 포맷을 변환하는 단계를 거쳐야되서 빌드 시에 단계가 하나 더 추가되는 단점이 있습니다. 파일 포맷 변환 프로그램도 작성해야하구요. ㅎㅎ

 이거 어느 것을 선택하는 게 옳은 건지 판단을 내리기가 좀 힘들군요. 빨리 이걸 결정해야 실행파일을 돌려볼 수 있을텐데... ㅠㅠ 어휴... 고민입니다. ㅠㅠ


 오늘은 즐거운(??) 예비군 훈련날이라 야근없이 바로 집에왔습니다. 그리고 밥 한그릇 빨리 뚝딱하고 ELF64 파일 포맷에 대한 문서를 작성하기 시작했습니다. 사실 시작은 어제부터 했지만, 본격적으로 시작한 건 오늘부터라서... ^^;;;;

 문서는 Relocation 방법에 대해서 초점이 맞춰져 있지만, 기반 설명을 위해 앞쪽에 ELF64 파일 포멧에 대한 내용을 넣는게 좋겠다는 생각이 들더군요. 그래서 스펙 문서를 긁어 붙이면서 설명 첨부하는 식으로 간단히 넘어갔습니다.

 그런데 그 동안 테스트 프로그램으로 ELF64를 분석할때는 별 문제 없는 것 같던 Relocation Type이라는 값이, 문서를 작성하려고 보니까 뭔가 이상한겁니다. ㅠㅠ 제가 보고 있는 ELF64 문서의 버전이 낮아서 그런지 타입에 대한 설명을 건너뛰었더군요. 그래서 ELF32에 문서쪽을 찾아보니  32bit 기준으로 설정되어 있어서, 뭔가 일치하지 않는 부분이 있었습니다. 한가지 예를 들면 objdump.exe로 Relocation Entry를 읽으면 Relocation Type이 0x0B인 것이 나오는데, ELF32에는 0x0A까지만 정의되어 있더군요. ㅡ_ㅡ;;;;;;

 도저히 이건 아니다 싶어서 다시 구글 검색을 시작했습니다. 결국 AMD쪽 사이트에서 문서를 구했습니다. 생각보다 자료를 찾기가 쉽지 않네요. 이런쪽을 파보는 사람이 별로 없어서 그런가... ㅡ_ㅡa... 앞으로 테스트 프로그램을 짤때도 정리를 꼭 해야겠습니다. 정리를 안하니 그냥 아는 척(??) 하고 넘어가게 되네요. ㅠㅠ



 이런 이유로... 오늘 하루종일 결국 삽질만 하고 정녕 Relocation 처리는 완료하지 못했습니다. 크윽... 내일은 금요일이니 좀 신경써서 마무리를 하고 64Bit Test OS에 올려봐야겠네요. ;)

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

ps) 어디 고정 폭 폰트 중에서 저작권 없는 깜찍한 폰트 없나요? ㅠㅠ

정 안되면 폰트 홍보해주겠다고 하고 저작권료를 안주는 방법을 고민해봐야할지도... ㅠㅠ

살려주세요~!!! ㅠㅠ



 고민 끝에 Ultra DMA쪽은 다음에 하는 걸로 미루고, ELF64의 Relocation 처리 부분을 하고 있습니다. PCI 부분을 다루자니 배보다 배꼽이 더 커지는 것 같고, 또한 굳이 DMA를 사용하지 않아도 HDD를 읽는데 문제가 없기때문에 작업량을 늘릴 필요가 있겠나 하는 생각이 들었습니다. ㅠㅠ 그래서 결국 다음에 시간나면 천천히 하는 걸로 결정했습니다.

 ELF64 File Format Spec을 보면서 느낀건데, PE File Format과 굉장히 비슷하군요. 차이점이라면 Section 별로 Relocation 정보를 가진 Section이 딸려오는 것이랄까요... r_link 및 r_info Field를 이용해서 Relocation 및 Symbol 정보가 포함된 Section으로 찾아갈 수 있습니다.

 아래는 간단히 VC로 만들어본 ELF64 Analyzer의 화면입니다. 각 Section 정보를 추출해서 Symbal 및 Relocation 정보를 나열하고 있습니다.
사용자 삽입 이미지

 이제 실제로 Relocation해서 메모리에 올리는 일만 남았군요. ;) 점점 삽질하는 속도가 빨라지고 있습니다. ㅠㅠ 좋은 건지 나쁜 건지... 일단 ELF64에 대한 내용은 천천히 정리해서 포스팅하겠습니다. ;)

 요거 끝나고 나면 GUI를 살짝 만들어보고 바로 작업(?)에 들어가야겠습니다. ㅎㅎ 아웅~ 잘되야할텐데... 걱정입니다. ㅎㅎ
 그럼 다들 좋은 밤 되세요 ^^)/~



+ Recent posts