У меня есть драйвер устройства Linux, который взаимодействует через интерфейс к устройству, которое, в теории, может выполнить DMA с помощью 64-разрядных адресов. Я хотел бы протестировать, чтобы видеть, что это на самом деле работает.
Существует ли простой способ, которым я могу вынудить машину Linux не использовать память ниже физического адреса 4G? Хорошо, если изображение ядра находится в низкой памяти; я просто хочу быть в состоянии вызвать ситуацию, где я знаю все свои динамично выделенные буферы, и любое ядро или пользовательские буферы, выделенные для меня, не адресуемы в 32 битах. Это - немного грубой силы, но было бы более всесторонним, чем что-либо еще, о чем я могу думать.
Это должно помочь мне поймать (1) аппаратные средства, которые не были настроены правильно или загружены полным адресом (или просто повреждается), а также (2) случайное и ненужное использование буферов возврата (потому что нет, чтобы нигде возвратиться к).
разъяснение: я выполняю x86_64, таким образом, я не забочусь о большинстве старых 32-разрядных проблем обращения. Я просто хочу протестировать это, драйвер может правильно взаимодействовать через интерфейс со множествами буферов с помощью 64-разрядных физических адресов.
/usr/src/linux/Documentation/kernel-parameters.txt
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, from ss to ss+nn. memmap=nn[KMG]#ss[KMG] [KNL,ACPI] Mark specific memory as ACPI data. Region of memory to be used, from ss to ss+nn. memmap=nn[KMG]$ss[KMG] [KNL,ACPI] Mark specific memory as reserved. Region of memory to be used, from ss to ss+nn. Example: Exclude memory from 0x18690000-0x1869ffff memmap=64K$0x18690000 or memmap=0x10000$0x18690000
Если вы добавите memmap = 4G $ 0
к параметрам загрузки ядра, нижние 4 ГБ физической памяти больше не будут доступны . Кроме того, ваша система больше не будет загружаться ... но некоторые его варианты ( memmap = 3584M $ 512M
?) Могут обеспечить достаточно памяти ниже 4 ГБ для загрузки системы, но недостаточно для того, чтобы буферы DMA вашего драйвера могли размещаться там.
IIRC. В конфигурации ядра есть опция для использования расширений PAE, которые позволят вам использовать более 4 ГБ (I Я немного ржавый в конфигурации ядра - последнее ядро, которое я перекомпилировал, было 2.6.4 - так что, пожалуйста, извините, что я не помню). Вы знаете, как запустить конфигурацию ядра
make clean && make menuconfig
Надеюсь, это поможет, С наилучшими пожеланиями, Том.