LINUX.ORG.RU

Выделить область RAM с непрерывным диапазоном физических адресов

 , , ,


0

3

Здравствуйте. Есть PCI Express девайс, который должен получить доступ к памяти, расположенной за root colmplex. В текущей реализации устройству необходимо, чтобы диапазон физических адресов, к которым идет обращение был непрерывен.

От коллеги слышал, что через некий параметр ядра можно ограничить объём используемой памяти, затем через mmap обратно подключить неиспользуемый диапазон. Подскажите, что это может быть за параметр и как с ним работать?


В текущей реализации устройству необходимо, чтобы диапазон физических адресов, к которым идет обращение был непрерывен

Какого объема требуется непрерывный диапазон? И зачем так делать?

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Для макета хватит 1 Гб, потом нужно будет расширить до 128Гб.

И зачем так делать?

Не хочу сейчас поднимать DMA и писать драйвер.

Leks62
() автор топика
Ответ на: комментарий от Leks62

Ясно, логичное решение. Если надумаешь драйвер с DMA делать - пиши, подскажу, да и многие на форуме тоже в PCI-E+DMA тоже шарят.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от anonymous

Спасибо, похоже это то, что искал, буду изучать)

Leks62
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Благодарю, когда возникнут вопросы обязательно обращусь!

Leks62
() автор топика
Ответ на: комментарий от anonymous

Сегодня пробовал использовать этот параметр. В файл /etc/default/grub

добавил строку:

GRUB_CMDLINE_LINUX=«map=31G»

После запуска системы выполнил:

user:~$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.19.0-25-generic root=UUID=96b84796-6aeb-400d-9531-9680a430b447 ro quiet splash vt.handoff=7

Я так понял параметр не применился?

Leks62
() автор топика
Ответ на: комментарий от Leks62

update-grub2 не забывай в таких случаях.

И рекомендую использовать для такого GRUB_CMDLINE_LINUX_DEFAULT — в отличие от другого он не применяется для пункта с recovery.

Редактировать можно несколько минут после постинга, потом нельзя.

a1batross ★★★★★
()
Последнее исправление: a1batross (всего исправлений: 1)
Ответ на: комментарий от Leks62

где в этом форуме функция редактирования сообщения?

после первой звезды :) // пока, что используй кнопку «Предпросмотр»

anymouze ★★
()

На всякий случай оставлю здесь инструкцию, может кому пригодится.

1) В файл /etc/default/grub добавляем следующую строку:

GRUB_CMDLINE_LINUX_DEFAULT="mem=31G"
//В моем случае всего на компе 32G RAM.

2) выполнить команду

sudo update-grub2

3) После перезагрузки проверяем результат, для этого я использовал команды:

cat /proc/cmdline
выдает параметры, с которыми загрузилось ядро
cat /proc/iomem
смотрим карту физических адресов. Нас интересует строка System RAM
dmesg | grep "mem"
Смотрим буфер сообщений ядра. В моём случае интересуют следующие строки:
[    0.000000] BIOS-e820: [mem 0x0000000100000000-0x000000082effffff] usable
...
[    0.000000] user: [mem 0x0000000100000000-0x00000007bfffffff] usable

«Обрезанный» гиг лежит в диапазоне начиная с 0x7c0000000. Для доступа к этой памяти можно использовать devmem: https://github.com/hackndev/tools/blob/master/devmem2.c

Свою задачу я решил, но сейчас обратил внимание вот на какой момент: 0x7c0000000 - 0x82effffff это же явно больше чем гиг, wtf?

Leks62
() автор топика
Ответ на: комментарий от Leks62

0x7c0000000 - 0x82effffff это же явно больше чем гиг, wtf?

ну типа, память устройств-то куда-то картируется? вот и происходит «расширение» виртуальной памяти == память устройств + системная

metawishmaster ★★★★★
()
Последнее исправление: metawishmaster (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.