2012-02-04 3 views
1

나는 메모리를 alloc_page(GFP_USER)에 할당하고 있으며, 하나 이상의 페이지를 할당했다. 나는 그것을 연속적인 영역으로 보게 할 필요가있다. (버퍼로부터 만들 필요가있다.) 그래서 나는 그것을 *(vm_beg + off)으로 취소하고 싶다.커널 공간에서 연속 영역 만들기

나는 사용자 공간에서 mmap으로 가능하지만 커널 공간에서 어떻게 할 수 있는지 알고 있습니다.

답변

5

당신은 당신이 이렇게 (더 많은 정보 here을) 할 vmalloc()를 사용할 수 사실상 연속 메모리를 할당해야하는 경우. 실제 실제 메모리가 흩어져있을 수 있으므로 CPU MMU 외부의 일부 하드웨어 블록 (예 : DMA, PCI 버스)에서 버퍼를 사용하려는 경우 vmalloc()이 최선의 방법이 될 수 있습니다.

대부분의 경우 kmalloc()을 사용해야합니다 (추가 정보 here). 차이점은 vmalloc()이 항상 새로운 메모리를 얻기 위해 페이지 테이블을 수정한다는 것입니다 (사용자 영역에 mmap()와 같은 비트). 또 다른 차이점은 kmalloc()의 phisically 연속 메모리를 제공하며 항상 페이지 테이블을 수정해야하는 vmalloc()보다 빠릅니다.

Linux 메모리에 대한 유용한 정보는 Linux Device Drivers 3 (특히 15 장의 경우)입니다. 대부분의 질문에 대한 답을 찾을 수있을 것입니다.