2008. 12. 28. 17:15
     

http://kkamagui.tistory.com/614에 제 PC에서 테스트한 A20 게이트의 이상 증세에 대해 글을 남겼습니다. 생각 외로 많은 분들이 관심을 가져 주셨는데, 그 중에서 A20 게이트에 따른 주소 공간의 변화에 대한 내용을 한번 정리할 필요가 있어서 글을 하나 끄적 거립니다.

A20 게이트는 아시는 분은 아시겠지만 어드레스 라인 20bit에 관련되어 있습니다. 즉 A20 게이트가 비활성화 될 경우 어드레스 라인 20bit가 강제로 0으로 설정되어 홀수 Mbyte에 접근되지 않는 것이지요. ^^;;;; 물론 코드에서 홀수 Mbyte에 접근할 수 있지만 이것은 다시 짝수 Mbyte에 맵핑됩니다. 아래 그림을 보시면 한눈에 알 수 있습니다. 3Mbyte + 64Kbyte 영역에 접근하는 예를 나타냈습니다.



따라서 이 때문에 코드에서 사용하는 선형 주소는 짝수 Mbyte에 중복 맵핑되는 결과를 가져옵니다. 이로 인해 전체적인 주소 공간은 아래 그림과 같이 변환됩니다.

따라서 1Mbyte 이하의 위치에서 코드가 실행되는 상태에서 1Mbyte ~ 6Mbyte 까지 영역을 모두 0으로 초기화하는 프로그램을 실행한다면, 1Mbyte ~ 2Mbyte 영역을 초기화하는 순간 자신이 실행 중이던 코드 영역(1Mbyte 이하에 있는)을 모두 0으로 초기화하게 됩니다. 실행되는 코드는 1Mbyte 이하의 어드레스에 존재하므로 프로세서는 온통 0x00으로 도배된 코드를 실행하게되고, 이는 잘못된 인스트럭션이므로 예외(Exception)이 발생하게 됩니다. 즉 프로그램이 멈추거나 리부팅하게 됩니다.

이전에 글을 대충썼더니만, 증상에 대해서 오해하시는 분들이 있어서 다시 한번 정리합니다. ^^
휴일인데도 이런걸 하고 있는 걸 보면... 역시... ㅠㅠ)-b 골방 폐인인듯... ㅎㅎ

그럼 다들 즐거운 연말 보내세요 ;)


Android App

Posted by 호기심 많은 kkamagui(까마귀, 한승훈)

댓글을 달아 주세요

  1. Favicon of http://blog.naver.com/charsyam BlogIcon CharSyam 2008.12.28 21:56  댓글주소  수정/삭제  댓글쓰기

    아, 직접 1~6MB 까지 0으로 매핑하시다는 얘기셨군요. 전 1MB에 쓰면 그 이하에 0이 써진다고
    잘못이해하셨는지 알았습니다. ^^ 고운하루되세요.