티스토리 뷰

개발/Linux

pages_to_mb

Jaeyeon Baek 2011. 11. 2. 08:42



이름 그대로 pages를 Mbyte 단위로 return 하는 함수입니다. 일단 무식하게 산술 연산을 통해 pages를 Mbyte로 나타내봅시다, 예를 들어 pages가 4096이라 하면, 1 PAGE의 사이즈인 4096에 4096(bytes)를 곱하게 되면 byte 단위의 결과가 나오게 됩니다, 이를 Mbyte로 나타내려면, 결과에 /1024, /1024 두번을 통해 byte --> Kbyte --> Mbyte 연산을 해야될텐데 수식으로 나타내면 아래와 같습니다.

(4096 * 4096)/1024/1024 = 16 MB

뭔가 연산이 많은데요, 그렇다면 오늘 알아보는 pages_to_mb는 내부적으로 어떤 동작을 보일까요? 함수 내용은 아래와 같습니다.

static inline unsigned long pages_to_mb(unsigned long npg)
{
    return npg >> (20 - PAGE_SHIFT);
}

간단하지 않은가요? 입력 받은 npg를 (20 - PAGE_SHIFT) 만큼 비트연산을 하는게 전부입니다. 20 - PAGE_SHIFT 는 32Bit 기준으로 8이라는 결과가 도출되고, 결국 npg>>8 와 같은 내용이 됩니다. 좀 더 풀어보면, npg / (2의 8승 = 256) 과 같은 연산으로 풀이됩니다. 결국 (4096 * 4096)/1024/1024 와 같은 코드가 되는것을 확인 할 수 있습니다.

내용은 같지만 속도면에서 본다면 (어셈블 확인) 상당히 많은 연산이 생략됨을 알 수 있기에, 임베디드 개발자 라면 커널의 가벼운 함수 하나하나도 놓쳐서는 안되겠습니다.


'개발 > Linux' 카테고리의 다른 글

find command  (0) 2011.11.29
비용이 낮은 연산자 선택 [%->&, / -> >>]  (0) 2011.11.20
for_each_possible_cpu  (0) 2011.11.01
dmesg Option  (0) 2011.10.31
vmalloc 영역... [가설]  (0) 2011.10.28
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday