page.c 를 구현하는 과정에서



 38

 39         // 페이지 디렉터리 테이블 생성

 40         // 하나의 페이지 디렉터리가 1GByte까지 매핑 가능

 41         // 여유있게 64개의 페이지 디렉터리를 생성하여 총 64GB까지 지원

 42         pstPDEntry = ( PDENTRY* ) 0x102000;

 43         dwMappingAddress = 0;

 44         for( i = 0 ; i < PAGE_MAXENTRYCOUNT * 64 ; i++ )

 45         {

 46                 // 32비트로는 상위 어드레스를 표현할 수 없으므로, Mbyte 단위로 계산한 다음

 47                 // 최종 결과를 다시 4Kbyte로 나누어 32비트 이상의 어드레스를 계산함

 48                 kSetPageEntryData( &( pstPDEntry[ i ] ),

 49                                 ( i * ( PAGE_DEFAULTSIZE >> 20 ) ) >> 12, dwMappingAddress,

 50                                 PAGE_FLAGS_DEFAULT | PAGE_FLAGS_PS, 0 );

 51                 dwMappingAddress += PAGE_DEFAULTSIZE;

 52         }

 53 }

 54


51번째 줄에서 dwMappingAddress 변수가 PAGE_DEFAULTSIZE 를
PAGE_MAXENTRYCOUNT * 64 번 만큼 더하는데,
제가 궁금한 것은 dwMappingAddress 변수는 DWORD, 즉 unsigned int로 선언되어서 0 ~ 4,294,967,295의 범위를 갖는 걸로 압니다.

PAGE_DEFAULTSIZE가 0x200000, 즉 십진수로 2,097,512 이고,
MAXENTRYCOUNT가 512 여서

2,097,512 * 512 * 64 = 68,719,476,736 으로 dwMappingAddress가 가질 수 있는 범위를 한참 벗어나는데
어떻게 저 코드가 동작하나요?