Ограничение диапазона виртуальных адресов процесса? - PullRequest
0 голосов
/ 28 апреля 2020

На Linux x86_64 у меня есть простое приложение, для которого я отслеживаю все обращения к памяти с помощью PIN-кода Intel. Программа использует только «немного» памяти, большая часть которой предназначена для динамически распределяемых матриц (правильное значение разделено пополам ulimit). Однако доступ к памяти охватывает весь диапазон адресного пространства виртуальной машины, низкие адреса для, как я полагаю, глобальных переменных в коде, высокие адреса для массивов malloc()ed. В середине огромная пропасть, и даже в старших адресах диапазон находится между 0x7fff4e1a37f4 и 0x7fea3af99000, что намного больше, чем я предполагаю, что мое приложение будет использовать в целом.

Постобработка, которую я необходимость в доступе к памяти очень плохо справляется с этими разреженными доступами, поэтому я ищу способ ограничить диапазон виртуальных адресов, доступный для процесса, чтобы «он просто соответствовал», и при доступе будут отображаться адреса от 0 до некоторых более разумное значение для динамически выделяемой памяти (где-то около 40 Мб, которые я обнаружил через ulimit).


В: Есть ли простой способ ограничить доступное адресное пространство (и, следовательно, неявно , доступной памяти) для отдельного процесса на Linux, в идеале из командной строки для каждого процесса?


Дополнительные примечания:

  • Я могу связать свой приложение статически.
  • Даже если я ограничу память с помощью ulimit, процесс все равно использует полный виртуальный адрес r ange (не совсем неожиданно).
  • Я знаю о / proc / $ {pid} / maps, но хотел бы избежать создания оболочек, чтобы справиться с этим, и как на самом деле использовать данные там.
  • Я слышал о prelink (что может не относиться к моему стати c бинарному, но только к библиотекам?) И могу представить, что существуют более навязчивые способы вмешательства в malloc(), но эти решения слишком далеко от моего опыта, чтобы оценить их полезность ( ограничение диапазона виртуальных адресов области кучи , { ссылка })
  • Если не существует простого решения для командной строки, вместо того, чтобы заниматься каким-либо сложным взломом, я, вероятно, просто включу его в пост-обработку и «нормализую» адреса, например, через несколько строк perl).
...