Подтвердить что ты не робот

Как получить размер страницы ядра Linux

Я работаю над модулем Linux для IA64. Моя текущая проблема заключается в том, что драйвер использует макросы PAGE_SIZE и PAGE_SHIFT для распределения страниц dma. Проблема, с которой я столкнулась, заключается в том, что машина, компилирующая драйвер, не те, которые необходимы для запуска драйвера. Итак, если PAGE_SIZE на компиляторе составляет 2 ^ 14K, а машина назначения - 2 ^ 16K, тогда драйвер не работает.

Я не хочу превращать этот вопрос в вопрос "лучшей практики" о компиляции модулей на машинах, которые не являются модулями. Я понимаю вопросы об этом. Я обнаружил, что люди в основном используют getpagesize() или sysconf (_SC_PAGE_SIZE). Эти два варианта находятся вне заголовков ядра iia64, поэтому я не могу их использовать. Есть ли другой способ, которым я мог бы получить время выполнения PAGE_SIZE?

Параметры, на которые я смотрю:

  • Чтение некоторого файла в /proc?
  • Системный вызов?
  • Другая функция, которая позволяет мне вычислять PAGE_SIZE путем вывода (например, ORDER, getpageshift и т.д.)?
  • Другое?
4b9b3361

Ответ 1

Это то, что я, наконец, сделал:

  • Переработайте мой текущий модуль, чтобы взять новый параметр модуля с именем page_shift и использовать его для вычисления PAGE_SIZE (PAGE_SIZE = 1 << PAGE_SHIFT)
  • Создал оболочку загрузчика модуля, которая получает текущую систему PAGE_SHIFT, используя getconf API от libc. Эта оболочка получает текущий сдвиг системной страницы и передает ее в качестве параметра модуля.

В настоящий момент модуль загружается на разные архитектуры с разными PAGE_SIZE без проблем.

Ответ 2

Попробуйте использовать утилиту getconf, которая позволит легко получить размер страницы.

getconf PAGESIZE

Ответ 3

Один примерный метод состоит в том, чтобы читать /proc/meminfo и проверять размер Mapped (на мой момент его 52544 kB на данный момент), а затем проверить nr_mapped на /proc/vmstat (на моем его 131136 на данный момент). Наконец PAGE_SIZE = Mapped/nr_mapped. Иногда это дает вам точное значение (как в текущем примере, которое я цитировал), а иногда и приблизительное, но очень близкое. Надеюсь, это поможет!

Ответ 4

Если вы пытаетесь создать модуль ядра, вам понадобятся, по крайней мере, заголовки ядра, которые настроены для ядра, в котором будет работать модуль. Они будут определять макросы размера страницы, которые вам нужны. Если у вас нет правильно настроенных заголовков, ядро ​​откажется загружать ваш модуль.

И нет ничего плохого в том, чтобы скомпилировать модуль на одной машине для запуска на другом, даже если это другая архитектура. Вам просто нужно построить против правильного источника ядра.

Ответ 5

Я боюсь, что невозможно сделать, поскольку размер страницы - это что-то определенное как часть ядра. знание размера страницы требуется в случае инструментальной цепочки, которую вы используете для компиляции модуля ядра.

Таким образом, по крайней мере с текущей архитектурой ядра, это невозможно сделать.

Ответ 6

Вы можете просто запустить тест, просто mmap файл с различными смещениями и посмотрите, сбой. Может быть, раздражает в модуле ядра, хотя, возможно, есть и другие тесты, которые вы могли бы использовать.