Читаем Linux API. Исчерпывающее руководство полностью

45.2. Напишите программы, подтверждающие доставку сигналов SIGBUS и SIGSEGV в обстоятельствах, описанных в подразделе 45.4.3.

45.3. Напишите программу, которая использует методику MAP_FIXED, описанную в разделе 45.10, для создания нелинейного отображения, аналогичного показанному на рис. 45.5.

<p>46. Операции с виртуальной памятью</p>

Эта глава посвящена системным вызовам, предназначенным для выполнения различных операций с виртуальным адресным пространством процесса:

• системный вызов mprotect() изменяет защиту участка виртуальной памяти;

• системные вызовы mlock() и mlockall() «запирают» участок виртуального пространства в рамках физической памяти и не дают сбросить его на диск;

• системный вызов mincore() позволяет процессу определять, находятся ли страницы виртуального пространства в физической памяти;

• системный вызов madvise() дает возможность сообщить ядру о потенциальной модели поведения процесса в контексте использования участка виртуальной памяти.

Некоторые из этих системных вызовов могут быть особенно полезны в сочетании с участками разделяемой памяти (см. главы 45 и 50), но вы можете применять их для работы с любыми сегментами виртуального адресного пространства.

Методики, описанные в данной главе, на самом деле не имеют никакого отношения к межпроцессному взаимодействию; я включил их в эту часть книги, поскольку они иногда используются вместе с разделяемой памятью.

46.1. Изменение защиты памяти: mprotect()

Системный вызов mprotect() изменяет защиту страниц виртуальной памяти в диапазоне длиной length байт, который начинается с адреса addr.

#include

int mprotect(void *addr, size_t length, int prot);

Возвращает 0 при успешном завершении или -1 при ошибке

Значение, переданное в аргументе addr, должно быть кратным размеру страницы памяти в системе (который возвращается вызовом sysconf(_SC_PAGESIZE)). Стандарт SUSv3 гласит, что аргумент addr должен быть выровнен по странице; в SUSv4 всего лишь предусмотрена такая возможность. Поскольку защита распространяется на целые страницы, значение length на практике округляется до следующего кратного размеру страницы в системе.

Аргумент prot представляет собой битовую маску, задающую новую защиту для данного участка памяти. Он должен быть равен либо PROT_NONE, либо сочетанию значений PROT_READ, PROT_WRITE и PROT_EXEC, к которым применено побитовое ИЛИ. Все эти флаги имеют то же значение, что и в вызове mmap() (табл. 45.2).

Если процесс попытается обратиться к участку памяти, нарушив заданную защиту, то ядро пошлет ему сигнал SIGSEGV.

Вызов mprotect() позволяет изменить защиту участка отображенной памяти, заданную с помощью mmap(), как показано в листинге 46.1. Эта программа создает анонимное отображение, любой доступ к которому изначально закрыт (PROT_NONE). Затем она открывает доступ для чтения и записи. Прежде чем выполнить данное изменение, программа использует вызов system(), чтобы запустить консольную команду, выводящую строчку из файла /proc/PID/maps, относящуюся к отображенному участку. Это позволит увидеть, как изменилась защита памяти (ту же информацию можно получить, вручную разобрав файл /proc/self/maps, но вызов system() позволяет сократить код программы). Запустив данное приложение, мы увидим следующее:

$ ./t_mprotect

Before mprotect()

b7cde000-b7dde000 —s 00000000 00:04 18258 /dev/zero (deleted)

After mprotect()

b7cde000-b7dde000 rw-s 00000000 00:04 18258 /dev/zero (deleted)

Последняя строка вывода говорит о том, что вызов mprotect() изменил права доступа к участку памяти на PROT_READ | PROT_WRITE.

Листинг 46.1. Изменение защиты памяти с помощью вызова mprotect()

vmem/t_mprotect.c

#define _BSD_SOURCE /* Получаем определение MAP_ANONYMOUS из */

#include

#include "tlpi_hdr.h"

#define LEN (1024 * 1024)

#define SHELL_FMT "cat /proc/%ld/maps | grep zero"

#define CMD_SIZE (sizeof(SHELL_FMT) + 20)

/* Выделяем дополнительное место для строки с целым числом */

int

main(int argc, char *argv[])

{

char cmd[CMD_SIZE];

char *addr;

/* Создаем анонимное отображение с полным отсутствием доступа */

addr = mmap(NULL, LEN, PROT_NONE, MAP_SHARED | MAP_ANONYMOUS, — 1, 0);

if (addr == MAP_FAILED)

errExit("mmap");

/* Выводим строку из /proc/self/maps, относящуюся к отображению */

printf("Before mprotect()\n");

snprintf(cmd, CMD_SIZE, SHELL_FMT, (long) getpid());

system(cmd);

/* Изменяем защиту памяти, разрешая чтение и запись */

if (mprotect(addr, LEN, PROT_READ | PROT_WRITE) == -1)

errExit("mprotect");

printf("After mprotect()\n");

system(cmd); /* Проверяем защиту, считывая файл /proc/self/maps */

exit(EXIT_SUCCESS);

}

vmem/t_mprotect.c

46.2. Блокирование памяти: mlock() и mlockall()
Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных