p align="left">3) Модуль Save.с, предназначенный для сохранения полученных данных и вывода их на экран. 4) Модуль Test.с, содержащий эмулятор системных вызовов для тестирования программного обеспечения. Monitor.с представляет собой загружаемый модуль ядра (LKM), написание и принцип загрузки которого были описаны выше. Помимо двух основных функций программа содержит новый обработчик системного вызова sys_ipc - функцию new_sys_ipc, которая, в зависимости от принимаемых данных вызывает функции: my_shmget; my_shmat; my_shmctl; my_shmdt; представляющие собой обработчики системных вызовов shmget(), shmat(), shmctl(), shmdt() соответственно. Также в модуле находятся функции, отображающие полученные данные в системном файле /var/log/messages: print_shmget_info(); print_shmat_info(); print_shmctl_info(); print_shmdt_info(); Модуль Test.c представляет собой программу, позволяющую пользователю · Создать сегмент разделяемой памяти · Записать в него данные · Считать данные · Узнать режим доступа сегмента · Удалить сегмент Для этого предназначены процедуры: · void writeshm(); · void readshm(); · void removeshm(); · void seeuid(); Модуль создан для тестирования программы мониторинга. Модули Start.c и Save.c предназначены для отображения данных, полученных в результате выполнения программы мониторинга обращений к сегментам разделяемой памяти, на экран и для сохранения их в файл. 3.5 Структуры данных Для каждого сегмента разделяемой памяти ядро хранит нижеследующую структуру, определённую в заголовочном файле <sys/shm.h>. Данный программный проект позволяет отследить процесс изменения содержимого полей этих структур при вызове системной функции sys_ctl. struct shmid_ds { struct ipc_perm shm_perm; int shm_segsz; time_t shm_atime; time_t shm_dtime; time_t shm_ctime; unsigned short shm_cpid; unsigned short shm_lpid; short shm_nattch; }; Значения полей структуры: shm_perm - права на выполнение операции (структура определена в файле <sys/ipc.h>) shm_segsz - реальный размер сегмента (в байтах) shm_atime - время последнего подключения shm_dtime - время последнего отключения shm_ctime - время последнего изменения shm_cpid - идентификатор процесса создателя shm_lpid - идентификатор процесса подключавшегося последним shm_nattch - количество текущих подключений сегмента struct ipc_perm { key_t key; ushort uid; ushort gid; ushort cuid; ushort cgid; ushort mode; ushort seq; }; Со значением полей key - уникальный ключ IPC uid - идентификатор пользователя владельца gid - идентификатор группы владельца cuid - идентификатор пользователя создателя cgid - идентификатор владельца создателя mode - разрешения чтения/записи seq - последовательный номер канала Сохраняемая отдельно вместе с ключом IPC-объекта информация содержит данные о владельце и создателе этого объекта (они могут различаться) и режимы восьмеричного доступа. Модуль Monitor.c содержит следующие структуры данных для хранения информации о сегменте разделяемой памяти, полученной в результате выполнения программы struct shmget_info { int cur_uid; int key; int shm_id; int size; int flag; }; struct shmat_info { int cur_uid; int shm_id; unsigned long address; }; struct shmctl_info { int cur_uid; int shm_id; int cmd; struct shmid_ds *main; int result; }; struct shmdt_info { int cur_uid; char *address; int result; }; key - уникальный ключ для определения сегмента shm_id - идентификатор сегмента size - запрашиваемый размер сегмента flag - флаг, определяющий, с какой целью был совершён системный вызов sys_get: · процесс создаёт новый сегмент разделяемой памяти (flag = 0) · процесс обращается к уже созданному сегменту разделяемой памяти (flag !=0) address - адрес начала сегмента в адресном пространстве пользователя cmd - номер команды, указывающей на то, для каких действий был произведён системный вызов sys_ctl: · получить значения полей структуры shmid_ds (IPC_STAT) · изменить значения полей в структуре shmid_ds (IPC_SET) · удалить сегмент (IPC_RMID) main - полученная копия структуры shmid_ds result - результат выполнения системного вызова (success или failed) 3.6 Реализация мониторинга создания, управления и удаления сегментов разделяемой памяти Как уже было отмечено, отследить обращения к сегментам разделяемой памяти можно, перехватив системный вызов sys_ipc, который помимо прочих аргумантов принимает параметр call, определяющий какую из системных функций sys_get, sys_shmat, sys_ctl, sys_dt следует вызвать. Для перехвата выхова sys_ipc, надо сделать следующее: · В функции init_module() сохранить указатель на оригинальный (исходный) вызов - orig_sys_ipc - и в таблице системных вызовов sys_call_table настроить соответствующий указатель на новый системный вызов. · Создать функцию, реализующую новый системный вызов - new_sys_ipc. · В функции cleanup_module() восстанавить оригинальный системный вызов, используя ранее сохраненный указатель. В созданном обработчике системного вызова, в зависимости от аргумента call, вызывать функции обработки вызовов sys_get, sys_shmat, sys_ctl, sys_dt, которые сохраняют полученные данные в соответствующие структуры данных, затем отображаются в ядро и выводятся в системном файле /var/log/messages. Компиляция созданного модуля ядра осуществляется с помощью команды # make Несмотря на все свои достоинства, утилита make ничего не знает о проекте, поэтому необходимо создать простой текстовый файл, который будет содержать все необходимые инструкции по сборке. Файл с инструкциями по сборке проекта называется Makefile. В данном случае, когда модуль состоит из одного файла, Makefile имеет вид, представленный на рис.3 |
obj-m += monitor.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD)modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean | | |
Рис.3. Makefile Загрузка модуля в ядро осуществляется командой insmod ./<имя модуля>.ko Выгрузка - командой rmmod <имя модуля> Проверить, загружен ли модуль в ядро, можно командой # lsmod, которая выдаёт список всех загруженных модулей. lsmod в свою очередь обращается за необходимыми сведениями к файлу /proc/modules. 3.7 Пользовательский интерфейс Пользовательский интерфейс является полностью консольным. Во-первых, потому что при минимуме входных данных нецелесообразно создавать графическое приложение. Во-вторых, концепция ОС Linux предполагает широкое использование возможностей командной строки Shell. Для того чтобы запустить программу, необходимо выполнить следующую последовательность действий: · Запустить приложение start.o · Загрузить модуль ядра · Запустить тестовую программу (или любое приложение ОС) · Выгрузить модуль ядра · Запустить приложение save.o Тестирующее приложение предоставляет пользователю меню, позволяющее производить выбор действий над сегментом разделяемой памяти (рис.4). |
Actions with Shared Memory Segment w <text> - write text data into Segment r - read data from Segment d - delete Segment u - get UID | | |
Рис.4. Меню тестирующей программы Результат отображается на экране и сохраняется в файле. Структура файла отображена на рис.5 |
Jun 2 02:33:53 terma kernel: Jun 2 02:33:53 terma kernel: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Jun 2 02:33:53 terma kernel: Monitoring of Shared Memory Segments. Jun 2 02:33:53 terma kernel: Jun 2 02:34:16 terma kernel: SHMGET is called by UID: 0 Jun 2 02:34:16 terma kernel: key = 1392733089 Jun 2 02:34:16 terma kernel: shmID = 2588675 Jun 2 02:34:16 terma kernel: size = 88 byte Jun 2 02:34:16 terma kernel: flag = 1968 Jun 2 02:34:16 terma kernel: [creating of new segment] Jun 2 02:34:16 terma kernel: Jun 2 02:34:16 terma kernel: SHMAT is called by UID: 0 Jun 2 02:34:16 terma kernel: shmID = 2588675 Jun 2 02:34:16 terma kernel: shmaddr = 40018000 Jun 2 02:34:16 terma kernel: Jun 2 02:34:23 terma kernel: SHMGET is called by UID: 0 Jun 2 02:34:23 terma kernel: key = 1392733089 Jun 2 02:34:23 terma kernel: shmID = 2588675 Jun 2 02:34:23 terma kernel: size = 88 byte Jun 2 02:34:23 terma kernel: flag = 0 Jun 2 02:34:23 terma kernel: [using segment as client] Jun 2 02:34:23 terma kernel: Jun 2 02:34:23 terma kernel: SHMAT is called by UID: 0 Jun 2 02:34:23 terma kernel: shmID = 2588675 Jun 2 02:34:23 terma kernel: shmaddr = 40018000 Jun 2 02:34:23 terma kernel: Jun 2 02:34:23 terma kernel: SHMCTL is called by UID: 0 Jun 2 02:34:23 terma kernel: shmID = 2588675 Jun 2 02:34:23 terma kernel: cmd = IPC_STAT (2) Jun 2 02:34:23 terma kernel: [getting current information about segment] Jun 2 02:34:23 terma kernel: size of segment = 88 byte Jun 2 02:34:23 terma kernel: key = 1392733089 Jun 2 02:34:23 terma kernel: uid = 0 Jun 2 02:34:23 terma kernel: gid = 0 Jun 2 02:34:23 terma kernel: cuid = 0 Jun 2 02:34:23 terma kernel: cgid = 0 Jun 2 02:34:23 terma kernel: mode = 0 Jun 2 02:34:23 terma kernel: [successfully] Jun 2 02:34:23 terma kernel: Jun 2 02:34:26 terma kernel: SHMGET is called by UID: 0 Jun 2 02:34:26 terma kernel: key = 1392733089 Jun 2 02:34:26 terma kernel: shmID = 2588675 Jun 2 02:34:26 terma kernel: size = 88 byte Jun 2 02:34:26 terma kernel: flag = 0 Jun 2 02:34:26 terma kernel: [using segment as client] Jun 2 02:34:26 terma kernel: Jun 2 02:34:26 terma kernel: SHMAT is called by UID: 0 Jun 2 02:34:26 terma kernel: shmID = 2588675 Jun 2 02:34:26 terma kernel: shmaddr = 40018000 Jun 2 02:34:26 terma kernel: Jun 2 02:34:26 terma kernel: SHMCTL is called by UID: 0 Jun 2 02:34:26 terma kernel: shmID = 2588675 Jun 2 02:34:26 terma kernel: cmd = IPC_RMID (0) Jun 2 02:34:26 terma kernel: [segment marked for deletion] Jun 2 02:34:26 terma kernel: [successfully] Jun 2 02:34:26 terma kernel: Jun 2 02:34:26 terma kernel: SHMDT is called by UID: 0 Jun 2 02:34:26 terma kernel: shmaddr: 40018000 Jun 2 02:34:26 terma kernel: [segment was deleted successfully] Jun 2 02:34:26 terma kernel: Jun 2 02:34:55 terma kernel: Jun 2 02:34:55 terma kernel: The end. Jun 2 02:34:55 terma kernel: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | |
Рис.5 Файл Result Заключение В результате выполнения данной курсовой работы был изучен механизм межпроцессного взаимодействия (IPC) на основе сегментов разделяемой памяти. Реализован мониторинг системных вызовов, обращающихся к объектам Shared Memory, а именно создания, удаления сегментов разделяемой памяти и обращения к ним в ОС Linux. В результате чего были получены данные о сегментах разделяемой памяти, такие как идентификаторы пользователя и группы владельца, запрашиваемый и реальный размеры сегмента, адрес привязки сегмента в адресном пространстве пользователя и другие. Список используемой литературы 1) «Linux Programmer's Guide», Sven Goldt, Sven van der Meer, Skott Burkett, Matt Welsh 2) «The Linux Kernel Module Programming Guide», А Peter Jay Salzman, Michael Burian, Ori Pomerantz 3) «Перехват системных вызовов», статья из журнала «Системный администратор», В. Мешков 4) «Современные операционные системы» , Э. Таненбаум 5) «Механизмы межпроцессных взаимодействий в операционной системе Unix» Сергей Кузнецов6) «Unix. Взаимодействие процессов» Уильям Стивенс
Страницы: 1, 2, 3
|