
É possível - a partir de um aplicativo - controlar explicitamente as confirmações de páginas de memória? Em um aplicativo do Windows, há muitos anos, escrevi um gerenciador de heap de "sistema de alarme" para me ajudar a encontrar um bug aleatório de referência/corrupção de heap. Consegui reservar uma grande área de memória virtual e, em seguida, confirmar/descomprometer páginas à vontade. A ideia na época era criar um conjunto contendo uma página não confirmada, seguida de uma ou mais páginas comprometidas (suficientes para atender a solicitação), seguida de outra página não confirmada; com um sinalizador de tempo de compilação que controlava se o ponteiro retornado ao chamador estava no início ou no final da região confirmada (para disparar instantaneamente uma exceção em uma subscrição ou substituição, respectivamente). O Windows fornece uma API para reservar regiões de memória e confirmar páginas. Tenho outro uso para esse buffer de livro em um programa Linux que estou escrevendo e estou me perguntando se o kernel fornece o mesmo tipo de funcionalidade.
Responder1
Presumo que você esteja se referindoVirtualAlloc
eamigos. Até onde eu sei, não há equivalente direto no Linux, mas você pode obter o mesmo efeito de várias maneiras. Se você quiser reservar memória, você pode usarmmap(2)
; para confirmá-lo, você precisa escrever para ele; para descomprometê-lo, você pode usarmadvise(2)
é MADV_DONTNEED
.
Para implementar páginas de proteção, você pode encontrarmprotect(2)
para ser uma opção melhor, junto com um SIGSEGV
manipulador. Você também pode observar a proteção contra overflow fornecida pelo seu compilador ( -fstack-protector
etc., e as várias -fsanitize
opções).
Responder2
Se você simplesmente deseja depurar seus próprios programas, em vez de implementar um gerenciador de memória complicado, recomendo que você simplesmente use um programa comovalgrindpara detectar vazamentos de memória e ponteiros pendentes.