Как узнать размер страницы процессора с помощью программы на C и malloc? - PullRequest
2 голосов
/ 17 марта 2010

возможно ли узнать размер страницы процессора с помощью программы на Си и malloc? а не с помощью вызова sysconf ()?

Ответы [ 4 ]

5 голосов
/ 17 марта 2010

Если вы можете #include некоторые заголовки ядра Linux, вы можете найти макрос PAGE_SIZE в

<asm/page.h>

На Cygwin (и, возможно, Windows 'ddk) я в

<w32api/ddk/winddk.h>

Есть "грязные трюки" (очень, очень грязные!) Для расчета размера страницы во время выполнения. Все непереносимо и полностью зависит от системы.

Давайте повеселимся!

Возможная хитрость в майских системах заключается в создании объекта с общей памятью длиной всего 1 байт. Системный вызов обычно округляет размер до размера системной страницы. Bleach!

Еще один вариант: если вы работаете в Unix-подобных системах и осмеливаетесь перехватить сигнал SIGSEGV, вы можете попытаться исследовать память путем поиска допустимых областей и определения степени округления, равной 2. Ммм ...

Итак, почему sysctl не подходит для вас?

Привет

5 голосов
/ 17 марта 2010

Стандарт C не имеет понятия «размер страницы», поэтому, основываясь на ваших тегах, нет. Может существовать метод, зависящий от реализации - есть ли у вас отвращение к использованию sysconf? Я предполагаю, что вы упомянули об этом, потому что это способ на самом деле получить необходимую информацию, в таком случае, почему бы не использовать ее?

2 голосов
/ 17 марта 2010

Маллок вряд ли скажет вам то, что вы хотите знать. Хотя он часто имеет минимальные размеры и соображения выравнивания того, что он будет выделять, они не обязательно совпадают (или связаны каким-либо образом) с размером страницы. Вы готовы искать в другом месте? В какой среде вы работаете?

1 голос
/ 17 марта 2010

(на самом деле это не ответ, но я не могу добавить его в разделе комментариев, поэтому отвечаю здесь: это всего лишь некоторые результаты моего исследования)

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

узнать размер страницы системы / микропроцессора без использования sysconf просто для удовольствия! Это то, что я пробовал до сих пор:

-получить фактический размер страницы с помощью sysconf (_SC_PAGE_SIZE): я получил на этом компьютере 0x1000, который составляет 4 КБ (его процессор Intel 386 с 32-разрядным Linux загружен в нем. Следующие мои шаги будут проверять это значение с несколькими другими пути (если я смогу найти их надежно).

- тогда я выделил 1 байт памяти

- в цикле, используя счетчик смещений, я записал за пределы 1 байта выделенную память. он работал нормально до 0x19a8, что превышает размер 1 страницы и чуть меньше 2 страниц!

-SEGV происходит где-то между размером от 1 до 2 страниц ближе к концу. Это повторяется.

- так что этот метод не может надежно найти размер страницы.

Вот почему я задал этот вопрос. Есть ли хитрость (кроме использования прямой информации, доступной в ядре), чтобы узнать размер страницы? Я даже готов пойти на компромисс с malloc (имеется ввиду использование другого трюка).

...