на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Мониторинг системных вызовов создания, обращения и удаления сегментов разделяемой памяти в ОС Linux
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



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.