64비트 x86 아키텍처에서 페이지 캐시는 커널에 어떻게 매핑됩니까?

64비트 x86 아키텍처에서 페이지 캐시는 커널에 어떻게 매핑됩니까?

최신 64비트 x86 Linux에서 커널 측은 가상 페이지와 물리적 페이지 간의 매핑을 어떻게 설정합니까? 사용자 측에서는 mmap4K 페이지를 사용자 공간에 직접 매핑하는 페이지 캐시에서 페이지를 가져올 수 있습니다. 하지만 저는 페이지가 커널 측에서 어떻게 매핑되는지에 관심이 있습니다.

"전체 메모리 ID 매핑"이나 다른 것을 사용합니까? 전체 RAM ID 맵은 일반적으로 1GB 페이지를 사용합니까?

답변1

최신 64비트 x86 Linux를 사용하시나요?

예. kmap()or 를 호출 kmap_atomic()하지만 x86-64에서는 항상 ID 매핑을 사용합니다. x86-32에는 구체적인 정의가 있지만 x86-64는 일반적인 정의를 사용하는 것 같습니다./linux/highmem.h 포함.

예, ID 매핑은 1GB 대용량 페이지를 사용합니다.

LWN 기사에서 kmap_atomic을 언급했습니다..

나는 kmap_atomic()을 찾아서 찾았습니다.PIO 코드.[*]

마지막으로 read() / write()가 페이지 캐시에서 페이지 캐시로 데이터를 복사할 때:

generic_file_buffered_read->페이지를 반복자로 복사-> 다시 kmap_atomic()을 실행합니다.


[*] 나는 페이지 캐시에 DMA를 수행할 때 커널이 매핑 사용을 피할 수 있다는 것을 깨달았기 때문에 PIO를 살펴보았습니다. 커널은 물리적 주소를 구문 분석하여 하드웨어에 전달할 수 있습니다 :-). (IOMMU에 따라 다름). 그러나 커널이 먼저 데이터를 체크섬하거나 암호화하려는 경우 매핑이 필요합니다.

관련 정보