Как получить размер страницы ядра 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 и т.д.)?
- Другое?
Ответы
Ответ 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 файл с различными смещениями и посмотрите, сбой. Может быть, раздражает в модуле ядра, хотя, возможно, есть и другие тесты, которые вы могли бы использовать.