Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Программирование для Linux. Профессиональный подход - Митчелл М.

Митчелл М., Оулдем Дж., Самьюал А. Программирование для Linux. Профессиональный подход — М.: Вильямс , 2003. — 288 c.
ISBN 5-8459-0243-6
Скачать (прямая ссылка): programmirovaniedlyalinux2003.djvu
Предыдущая << 1 .. 70 71 72 73 74 75 < 76 > 77 78 79 80 81 82 .. 128 >> Следующая

предоставит в монопольное использование ее уникальную копию.
Для разблокирования области памяти следует вызвать функцию mun 1 ос к (),
передав ей те же аргументы, что и функции mlock ().
Функция mlockall () блокирует все адресное пространство программы и
принимает единственный флаговый аргумент. Флаг MCL CURRENT означает
блокирование всей выделенной на данный момент памяти, но не той, что
будет выделяться позднее. Флаг 4CL_FUTURE задает блокирование всех
страниц, выделенных после вызова функции "ilockall (). Сочетание флагов
MCL_CURRENT | MCL_FUTURE позволяет блокировать всю память программы, как
текущую, так и будущую.
Блокирование больших объемов памяти, особенно с помощью функции mlockall
(), несет потенциальную угрозу всей системе. Несправедливое распределение
оперативной памяти приведет к катастрофическому снижению
производительности системы, так как остальным процессам придется
сражаться друг с другом за небольшой "клочок" памяти, вследствие чего они
будут постоянно выгружаться на диск и загружаться обратно. Может даже
возникнуть ситуация, когда оперативная память закончится и система начнет
уничтожать процессы. По этой причине функции mlock () и mlockall ()
доступны лишь суперпользователю. Если какой-нибудь другой пользователь
попытается вызвать одну из этих функций, она вернет значение I, а в
переменную errno будет записан код EPERM.
Функция munlocka 11 О разблокирует всю память текущего процесса.
Контролировать использование памяти удобнее всего с помощью команды top.
В колонке SIZE ее выходных данных показывается размер виртуального
адресного пространства каждой программы (общий размер сегментов кода,
данных и стека с учетом выгруженных страниц). В колонке RSS приводится
объем резидентной части программы. Сумма значений в столбце RSS не может
превышать имеющийся объем ОЗУ, а су ммарный показатель по столбцу SIZE не
может быть больше 2 Гбайт (в 32-разрядных версиях Linux).
Функции семейства mlock () объявлены в файле <sys /mman. h>.
8.9. Функция mprotect(): задание прав доступа к памяти
В разделе 5.3, "Отображение файлов в памяти", рассказывалось о том, как
осуществляется отображение файла в памяти. Вспомните, что третьим
аргументом функции iranap () является битовое объединение флагов доступа:
флаги PROT_READ, PR0T__WRITE и PROT_EXEC задают права чтения, записи и
выполнения файла, а флаг PR0T_N0NE означает запрет доступа. Если
программа пытается выполнить над отображаемым файлом недопустимую
операцию, ей посылается сигнал SIGSEGV (нарушение сегментации), который
приводит к завершению программы.
^ Режим копирования при записи означает, что Linux создает для процесса
частную копию страницы только тогда, когда процесс записывает е нее
какие-тс данные.
Глава 8. Системные вызовы Linux 163
После того как файл был отображен в памяти, изменить права доступа к нему
позволяет функция mprotect (). he аргументами является адрес области
памяти, размер области и новый набор флагов Доступа. Область должна
состоять из целых страниц, т.е. начинаться и заканчиваться на границе
между страницами.
Корректное вьщеление памяти
Учтите, что память, выделяемая функцией mallocО, обычно не выравнивается
по границе страниц, даже если размер области кратен размеру страницы Если
требуется защищать память, выделяемую функцией malloc (), нужно запросить
более крупный блок, а затем найти в нем участок, выровненный по границе
страниц.
Кроме того, с помощью функции татар () можно обойти функцию malloc () и
запрашивать память непосредственно у ядра Linux.
Предположим, к примеру, что программа выделяет страниц)', отображая в
памяти файл /dev/ zero. Память инициализируется как для чтения, так и для
записи: int fd ** open ("/dev/zero", 0_RD0NLY);
char* memory - mmap (NULL, page_size, PROT_READ | PR0T_WRITE,
MAP PRIVATE, fd, Ob-
close (fd);
Далее программа запрещает запись в эту область памяти, вызывая функцию
mprotect():
mprotect (memory, page_size, PROT_READ);
Существует оригинальная методика контроля памяти: можно защитить область
памяти с помощью функций mmap () и mprotect (), а затем обрабатывать
сигнал SIGSEGV, посылаемый при попытке доступа к этой памяти. Эта
методика иллюстрируется в листинге 8.7. Листинг 8.7. (mfnvtect.c)
Обнаружение попыток доступа к памяти благодаря функции mprotect(>
•include <fcntl.h>
•include <signal-h>
•include <stdio.h>
•include <string.h>
•include <sys/mman.h>
•include <sys/stat.h>
•include <sys/types.h>
•include <unistd.h>
static int alloc_size; static char* memory;
void segv_handler (int signal_nuniber)
(
printf ("memory accessed! \.n");
mprotect (memory, alloc_size, PROT_READ | PROT_WRITE);
)
int main ()
{
int fd;
struct sigaction sa;
/* Назначение функции segv_handler() обработчиком сигнала SIGSEGV. */
memset (&sa, 0, sizeof (sa)); sa.sa_handler = &segv_handler; sigaction
(SIGSEGV, bsa, NULL);
164 Часть II. Секреты Linux
/* Выделение одной страницы путем отображения в памяти файла /dev/zero.
Предыдущая << 1 .. 70 71 72 73 74 75 < 76 > 77 78 79 80 81 82 .. 128 >> Следующая