Как я могу зарезервировать блок памяти от ядра Linux?

Необходимо смочь использовать сетевой стек непривилегированного режима. Запустите qemu как это:

qemu-system-x86_64 \
    -smp 1 -m 1024 \
    -net user,net=10.0.0.0/8,host=10.0.0.1,hostfwd=tcp:127.0.0.1:2222-10.0.0.2:22 \
    -net nic \
    -cdrom systemrescuecd-x86-2.0.1.iso -boot d

Важные опции:

  • -net nic: Покажите карту виртуальной сети для гостя
  • -net user: Заставьте процесс qemu на хосте связаться по реальной сети точно так же, как любой другой процесс был бы
  • net=10.0.0.0/8: Подсеть в виртуальной сети
  • host=10.0.0.1: IP-адрес хоста в виртуальной сети
  • hostfwd=tcp:127.0.0.1:2222-10.0.0.2:22: Процесс qemu на хосте прислушивается к соединениям TCP от localhost на порте 2222 и вперед их к виртуальной сети к 10.0.0.2:22 (таким образом, Вы можете ssh к своей новой виртуальной машине),

На выполненном госте

ifconfig eth0 10.0.0.2 up
ip route add default via 10.0.0.1 dev eth0

Протестируйте SSH от хоста до гостя

ssh 127.0.0.1 -p 2222

и от гостя для хостинга

ssh 10.0.0.1

Протестируйте интернет-достижимость от гостя

wget google.com

Хост-процесс работает как маршрутизатор NAT. Только TCP и трафик UDP будут работать. В особенности проверьте с помощью ping-запросов только работы между гостем и хостом, Вы не можете проверить с помощью ping-запросов google.com (мой обычный сетевой метод тестирования). Преимущество этого подхода состоит в том, что Вам даже не нужны полномочия пользователя root.

26
02.05.2012, 03:18
4 ответа

То, что Вы просите, называют DMA. Необходимо записать драйвер, чтобы зарезервировать эту память.

Да, я понимаю, что Вы сказали, что не хотели, чтобы ОС вмешалась, и драйвер становится частью ОС, но в отсутствие резервирования драйвера, ядро полагает, что вся память принадлежит ему. (Если Вы не говорите ядру игнорировать блок памяти на ответ Aaron, который является.)

Глава 15 (PDF) "Драйверов устройств Linux, 3/e" Rubini, Corbet и Kroah-Hartmann касается DMA и связанных тем.

Если Вы хотите версию HTML этого, я нашел версию второго выпуска главы в другом месте онлайн. Остерегайтесь этого, 2-й выпуск составляет более чем десятилетие, старое теперь, выйдя, когда ядро 2.4 было новым. Была большая работа над подсистемой управления памятью ядра с тех дней, таким образом, это не может применяться очень хорошо больше.

24
27.01.2020, 19:39
  • 1
    С DMA я могу выбрать что физические адреса использовать? Ядро даст мне непрерывный блок памяти? Это, как гарантируют, будет всегда доступно? –  Nathan Fellman 02.05.2012, 07:15
  • 2
    На Ваши вопросы отвечают, начиная на странице 442 PDF, на который я указал на Вас. –  Warren Young 02.05.2012, 07:34

Если Вы хотите, чтобы ОС полностью проигнорировала его, необходимо сделать использование дыры памяти"memmap." Посмотрите эту ссылку. Например, если Вы хотите 512M в барьере на 2 ГБ, можно поместить"memmap=512M$2G"на Вашей командной строке ядра.

Необходимо будет проверить Ваш dmesg чтобы найти, что непрерывная дыра крадет так Вас, не топают ни на каких устройствах; это характерно для Вашего motherboard+cards.

Это не рекомендуемый способ сделать, вещи - видят ответ Warren Young для того, как правильно сделать это (драйверы ядра + DMA). Я отвечаю на точный вопрос, который Вы задали. Если Вы запланируете создание этого для конечных пользователей, то они будут ненавидеть Вас, если Вы сделаете это им... доверяет мне, это - единственная причина, я знал этот ответ.


Править: При использовании неряшливого grub2 w/(например, 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"
25
27.01.2020, 19:39
  • 1
    В то время как Ваш ответ действительно отвечает на мой вопрос непосредственно, ответ Warren's, кажется, лучший способ пойти об этом. :-) –  Nathan Fellman 02.05.2012, 09:32
  • 2
    @WarrenYoung я понятия не имею, что Вы, как предполагается, делаете с ним. Я предположил бы"uint8_t *ptr = 0x8000000"с моим примером? Или это может segfault... Ха, я действительно не знаю. Снова, я знал ответ, потому что я был конечным пользователем плохо разработанной платы PCI, где я должен был вручную выделить буфер ниже 4G, отмечают и затем говорят драйвер, где то пространство было; это не может быть возможно от пространства пользователя. –  Aaron D. Marasco 02.05.2012, 13:14
  • 3
    Только для усмешек, я изучил немного глубже это, и кажется, что Вам нужно MMAP_FIXED | MMAP_ANON. Без пользовательского устройства DMA здесь для проигрывания с я не могу сказать, делает ли оно на самом деле то, что требуемый OP, но мое поле CentOS счастливо дал мне блок на 8 МБ на уровне 512 МБ, когда я сказал memmap=8M$512M в GRUB. Это даже не требует корневого доступа, поскольку я боялся, что это могло бы. Но даже если это действительно делает правильную вещь, я все еще думаю, что Вам, вероятно, будет нужен драйвер для обработки прерываний и такого. –  Warren Young 02.05.2012, 16:05
  • 4
    @AaronD.Marasco: Нет, mmap()'d страницы обнуляются, прежде чем код пространства пользователя добирается для наблюдения их. Это сделано для безопасности, так, чтобы данные не протекали от одного процесса до следующего. Другая причина использовать драйвер, так как Вы, возможно, должны были бы сохранить содержание буфера DMA во время загрузки драйвера. О, и между прочим, произвольно расположенный mmap() вызов успешно выполняется даже без memmap параметр загрузки ядра, по крайней мере, пока никто уже не использует память, расположенную, где Вы спросили. Параметр загрузки, несомненно, увеличивает шансы на успех, но это не строго необходимо. –  Warren Young 03.05.2012, 20:42
  • 5
    @AaronD.Marasco хм, хорошо. интересный. спасибо за ту ссылку, это - хорошее чтение. –  Woodrow Barlow 21.03.2017, 16:10

Сначала введите эту команду, для проверки текущей установки:

sysctl vm.min_free_kbytes

Изменить установленное значение, редактирование /etc/sysctl.conf. Ищите строку:

vm.min_free_kbytes=12888

Если это не существует, создайте его (наряду с Вашим требуемым значением). Следующие значения приемлемы:

8192
12288
16384
20480

8M чрезвычайно консервативно; это может находиться в 16M удобно. После того как Вы изменяете значение, выполняете это, и никакая перезагрузка не необходима:

sudo sysctl -p
0
27.01.2020, 19:39
  • 1
    Не очищайте свои сообщения; или удалите его или отметьте его, чтобы модератор удалил для Вас. –  jasonwryan 24.01.2013, 10:29

Чтобы зарезервировать блок памяти из ядра в Linux на базе ARM, вы также можете использовать узел 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>;
    };
};
6
20.08.2021, 13:26

Теги

Похожие вопросы