На Linux x86_64 у меня есть простое приложение, для которого я отслеживаю все обращения к памяти с помощью PIN-кода Intel. Программа использует только «немного» памяти, большая часть которой предназначена для динамически распределяемых матриц (правильное значение разделено пополам ulimit
). Однако доступ к памяти охватывает весь диапазон адресного пространства виртуальной машины, низкие адреса для, как я полагаю, глобальных переменных в коде, высокие адреса для массивов malloc()ed
. В середине огромная пропасть, и даже в старших адресах диапазон находится между 0x7fff4e1a37f4 и 0x7fea3af99000, что намного больше, чем я предполагаю, что мое приложение будет использовать в целом.
Постобработка, которую я необходимость в доступе к памяти очень плохо справляется с этими разреженными доступами, поэтому я ищу способ ограничить диапазон виртуальных адресов, доступный для процесса, чтобы «он просто соответствовал», и при доступе будут отображаться адреса от 0 до некоторых более разумное значение для динамически выделяемой памяти (где-то около 40 Мб, которые я обнаружил через ulimit
).
В: Есть ли простой способ ограничить доступное адресное пространство (и, следовательно, неявно , доступной памяти) для отдельного процесса на Linux, в идеале из командной строки для каждого процесса?
Дополнительные примечания:
- Я могу связать свой приложение статически.
- Даже если я ограничу память с помощью ulimit, процесс все равно использует полный виртуальный адрес r ange (не совсем неожиданно).
- Я знаю о / proc / $ {pid} / maps, но хотел бы избежать создания оболочек, чтобы справиться с этим, и как на самом деле использовать данные там.
- Я слышал о
prelink
(что может не относиться к моему стати c бинарному, но только к библиотекам?) И могу представить, что существуют более навязчивые способы вмешательства в malloc()
, но эти решения слишком далеко от моего опыта, чтобы оценить их полезность ( ограничение диапазона виртуальных адресов области кучи , { ссылка }) - Если не существует простого решения для командной строки, вместо того, чтобы заниматься каким-либо сложным взломом, я, вероятно, просто включу его в пост-обработку и «нормализую» адреса, например, через несколько строк perl).