LINUX.ORG.RU

Аналог VirtualAlloc в Linux

 ,


0

1

Переписываю тут некий код под Линукс. Есть там такой фрагмент где выделяется (RESERVE) очень большой пул памяти через VirtualAlloc, но память в процесс не маппится (COMMIT). При доступе возникает SEH исключение, память маппится с резервом и делается EXCEPTION_CONTINUE_EXECUTION чтобы продолжить выполнение с той точки где произошел выход за границы. Еще там есть пул readonly памяти, при записи в которой сбрасываются кэши и rеadonly со страницы снимается до тех пор пока не начали формироваться новые кэши. Так получилось что опыта конкретно системного программирования у меня под онтопик нет и как сделать подобное я не представляю.

★★★

это типа костыль для выхода за границы массива? Зачем тебе это вообще нужно?

anonymous
()
Ответ на: комментарий от anonymous

судя по описанию в MSDN похоже на mmap + overcommit_memory

anonymous
()
Ответ на: комментарий от anonymous

Пямять в виртуальной машине. Куда будет конкретно будет писать эмулируемый код невозможно вывести исходя из неразрешимости задачи останова. readonly память содержит сам код. При его модификации надо выкинуть куски отjitенного кода.

Absurd ★★★
() автор топика

Это костыль в винде в связи отсутствием там оверкоммита. В линуксе не нужен.

geekless ★★
()

Делать mmap(PROT_NONE. MAP_NORESERVE) для резервирования адресного пространства и mmap(PROT_READ | PROT_WRITE, MAP_PRIVATE) для выделения собственно памяти. Правда, всё это умничание к добру не приведет - у тебя будет по объекту ядра на каждую страницу памяти.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Правда, всё это умничание к добру не приведет

А как вообще память обычно эмулируют в подобных программах? Кроме статического массива, конечно.

Absurd ★★★
() автор топика
Ответ на: комментарий от Absurd

А как вообще память обычно эмулируют в подобных программах?

Я пока не понял, что это за программа. Если это JIT-компилятор какой-нибудь VM, то я просто не вижу смысла в ручном управлении виртуальной памятью. Но по крайней мере я бы попробовал коммитить память кусками больше одной страницы.

tailgunner ★★★★★
()
Ответ на: комментарий от Absurd

А как вообще память обычно эмулируют в подобных программах? Кроме статического массива, конечно.

А почему бы не выделить статический массив? Это и будет аналогом VirtualAlloc с флагом MEM_RESERVE. А MEM_COMMIT будешь делать не ты в своем коде, а сама ОС по мере того, как к этой памяти происходит обращение.

bigbit ★★★★★
()
Ответ на: комментарий от mv

Сбрасываются кэши чего?

Отjitенные куски кода. Поскольку исполняемый код изменился, эти куски больше невалидны.

Absurd ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.