Linux 커널 보호 메모리와 예약 메모리의 차이점은 무엇입니까? (메모리 매핑 매개변수)

Linux 커널 보호 메모리와 예약 메모리의 차이점은 무엇입니까? (메모리 매핑 매개변수)

Linux 커널은 memmap매개변수 *)를 사용하여 다양한 사용 사례에 맞게 메모리 영역을 수동으로 지정합니다.

질문: 차이점은 무엇인가요?예약된기억( memmap=nn[KMG]$ss[KMG])과보호받다메모리( memmap=nn[KMG]!ss[KMG])?

즉, 커널은 이를 어떻게 처리하며 언제 사용됩니까?

에 관해서는 예약된 메모리 가 보호된 메모리로 나열되어 있다고 /proc/iomem생각합니다 . 그렇죠?ReservedRAM buffer


*) 텍스트로 가득 차 있지 않고 연결 가능한 좋은 참조 페이지를 찾을 수 없어서 링크를 첨부했습니다.커널 문서:

memmap=exactmap [KNL,X86] Enable setting of an exact
                E820 memory map, as specified by the user.
                Such memmap=exactmap lines can be constructed based on
                BIOS output or other requirements. See the memmap=nn@ss
                option description.

memmap=nn[KMG]@ss[KMG]
                [KNL] Force usage of a specific region of memory.
                Region of memory to be used is from ss to ss+nn.
                If @ss[KMG] is omitted, it is equivalent to mem=nn[KMG],
                which limits max address to nn[KMG].
                Multiple different regions can be specified,
                comma delimited.
                Example:
                        memmap=100M@2G,100M#3G,1G!1024G

memmap=nn[KMG]#ss[KMG]
                [KNL,ACPI] Mark specific memory as ACPI data.
                Region of memory to be marked is from ss to ss+nn.

memmap=nn[KMG]$ss[KMG]
                [KNL,ACPI] Mark specific memory as reserved.
                Region of memory to be reserved is from ss to ss+nn.
                Example: Exclude memory from 0x18690000-0x1869ffff
                         memmap=64K$0x18690000
                         or
                         memmap=0x10000$0x18690000
                Some bootloaders may need an escape character before '$',
                like Grub2, otherwise '$' and the following number
                will be eaten.

memmap=nn[KMG]!ss[KMG]
                [KNL,X86] Mark specific memory as protected.
                Region of memory to be used, from ss to ss+nn.
                The memory region may be marked as e820 type 12 (0xc)
                and is NVDIMM or ADR memory.

memmap=<size>%<offset>-<oldtype>+<newtype>
                [KNL,ACPI] Convert memory within the specified region
                from <oldtype> to <newtype>. If "-<oldtype>" is left
                out, the whole region will be marked as <newtype>,
                even if previously unavailable. If "+<newtype>" is left
                out, matching memory will be removed. Types are
                specified as e820 types, e.g., 1 = RAM, 2 = reserved,
                3 = ACPI, 12 = PRAM.

답변1

예약된메모리는 어떤 이유로 커널이 일반 메모리로 사용할 수 없거나 사용해서는 안 되는 메모리입니다.

보호됨메모리(때때로라고도 함)지속적인 기억)은 재부팅이나 정전 시에도 내용을 유지하도록 보장되는 메모리입니다.비휘발성 DIMM(NVDIMM)또는 다른 이유로.

e820 유형 12는 ACPI 6.0 이전의 일부 시스템에서 NVDIMM을 나타내는 데 사용되었기 때문에 해석하기 어렵습니다.보호/영구 메모리, 그러나 ACPI 6.0에서는 이를 유형 7로 정의하고 유형 12를 "OEM 예약"으로 재정의합니다.

커널의 주석아치/x86/include/asm/e820/types.h일부 이전 시스템에서는 유형 6을 사용하여 보호/영구 메모리를 나타냈습니다. 즉, 초기 NVDIMM 지원은 ACPI 6.0이 새로운 정의를 제공할 때까지 공급업체별로 엉망이었습니다(그리고 "이 혼란을 건드리지 마세요"를 의미하도록 이전 정의를 재정의했습니다). ).

Linux는 설정되지 않은 한 e820 유형 12 메모리의 지속성 기능을 분명히 무시합니다 CONFIG_X86_PMEM_LEGACY=y.

답변2

이것은 답변의 일부일 뿐입니다. 테스트를 통해 나는 다음을 배웠습니다.

다음과 같은 Linux 명령줄의 경우: ( memmap=0x8000000$0x1d000000grub의 경우 grub.conf에서 참조해야 합니다 memmap=0x8000000\$0x1d000000.) 부팅 중에 다음 줄이 표시됩니다.

reserve setup_data: [mem 0x000000001d000000-0x0000000024ffffff] reserved

Linux 명령줄: 의 경우 memmap=0x8000000!0x1d000000시작 중에 다음 줄이 표시됩니다.

reserve setup_data: [mem 0x000000001d000000-0x0000000024ffffff] persistent (type 12)

커널 명령줄 옵션을 추가한 후 iomem=relaxed,예약된내가 액세스할 수 있는 범위 /dev/mem, mmap 및 읽기/쓰기를 구성합니다 0x1d000000. 내가 사용할 때보호받다구성을 통해 액세스할 수 없습니다 /dev/mem(그리고 메시지가 나타납니다 :) x86/PAT: peek:9098 map pfn expected mapping type uncached-minus for [mem 0x1d000000-0x1d000fff], got write-back.

이에 대해 더 간접적으로 관련된 정보를 찾으려면Linux 커널 x86 PAT 문서. 유익한 내용인 것 같지만 보호된 것과 예약된 것의 차이를 실제로 드러내지는 않습니다. 하지만 이것을 보세요캐시되지 않은 마이너스, mmap 및 이와 유사한 항목에 대한 추가 정보에 대한 질문/답변. 그만한 가치가 있으므로 위에 나열된 매핑이 없습니다 /sys/kernel/debug/x86/pat_memtype_list ./proc/mtrr예약된구성.

위에서 말했듯이 "지속적(유형 12)"은 E820_TYPE_PRAM(aka )로 디코딩되고 (aka ) IORES_DESC_PERSISTENT_MEMORY_LEGACY로 "유지"됩니다 . 보다 구체적으로,E820_TYPE_RESERVEDIORES_DESC_RESERVED아치/x86/kernel/e820.c커널 명령줄의 구문 분석을 볼 수 있습니다.

이 모든 정보에도 불구하고 저는 여전히 차이점을 근본적으로 이해하지 못합니다. 어쩌면 누군가가 마침내 이 질문에 답할 수 있을 것입니다. 하지만 아마도 그것은 사람들이 가진 어떤 문제를 해결하기에 충분할 것입니다.

관련 정보