mint64os
mint64os copied to clipboard
질문있습니다
안녕하세요 어디 질문할 수 있는 곳이 여기밖에 없는 것 같아서 질문합니다
PML4에서 디렉토리 엔트리의 기준주소는 18비트라고 알고 있습니다.. 근데 실제로 기준주소를 18비트로 정하고 코드를 짜니까 페이징 기능을 키는 부분에서 무한 재부팅을 하는 오류가 생기네요.. 거기에다가 mint64os 코드를 보면 기준주소의 크기가 18비트가 아닌 것 같은데.. 책에 나와있는 구조대로 똑같이 만들어 봤는데(제가 똑같이 만든지는 잘 확신이 안가긴 하지만) 계속 오류가 나서 여기에 질문합니다
제가 사용한 PML4 구조체: (Flags는 P, RW, US 등등을 총합한 것입니다)
typedef struct { unsigned char Flags:6; unsigned char Reserved1:3; unsigned char Avail1:3; unsigned int BaseAddress:28; unsigned int Reserved2:12; unsigned int Avail2:11; unsigned char EXB:1; }PML4TENTRY , PDPTENTRY;
typedef struct { unsigned short Flags:9; unsigned char Avail1:3; unsigned char PAT:1; unsigned char Reserved1; unsigned int BaseAddress:18; unsigned short Reserved2:12; unsigned short Avail2:11; unsigned char EXB:1; }PDENTRY;
참고로 구조체는 모두 1바이트로 정렬했습니다(-fpack-struct=1)
원래 그 mint64os.pe.kr에 질문하려 그랬는데 새로 아이디를 만들어도 로그인이 안되가지고 ..
코드를 보니 IA-32e mode에서 4단계 과정의 paging 기술, 즉 2MB 크기의 page를 사용을 하는 것 같으니 이를 가정하고 글을 쓰겠습니다.
먼저 PDE 2MB page의 기준주소의 크기는 19 bit입니다. 그래서 이 paging 기법을 사용하면 최대 사용가능한 물리 주소공간은 1TB (2MB << 19)가 됩니다. 이부분이 잘못되서 재부팅이 된 것 같은데 제가 C언어의 bit field operator를 잘 몰라서 코드를 고쳐주지는 못하겠습니다.
인텔 기술 서적에 나와있는 아래의 표를 참조하시면 운영체제를 만들때 도움이 될겁니다.
Intel 64 and IA-32 architectures software developer's manual중 volume 3a 서적의 chapter 4에 paging 사용법이 나와있으니 이걸 참조해도 좋을 것 같습니다. 자세히 나와있더라고요.
아님 까마귀님의 책의 Ch9와 Ch3장을 참조해도 좋습니다. Ch9를 먼저 읽고 Ch3을 읽는 것을 추천드립니다.
답변 감사한데... 하나 궁금한게 있어서 하나 더 질문합니다. 저기 표에 M에 52를 대입해보면 표가 이상해지네요...
대입해보면 Address of page table의 크기가 40비트가 되고 Rsvd는 크기가 마이너스가 되어버리는 것 같은데 M의 52가 아니라 다른 값인건가요?
(그냥 bit field operation 쓰는건 포기하고 mint64os처럼 DWORD하나 DWORD하나 만들어서 쓸지 고민이네요)
"MAXPHYADDR is at most 52"의 뜻은 인텔이 만드는 모든 CPU를 통들어서 52가 넘지 않는 다는 뜻이고 어떤 CPU는 52보다 더 작을 숫자를 지원할 것을 암시합니다. 보통 우리가 사용하는 데스크탑용 CPU는 M=40입니다. M에 40대입하시면 모든게 맞아떨어질 것입니다.
아... 감사합니다
@ybjeon01 님, 답변 감사합니다. ^^ @Juha3141 님, 헉... 로그인 부분은 제가 확인해보겠습니다!
그럼 즐거운 OS 프로그래밍 하세요 ^^
감사해요..