>  기사  >  운영 및 유지보수  >  리눅스에서 pfn이란 무엇입니까?

리눅스에서 pfn이란 무엇입니까?

青灯夜游
青灯夜游원래의
2022-03-24 11:57:323806검색

Linux에서 pfn은 "페이지 프레임 번호"를 의미하며, 이는 물리적 메모리 영역 번호입니다. "페이지 프레임"은 물리적 메모리를 페이지 크기 영역으로 나누고 각 페이지에 번호를 부여하며 이 번호가 PFN입니다.

리눅스에서 pfn이란 무엇입니까?

이 튜토리얼의 운영 환경: linux5.9.8 시스템, Dell G3 컴퓨터.

1. 페이지 프레임이란?

운영 체제의 가장 중요한 기능 중 하나는 컴퓨터 시스템의 다양한 자원을 관리하는 것입니다. 가장 중요한 자원인 메모리로서 우리는 이를 관리해야 합니다. Linux 운영 체제에서는 페이지 크기에 따라 물리적 메모리가 관리되며, 특정 페이지 크기는 하드웨어와 관련이 있으며 Linux 시스템 구성은 가장 일반적인 설정입니다. 따라서 물리 메모리의 경우 페이지 크기에 따라 배열된 페이지로 나누어 각 물리 메모리에 있는 페이지 크기의 메모리 영역을 페이지 프레임이라고 합니다. 각 물리적 페이지의 사용을 추적하기 위해 각 물리적 페이지 프레임에 대한 구조체 페이지 데이터 구조를 설정합니다. 커널의 텍스트 세그먼트에 사용됩니까? 아니면 프로세스의 페이지 테이블인가요? 각종 파일 캐시에 사용되는 건지, 아니면 프리 상태인지...

각 페이지 프레임은 일대일로 대응하는 페이지 데이터 구조를 가지고 있는데, page_to_pfn과 pfn_to_page 매크로는 페이지 사이에서 사용할 수 있도록 시스템에 정의되어 있습니다. 프레임 번호와 페이지 데이터 구조. 구체적인 변환 방법은 메모리 모델과 관련이 있습니다. Linux 커널의 세 가지 메모리 모델은 3장에서 자세히 설명합니다.

2.PFN이란 무엇인가요?

컴퓨터 시스템의 경우 전체 물리적 주소 공간은 0부터 시작하여 실제 시스템이 지원할 수 있는 최대 물리적 공간까지 끝나는 주소 공간 기간이어야 합니다. ARM 시스템에서 물리 주소가 32비트라고 가정하면 물리 주소 공간은 4G입니다. ARM64 시스템에서 지원되는 물리 주소 비트 수가 48이면 물리 주소 공간은 256T입니다. 물론 실제로 이렇게 큰 물리적 주소 공간이 모두 메모리에 사용되는 것은 아니며 일부는 I/O 공간에도 속합니다(물론 일부 CPU 아치에는 자체 독립적인 io 주소 공간이 있습니다). 따라서 메모리가 차지하는 물리적 주소 공간은 제한된 간격이어야 하며 전체 물리적 주소 공간을 커버하는 것은 불가능하다. 그러나 이제 메모리가 점점 커지고 있어 32비트 시스템의 경우 4G 물리적 주소 공간은 더 이상 메모리 요구 사항을 충족할 수 없으므로 하이 메모리라는 개념이 있는데 이에 대해서는 나중에 자세히 설명합니다.

PFN은 페이지 프레임 번호의 약어입니다. 소위 페이지 프레임은 물리적 메모리를 페이지 크기 영역으로 나누어 각 페이지에 번호를 부여합니다. 물리적 메모리가 주소 0에서 시작한다고 가정하면 PFN이 0인 페이지 프레임은 주소 0(물리적 주소)에서 시작하는 페이지입니다. 물리적 메모리가 주소 x에서 시작한다고 가정하면 첫 번째 페이지 프레임 번호는 (x>>PAGE_SHIFT)입니다.

PFN의 값 범위는 0----(메모리 크기>> 12)입니다.

그러나 물리적 메모리 매핑 관계로 인해 물리적 메모리 주소 0은 시스템의 물리적 주소 0에 해당하지 않습니다. 예를 들어 s3c2440에서 메모리 주소는 0x30000000부터 시작합니다. 램이 연결되면 s3c2440 관점에서 램의 0번 주소는 0x30000000이므로 시스템의 pfn 값은 (물리적 주소 - 메모리 기본 주소)>>

그러나 Linux에서는 가상 주소를 사용하므로 먼저 가상 주소를 실제 주소로 변환해야 합니다. 따라서 Linux에는 커널 선형 공간의 가상 주소를 pfn으로 변환하는 매크로 정의가 있습니다.

#define virt_to_pfn(kaddr)	(__pa(kaddr) >> PAGE_SHIFT)   //__pa() 将虚拟地址转化成物理地址  
#define pfn_to_virt(pfn)	__va((pfn) << PAGE_SHIFT)

따라서 pfn은 Linux 커널의 페이지 프레임 번호와 일치해야 합니다. 해당 물리적 ​​주소는 간단한 변환을 통해 찾을 수 있습니다.

각 물리적 페이지에 대해 커널은 이를 설명하기 위해 설명자(page)를 할당합니다. pfn을 페이지로 변환할 수 있습니다:

#define page_to_pfn __page_to_pfn
#define pfn_to_page __pfn_to_page

모든 페이지 구조는 쉽게 관리할 수 있도록 mem_map에 저장됩니다.

리눅스는 물리적 메모리를 4K 페이지로 나누어 관리하기 때문이죠. 따라서 MMU도 일치를 위해 소프트웨어에 설정됩니다. 나중에 설명했습니다.

Linux는 4G 가상 공간을 사용자 공간과 커널 공간으로 나눕니다. 사용자 공간은 0---3G이고 커널 공간은 3G---4G입니다. 사용자 공간은 커널 공간에서 접근할 수 있지만, 커널 공간은 시스템 호출을 통해 사용자 공간에서 접근해야 합니다.

관련 추천: "Linux 비디오 튜토리얼"

위 내용은 리눅스에서 pfn이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.