В данном случае, когда модуль состоит из одного файла, 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 Segmentw <text> - write text data into Segmentr - read data from Segmentd - delete Segmentu - getUID |
Рис.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: 0Jun 2 02:34:16 terma kernel: key = 1392733089Jun 2 02:34:16 terma kernel: shmID = 2588675 Jun 2 02:34:16 terma kernel: size = 88 byteJun 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: 0Jun 2 02:34:16 terma kernel: shmID = 2588675 Jun 2 02:34:16 terma kernel: shmaddr = 40018000Jun 2 02:34:16 terma kernel: Jun 2 02:34:23 terma kernel: SHMGET is called by UID: 0Jun 2 02:34:23 terma kernel: key = 1392733089Jun 2 02:34:23 terma kernel: shmID = 2588675 Jun 2 02:34:23 terma kernel: size = 88 byteJun 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: 0Jun 2 02:34:23 terma kernel: shmID = 2588675 Jun 2 02:34:23 terma kernel: shmaddr = 40018000Jun 2 02:34:23 terma kernel: Jun 2 02:34:23 terma kernel: SHMCTL is called by UID: 0Jun 2 02:34:23 terma kernel: shmID = 2588675Jun 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 byteJun 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: 0Jun 2 02:34:26 terma kernel: key = 1392733089Jun 2 02:34:26 terma kernel: shmID = 2588675 Jun 2 02:34:26 terma kernel: size = 88 byteJun 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: 0Jun 2 02:34:26 terma kernel: shmID = 2588675 Jun 2 02:34:26 terma kernel: shmaddr = 40018000Jun 2 02:34:26 terma kernel: Jun 2 02:34:26 terma kernel: SHMCTL is called by UID: 0Jun 2 02:34:26 terma kernel: shmID = 2588675Jun 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: 0Jun 2 02:34:26 terma kernel: shmaddr: 40018000Jun 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) на основе сегментов разделяемой памяти. Реализован мониторинг системных вызовов, обращающихся к объектам SharedMemory, а именно создания, удаления сегментов разделяемой памяти и обращения к ним в ОС 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) «Современные операционные системы» , Э. Таненбаум