[완료]A20게이트를 보다가 0xFFFF:FFFF 논리주소를 물리주소로 변환하는 과정이 궁금합니다.
글쓴이: superdma / 작성시간: 월, 2009/08/03 - 12:42오전
만들면서 배우는 OS 커널의 구조와 원리책에서 A20 게이트 부분을 공부하다가 의문점이 들어 글 남깁니다.
"메모리의 크기가 0xFFFF:FFFF를 물리주소로 나타내면 0x10FFEF입니다."
라는 말이 있는데요...
0xFFFF의 물리메모리는 1MB 인데 , 콜론 뒤에 붙은 FFFF는 또 뭐지요?
혹시 세크먼트의 갯수가 FFFF개 인것을 의미하는 건가요?
ex) 0x세그먼트갯수:메모리크기
그리고 어떻게 0xFFFF:FFFF 가 0x10FFEF라는 값이 되나요?
갑자기 책 중간부분을 참조해서 그런지 아리송 하네요.
논리 주소를 실제 물리주소로 변환해서 그런값이 나온건지 ...
왜 저런 값이 나온지 이해가 안되네요.
Forums:
세그먼트의 값에
세그먼트의 값에 왼쪽 쉬프트를 하나 한다음 포인터의 값을 더합니다.
0x10FFEF = (0xffff << 1) + 0xffff 입니다.
물론 이것은 A20이 활성화 되었을 때 입니다.
활성화 되지 않았다면
20번 메모리주소 핀이 키보드 컨트롤러와 and로 연결되어 있는데 활성화 되지 않아서 앞부분의 1이 and연산으로 인하여 사라지게 됩니다.
그래서 실제 참조하는 주소는
0xffef가 됩니다.
틀린것 있으면 지적해주세요
글 도배 해보세... 룰루랄라
x86 메모리주소는
다음번에는 이거 프로그래밍 게시판에 올려주시고요.
x86 메모리주소는 세그먼트*16+오프셋으로 됩니다. (단 16bit realmode라는 조건하에. protected-mode는 전혀 다름)
그래서 0xffff:0xffff는 0xffff * 0x10 + 0xffff가 되어서 0x10ffef로 접근하고요.
8086/88은 address line이 20bit이므로 범위를 벗어나는 윗자리 1은 그냥 무시되므로 0xffef로 접근합니다.
하지만 address line이 더 많아진 286 이후부터는 (286은 24bit, 386이후부터는 32bit) 윗자리 1이 무시 안됩니다.
그래서 이전과 호환을 유지하기 위해 나온게 A20 gate입니다. 이게 disable되어 있다면 address line 중 20bit를 넘어가는 부분을 차단해버립니다.
사족으로 A20 gate enable 여부를 판단하기 위해서는 0xffff:0x0010 (메모리주소 0x100000)에 전혀 다른 값을 write한 다음 0x0000:0x0000(메모리주소 0)에 변경이 있는지 확인하면 됩니다. 변경되었다면 disable, 안되었다면 enable 상태입니다.
도스시절에 많이 이야기되었던 하이메모리도 이걸 이용한 트릭이고요. a20 enable 상태에서 세그먼트를 0xffff로 놓게 되면 20bit 넘어서는 영역이라도 접근 가능하게 되거든요.
Written By the Black Knight of Destruction
Written By the Black Knight of Destruction
댓글 달기