2014-09-19 1 views
1

mmap 오프셋의 마지막 12 비트를 0으로 설정하면 __SC_PAGE_SIZE의 배수가되는 이유는 무엇입니까? 예를 들어mmap 오프셋에 대한 마지막 12 비트를 0으로 설정

: 여기

offset = address & ~(PAGE_SIZE - 1); 

PAGE_SIZE = 당신은 1 위의 모든 비트를 zero'ing에 관심이 있다면 4096

+0

당신이 그것을 10 진수로 생각하면 어떨까요? – Quentin

+0

'__SC_PAGE_SIZE'는 2의 거듭 제곱보다 작거나 같기 때문에 당신이주는 모든 정보가 정확하다고 가정하십시오.) –

답변

0
4096dec = 00..001000000000000bin 

, 당신은 PAGE_SIZE-1 수행

00..000111111111111 

NOT 연산자는 이러한 위치에없는 모든 비트가 고려되도록합니다.

~00..000111111111111 = 11..11000000000000 

위 주소 비트와 위의 0 부분을 모두 제로 아웃하십시오.

이 값은 2의 제곱 수의 배수 인 값을 얻기 위해 일반적으로 사용되는 비트 트릭입니다.

통지해야 할 사항 : 게시 한 코드가 인 경우 오프셋 값을 2의 제곱수로 줄이면 이 될 수 있습니다. 나는. 당신이 4500을 입력하면, 당신은 당신이 전원의 - 두 수의 하단에 가장 가까운 배수로 떨어 즉 (4096 오프셋 (offset)받을거야 주소 정렬 버전이 방법이 더 사용

:.

aligned_address = (address + PAGE_SIZE -1) & ~(PAGE_SIZE - 1); 
+0

4500을 주소로 제공하면 코드가 8192가됩니다. 낮은 주소 공간이 필요합니까? 2048과 같이 – user1876942

+0

코드가 마지막으로 사용되지 않습니다. 내가 게시했지만 결함에 의해 "2의 배수로 둥근"게시 됨 –

관련 문제