Книга: Программирование для Linux. Профессиональный подход

Корректное выделение памяти

Корректное выделение памяти

Учтите, что память, выделяемая функцией malloc(), обычно не выравнивается по границе страниц, даже если размер области кратен размеру страницы. Если требуется защищать память, выделяемую функцией malloc(), нужно запросить более крупный блок, а затем найти в нем участок, выровненный по границе страниц.

Кроме того, с помощью функции mmap() можно обойти функцию malloc() и запрашивать память непосредственно у ядра Linux.

Предположим, к примеру, что программа выделяет страницу, отображая в памяти файл /dev/zero. Память инициализируется как для чтения, так и для записи:

int fd = open("/dev/zero", O_RDONLY);
char* memory =
 mmap(NULL, page_size, PROT_READ | PROT_WRITE,
  MAP_PRIVATE, fd, 0);
close(fd);

Далее программа запрещает запись в эту область памяти, вызывая функцию mprotect():

mprotect(memory, page_size, PROT_READ);

Существует оригинальная методика контроля памяти: можно защитить область памяти с помощью функций mmap() и mprotect(), а затем обрабатывать сигнал SIGSEGV, посылаемый при попытке доступа к этой памяти. Эта методика иллюстрируется в листинге 8.7.

Оглавление книги


Генерация: 1.810. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз