
Возможно ли — из приложения — явно контролировать фиксации страниц памяти? В приложении Windows много лет назад я написал менеджер кучи «системы сигнализации», чтобы помочь мне найти случайную зависшую ошибку ссылки/повреждения кучи. Я мог зарезервировать большую область виртуальной памяти, а затем фиксировать/декоммитировать страницы по своему желанию. Идея в то время заключалась в том, чтобы создать набор, содержащий незафиксированную страницу, за которой следовали одна или несколько зафиксированных страниц (достаточных для выполнения запроса), за которыми следовала еще одна незафиксированная страница; с флагом времени компиляции, который контролировал, был ли указатель, возвращаемый вызывающей стороне, в начале или конце зафиксированной области (чтобы мгновенно срабатывать исключение при подписке или перезаписи соответственно). Windows предоставляет API для резервирования областей памяти и фиксации страниц. У меня есть еще одно применение для такого буфера с окончанием книги в программе Linux, которую я пишу, и мне интересно, предоставляет ли ядро такую же функциональность.
решение1
Я так понимаю, вы имеете в видуVirtualAlloc
идрузья. Насколько мне известно, в Linux нет прямого эквивалента, но вы можете добиться того же эффекта разными способами. Если вы хотите зарезервировать память, вы можете использоватьmmap(2)
; чтобы зафиксировать его, вам нужно записать в него; чтобы отменить его, вы можете использоватьmadvise(2)
's MADV_DONTNEED
.
Для реализации страниц защиты вы можете найтиmprotect(2)
чтобы быть лучшим вариантом, вместе с SIGSEGV
обработчиком. Вы также можете посмотреть на защиту от переполнения, предоставляемую вашим компилятором ( -fstack-protector
и т. д., и различные -fsanitize
опции).
решение2
Если вы просто хотите отлаживать свои собственные программы, а не реализовывать сложный менеджер памяти, я рекомендую вам просто использовать такую программу, каквалгринддля обнаружения утечек памяти и висячих указателей.