페이지 할당 관련
글쓴이: 변유준 / 작성시간: 화, 2009/07/21 - 1:29오후
리눅스에서 페이지 할당할때
alloc_pages()를 쓰게 되는데...
이걸쓰는데 질문입니다. 너무 황당할수도 있는 질문인데 ㅠㅠ
allloc_pages() 두번째 매개변수는 할당받는 페이지의 개수를 지정합니다(2의 지승)
이후 리턴은 페이지 디스크립터 포인터 형을 반환하죠.
여기서 궁금한게
하나를 할당받았을때는 그냥 쓰면 되지만
다수의 페이지 할당을 요청했을때는 맨 첫번째 페이지의 디스크립터 주소만 반환하게 됩니다.
1. 그러면 요청한 페이지 첫번째를 제외한 페이지들은 어떻게 접근이 가능하죠?
2. 반환된 페이지들은 물리적으로 연속인가요? 아니면 가상으로 연속인가요?
혹시 아시는분 조언 부탁드립니다.
Forums:
1. Parameter로 넘어간
1. Parameter로 넘어간 갯수 만큼 연속으로 만들어지기 때문에 첫번째 페이지 주소 + 페이지 크기 하면 됩니다. 대략
page_address( page ) + PAGE_SIZE * n 처럼 하시면 되겠네요.
2. alloc_page 계열은 physically 연속입니다. 가상으로 연속인 페이지들을 받으시려면 vmalloc 등을 쓰셔야 합니다.
___
evolution...
___
evolution...
리턴이 구조체
리턴이 구조체 포인터니까..
그냥 포인터에 +1 하시면 다음페이지가 됩니다.
연속된 배열이 아닐
연속된 배열이 아닐 수도 있어서 nth_page(page, n) 사용하셔야 합니다.
연속되어 있습니다.
연속되어 있습니다.
만일 그렇지 않다면 님이 제시한 함수조차도 문제해결이 불가능한 인터페이스가 되버립니다.
include/linux/mm.h
include/linux/mm.h
#define nth_page(page,n) pfn_to_page(page_to_pfn((page)) + (n))
이구요, include/asm-generic/memory_model.h 보시면, FLATMEM 일 때는 pfn <-> page mapping이 연속된 mem_map array에 인덱싱만 하지만 DISCONTIGMEM(NUMA 노드별로 이어서)이나 SPARSMEM (indirection이 완전히 한 layer 더 있습니다, NUMA 노드별로 연속되어있지도 않거나 memory hotplug시)인 경우는 하나의 연속된 배열이 아니라서 page + N 하시면 안됩니다.
근데 왜 연속된 배열이 아니면 nth_page()가 문제해결이 불가능한 인터페이스가 되죠?
변유준
답변 감사드립니다~ 꾸벅~
댓글 달기