Linux 커널에서 메모리 블록을 예약하는 방법은 무엇입니까?

Linux 커널에서 메모리 블록을 예약하는 방법은 무엇입니까?

OS 개입 없이 특별히 예약된 메모리 블록이 필요한 장치가 있습니다. 메모리 블록이 예약되어 있어 사용할 수 없음을 BIOS나 운영 체제에 알릴 수 있는 방법이 있습니까?

저는 openSUSE 시스템에서 이 장치를 사용하고 있습니다.

답변1

운영체제를 원하시면완전히무시하세요. 메모리 구멍을 만들려면 "."을 사용해야 합니다 memmap. 바라보다이 참조. 예를 들어 2GB의 512M을 원하면 memmap=512M$2G커널 명령줄에 ""를 입력합니다.

dmesg어떤 장치도 밟지 않도록 연속 구멍을 찾아야 합니다. 이는 마더보드 + 카드에만 해당됩니다 .

이것은아니요권장되는 작업 방법 - 올바르게 수행하는 방법(커널 드라이버 + DMA)에 대한 Warren Young의 답변을 참조하세요. 나는 당신이 묻는 정확한 질문에 대답하고 있습니다. 최종 사용자를 위해 이 제품을 만들 계획이라면증오만약 당신이 그들에게 이런 짓을 한다면... 저를 믿으세요. 그게 제가 이 대답을 아는 유일한 이유입니다.


편집: grub2 및 grubby(예: CentOS 7)를 사용하는 경우 다음이 필요합니다.$를 탈출하세요. \이전에도 하나 있었어야 했습니다 $. 예:

$ sudo -v
$ sudo grubby --update-kernel=ALL --args=memmap='128M\\$0x57EF0000'
$ sudo grubby --info $(sudo grubby --default-kernel) | grep memmap
args="ro crashkernel=auto ... memmap=128M\$0x57EF0000"

답변2

당신이 요구하는 것을 DMA라고합니다. 해당 메모리를 예약하려면 드라이버를 작성해야 합니다.

예, OS가 간섭하고 드라이버가 OS의 일부가 되는 것을 원하지 않는다고 말씀하신 것을 알고 있습니다. 하지만 드라이버 보존이 없으면 커널은 모든 메모리가 OS에 속한다고 생각합니다. (Aaron의 답변에 따라 커널에 메모리 블록을 무시하라고 지시하지 않는 한 그렇습니다.)

제15장(PDF) 중 "Linux 장치 드라이버, 3/eRubini, Corbet 및 Kroah-Hartmann의 "DMA 및 관련 주제".

이것의 HTML 버전을 원한다면 내가 찾았습니다.이 장의 두 번째 버전다른 곳에서는 온라인으로. 버전 2는 10년이 넘었으며 커널 2.4가 막 나올 때 출시되었습니다. 그 이후로 커널의 메모리 관리 하위 시스템에 많은 작업이 수행되었으므로 더 이상 적용되지 않을 수 있습니다.

답변3

ARM 기반 Linux의 커널에서 메모리 블록을 예약하려면 reserved-memory장치 트리(dts) 파일의 노드를 사용할 수도 있습니다. 커널 문서에서 (참조여기), 예가 있습니다:

memory {
    reg = <0x40000000 0x40000000>;
};

reserved-memory {
    #address-cells = <1>;
    #size-cells = <1>;
    ranges;

    /* global autoconfigured region for contiguous allocations */
    linux,cma {
        compatible = "shared-dma-pool";
        reusable;
        size = <0x4000000>;
        alignment = <0x2000>;
        linux,cma-default;
    };

    display_reserved: framebuffer@78000000 {
        reg = <0x78000000 0x800000>;
    };

    multimedia_reserved: multimedia@77000000 {
        compatible = "acme,multimedia-memory";
        reg = <0x77000000 0x4000000>;
    };
};

답변4

현재 설정을 확인하려면 다음 명령을 입력하여 시작하세요.

sysctl vm.min_free_kbytes

설정을 변경하려면 을 편집하세요 /etc/sysctl.conf. 다음 줄을 찾으세요.

vm.min_free_kbytes=12888

존재하지 않는 경우 원하는 값과 함께 만듭니다. 다음 값이 허용됩니다.

8192
12288
16384
20480

8M은 매우 보수적입니다. 16M도 편안하게 앉을 수 있습니다. 값을 변경한 후 재부팅하지 않고 다음 명령을 실행합니다.

sudo sysctl -p

관련 정보