본문 바로가기

Project

OS 개발 8챕터 8챕터이다. 이번에는 A20 게이트를 이용해서 1MB 이상의 주소에 접근할 수 있도록 하고, IA-32e 모드로 넘어가기 위한 64비트 커널을 올릴 영역을 검사하는 부분을 만들었다. 그렇게 큰 어려움은 없었는데 빌드를 해서 부팅시켜 보면 이상하게 자꾸 글자가 중간에 짤리는 오류가 있었다. 그래서 이것저것 다 찾아보다가 저번에 만들어 놓은 ImageMaker가 오류라는 것을 알았다. 나는 책대로 소스를 잘 짰는데 어디가 오류인가 하고 봤더니 책 오탈자 리스트에서 lPosition = lseek( iTargetFd, 5, SEEK_SET ); 을 lPosition = lseek( iTargetFd, (off_t)5, SEEK_SET ); 라고 써야 한다는 것이다. 그래서 (off_t)5로 바꾸고 다시 컴파일.. 더보기
OS 개발 7챕터 이번에는 C언어로 짠 커널을 직접 로드하여 실행하는 부분을 했다.일단 무사히 잘 끝냈는데, 책에 있는 소스를 직접 손으로 옮겨 적었더니 진짜 오류가 장난 아니게 났다... 진짜 OS 목표 중 하나가 소스는 반드시 복붙 안하고 손으로 치기 였는데 고작 200줄 정도 따라 쳤는데도 오타만 6~7개가 났다.. 뒤에 막 파일시스템 만들고 하면 2000줄 정도 되던데 정말 큰일났다.. 더 웃긴건 오타가 너무 황당하다는 거였다. 오타 종류를 좀 적자면 확장자의 .을 ,로 적은거랑 목적 파일의 .o를 .0으로 적고, $를 안붙인다던가 objcopy 프로그램을 사용해야 되는데 평소 rop할 때의 버릇이 나와서 objdump 프로그램을 사용해서 또 오류 나고 ,를 m으로 적고 이것들 등등 진짜 여러가지 황당한 오류가 너.. 더보기
OS 개발 6챕터 방학동안 OS를 개발해 오던 스터디가 개학을 하면서 터지고, 잠깐동안 OS 개발을 멈췄다가 다시 OS 개발의 중요성을 느끼고 6주차 부터 다시 만들기 시작했다.6주차 내용은 리얼 모드에서 보호 모드로 전환하는 부분이다. 직접 cr0 레지스터랑 GDT를 설정하니까 되게 신기했었다. 다만 세그먼트 디스크립터에서 왜 굳이 Base 주소 비트를 여기저기 나눠놨는지를 모르겠다.. 참 이상하다. 더보기
OS 개발 및 공부 스터디 5주차 보호되어 있는 글입니다. 더보기
OS 개발 및 공부 스터디 4주차 보호되어 있는 글입니다. 더보기
PE Viewer 개발 5일차 오늘은 IMAGE_DOS_HEADER 출력 부분을 서식문자로 바꿔서 정렬을 하였고, IMAGE_NT_HEADER역시 정렬이 되어 있지 않았던 부분을 정렬하였다.그리고 IMAGE_FILE_HEADER의 Machine, TimeDataStamp, Characteristics 부분을 해석해 주는 부분을 넣었고, IMAGE_OPTIONAL_HEADER에서 DataDirectory를 제외한 나머지 부분을 완성시켰다. IMAGE_FILE_HEADER 완성DataDirectory를 제외한 IMAGE_OPTIONAL_HEADER이제 DataDirectory를 추가하고, 각 섹션 헤더들을 출력하는 부분을 추가해야겠다. 더보기
PE Viewer 개발 4일차 오늘은 Dos Stub출력 부분과 IMAGE_NT_HEADER를 약간만 분석하도록 만들었다. Dos Stub은 사이즈를 계산해서 hex로만 출력하는 기능을 넣었고, IMAGE_NT_HEADER 중에서 Signature, IMAGE_FILE_HEADER 부분을 만들었다. 각각 읽어 들이고, Machine이나 Time Stamp Data, Characteristics 같은 멤버 변수들을 분석하는 부분을 넣어야 한다. 그리고 출력을 할 때에 지금까지는 직접 문자열을 하드코딩으로 직접 다 넣었는데 이제는%s를 잘 사용하여 알아서 거리를 계산하여 보기 좋게 출력하도록 만들어야겠다. Dos_Stub정렬안된 IMAGE_NT_HEADER Signature정렬안된 IMAGE_NT_HEADER IMAGE_FILE_HEAD.. 더보기
PE Viewer 개발 3일차 오늘은 DOS_IMAGE_HEADER 부분을 완성시켰다. 출력하는 부분을 어떻게 처리할까 계속 고민하다가 반복문으로 하게 되면 제약이 너무 많아지기 때문에 그냥 각 멤버 변수 하나씩 printf로 노가다 해서 출력해 줬다. 이렇게 hex로만 표현해 주는 부분과 분석을 해서 출력하게 하는 부분을 만들었다. IMAGE_DOS_HEADER에서 가장 중요한 멤버 변수인 e_magic하고 e_flanew는 특별히 ★까지 붙여줬다. 이제 Dos Stub출력 부분과 NT_IMAGE_HEADER 앞부분을 분석하는 부분을 만들어야겠다. 더보기
OS 개발 및 공부 스터디 3주차 보호되어 있는 글입니다. 더보기
PE Viewer 개발 2일차 오늘은 많은 부분을 제작하지 못했다. 일단 메모리에 파일을 올리는 것은 그대로 매핑해서 올리기로 하고, 전역변수에다가 각 헤더와 섹션을 구분해서 저장하기로 했다. 그리고 헥스로 출력하는 부분을 좀 더 나눠서 함수로 만들었다. 그리고 IMAGE_DOS_HEADER를 읽어와서 이를 각 멤버 변수들과 의미 등으로 구분해서 출력을 해야 하는데 이 부분을 반복문으로 처리하기가 약간 까다롭다.. 각 멤버 변수들마다 크기도 다르고, 이름도 제각각 달라서 어떻게 효율적으로 출력해야 할 지 고민중이다.. 아마도 각 변수들의 크기, 이름, 설명 등을 전부 테이블로 만들어서 반복문으로 처리하게 될 것 같은데 좀만 더 방법을 찾아봐야겠다.. 더보기