Q&A 게시판

리눅스 커널에 대한 Q&A 게시판 입니다. (비밀글 체크는 꼭 필요한 경우에만)

struct page와 실제 page의 구조에 대한 질문입니다

작성자
박성수
작성일
2024-02-26 21:45
조회
70
안녕하세요 문영일님. iamroot20기에서 공부하고 있는 박성수입니다.

물리 메모리 모델에 대해서 공부중인데 페이지 디스크립터(struct page)에 대한 개념이 부족한 부분이 많아 질문드립니다.

페이지 디스크립터(struct page)는 arm64의 경우 64bytes크기이고, 물리 page에 대한 정보를 담고 있는 구조체라고 이해했습니다.
하지만 어떻게 페이지 디스크립터와 실제 물리 page(4K짜리)가 연결되어 있는건지 잘 이해가 되지 않습니다.

예를 들어 커널에서 1개의 물리 페이지를 할당한다고 하면
struct page *page;
page = alloc_page(GFP_KERNEL);
이렇게 할당받아온 page를 가상메모리 매핑하여 사용하는 것으로 알고 있는데
엄밀히 말하면 여기서 반환된 친구는 실제 물리 페이지가 아니라 페이지 디스크립터가 아닌가.. 생각했습니다.

4k짜리 페이지의 시작부분에 64bytes크기만큼 페이지 디스크립터가 있고 64bytes 이후부분을 실제 데이터를 저장할 공간으로 사용하는 것은 아닌거 같은데
페이지 디스크립터와 실제 페이지에 어떻게 관계가 이루어져 있는건지 질문드립니다.

그리고 가상 메모리의 vmemmap 영역을 사용하여 page와 pfn 변환을 쉽게 하는 것으로 이해했는데 vmemmap 영역에 매핑되는 것이 페이지 디스크립터(64bytes)인지 아니면 실제 물리 페이지(4K)인지도 질문드립니다.

감사합니다.
전체 1
  • 2024-03-04 11:01
    안녕하세요? 박성수님

    alloc_page(GFP_KERNEL) API를 사용하면 커널에서 사용할 물리 메모리를 할당 받으면서 결과에는 이에 대한 가상 주소 또는 물리 주소가 아닌
    페이지 디스크립터를 할당받습니다. 즉 핸들같은 개념입니다. 이 페이지 디스크립터를 사용하여 할당 받은 물리 주소 및 가상 주소를 알아올 수 있습니다.

    다음은 페이지 디스크립터, 물리 주소 및 가상 주소와의 변환에 사용하는 여러 가지의 API 입니다.
    (주의: 커널용 메모리용이며, 유저 메모리의 변환은 또 다릅니다)
    - page_to_phys()
    - phys_to_page()
    - virt_to_phys()
    - phys_to_virt()

    * 참고: arch/arm64/include/asm/memory.h

    64비트 시스템들은 vmemmap 공간을 이용하여 위의 변환에 걸리는 시간을 단축시켜줍니다.
    vmemmap에 매핑되는 메모리는 당연히 실제 물리메모리입니다.

    감사합니다.

    문영일 드림.