Как получить размер страницы ядра Linux программно - PullRequest
32 голосов
/ 03 февраля 2011

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

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

Параметры, которые я просматриваю:

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

Ответы [ 7 ]

47 голосов
/ 01 октября 2012

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

getconf PAGESIZE
17 голосов
/ 07 июня 2011

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

6 голосов
/ 10 февраля 2011

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

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

5 голосов
/ 28 февраля 2018

Один из способов определить размер страницы - получить его из smaps для процесса.

Например:

cd /proc/1
grep -i pagesize smaps

KernelPageSize:        4 kB
MMUPageSize:           4 kB
5 голосов
/ 03 августа 2011

Вот что я наконец-то сделал:

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

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

0 голосов
/ 03 февраля 2014

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

0 голосов
/ 10 мая 2011

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

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

...