추천: "Linux 비디오 튜토리얼"
커널 모듈 코드 또는 스레드가 메모리에 액세스할 때 코드의 메모리 주소는 모두 논리 주소이며 실제 물리적 메모리 주소에 해당하는 일대일 매핑입니다. 예를 들어 논리 주소 0xc0000003에 해당하는 물리 주소는 0×3, 0xc0000004에 해당하는 물리 주소는 0×4,..., 논리 주소와 물리 주소의 관계는 물리적 주소 = 논리 주소 – 0xC0000000: 이는 커널 주소 공간의 주소 변환 관계입니다. 커널의 가상 주소는 "상위"에 있지만 이에 매핑된 물리적 메모리 주소는 하위에 있습니다. .
물리적 메모리 주소 | |||||||
0×0 | |||||||
0 ×1 | |||||||
0×2 | |||||||
0×3 | |||||||
0xffffffff | |||||||
0×40000000 ?? | |||||||
물리적 메모리 주소 | 0xF8700000 |
0x F87000 01 | |
0xF8700002 | |
… 커널은 0×80000000 ~ 0x800FFFFF 물리적 메모리에 액세스한 후 0xF8700000 ~ 0xF87FFFFF 커널 선형 공간을 해제합니다. 이런 방식으로 다른 프로세스나 코드도 0xF8700000~0xF87FFFFF 주소를 이용해 다른 물리 메모리에 접근할 수 있다. 위의 설명을 통해 하이엔드 메모리의 가장 기본적인 아이디어를 알 수 있습니다. 즉, 주소 공간의 섹션을 빌려 임시 주소 매핑을 설정하고, 이 주소 공간에 도달하면 해제합니다. 재활용이 가능하고 모든 물리적 메모리에 액세스할 수 있습니다. 이것을 보고 일부 사람들은 묻지 않을 수 없습니다. 커널 프로세스나 모듈이 특정 논리 주소 공간을 계속 점유하고 이를 해제하지 않으면 어떻게 되나요? 이러한 상황이 실제로 발생하면 커널의 고급 메모리 주소 공간이 점점 더 좁아지게 되며, 점유되어 해제되지 않으면 물리적 메모리에 매핑되지 않더라도 액세스할 수 없게 됩니다.
3. 분할커널은 고급 메모리를 VMALLOC_START~VMALLOC_END, KMAP_BASE~FIXADDR_START 및 FIXADDR_START~4G의 세 부분으로 나눕니다.
고급 메모리의 세 부분에 해당합니다. 고급 메모리 매핑에는 세 가지 방법이 있습니다. 영구 커널 매핑 임시 커널 매핑 이 공간은 다음과 같은 특징을 가지고 있습니다. 임시 매핑을 수행하려면 매핑 목적을 지정해야 합니다. 매핑 목적에 따라 해당 작은 공간을 찾은 다음 이 공간의 주소를 매핑 주소로 사용하면 됩니다. 이는 임시 매핑으로 인해 이전 매핑이 덮어쓰여진다는 의미입니다. 임시 매핑은 kmap_atomic()을 통해 이루어집니다.
3. 기타1. 사용자 공간(프로세스)에는 하이엔드 메모리 개념이 있나요? 사용자 프로세스에는 고급 메모리 개념이 없습니다. 높은 메모리는 커널 공간에만 존재합니다. 사용자 프로세스는 최대 3G의 물리적 메모리에만 액세스할 수 있는 반면, 커널 프로세스는 모든 물리적 메모리에 액세스할 수 있습니다. 2. 64비트 커널에 고성능 메모리가 있나요? 현재 현실에서는 64비트 Linux 커널에는 512GB 이상의 메모리를 지원할 수 있기 때문에 고급형 메모리가 존재하지 않습니다. 머신에 설치된 물리적 메모리가 커널 주소 공간을 초과하면 고급 메모리가 됩니다. 3. 사용자가 액세스할 수 있는 실제 메모리는 얼마나 되나요? 커널 코드가 액세스할 수 있는 실제 메모리는 얼마나 됩니까? 32비트 시스템 사용자 프로세스는 최대 3GB에 접근할 수 있으며, 커널 코드는 모든 물리적 메모리에 접근할 수 있습니다. 64비트 시스템 사용자 프로세스는 최대 512GB 이상에 액세스할 수 있으며, 커널 코드는 모든 물리적 메모리에 액세스할 수 있습니다. 4. 하이엔드 메모리와 물리주소, 논리주소, 선형주소는 어떤 관계인가요? 고급 메모리는 논리 주소에만 관련되어 있으며 논리 주소 및 물리 주소와는 직접적인 관계가 없습니다. |
위 내용은 Linux 사용자 공간과 커널 공간에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!