Реализация модулей
Модули хранятся в файловой системе в виде объектных файлов формата ELF и компонуются с ядром программой insmod Для каждого модуля ядро выделяет область памяти, содержащую следующие данные:
- объект module;
- строку с завершающим нулевым символом, представляющую имя модуля (все модули должны иметь уникальные имена);
- код, реализующий функции модуля.
Объект module описывает модульВсе объекты module организованы в двунаправленный циклический список. Его голова находится в переменной modules, а указатели на соседние элементы СОбраНЫ В ПОЛе list КаЖДОГО Объекта module.
Поле state кодирует внутреннее состояние модуля: оно принимает значения
MODULE_STATE_LIVE (МОДУЛЬ активен), MODULE_STATE_COMING (МОДУЛЬ ИНИЦИаЛИ-
зируется) и module_state_going (модуль удаляется).
Как уже говорилось в главе 10, у каждого модуля есть собственная таблица исключений. Она содержит адреса обработчиков, входящих в состав модуля, если таковые имеются. Таблица копируется в оперативную память при подключении модуля, и ее начальный адрес хранится в поле extable объекта
module.
Счетчики обращений
У каждого модуля есть счетчики обращений, по одному на каждый процессор. Они хранятся в поле ref объекта module. Счетчик обращений увеличивается, когда начинается операция, в которой задействованы функции модуля, и уменьшается по окончании операции. Модуль может быть выгружен, только если сумма его счетчиков равна 0.
Предположим, например, что слой файловой системы MS-DOS откомпилирован в виде модуля, и этот модуль подключается на этапе выполнения. Вначале все счетчики обращений сброшены в ноль. Если пользователь монтирует дискету MS-DOS, один из счетчиков обращений увеличивается на 1. Если же пользователь размонтирует дискету, один из счетчиков (возможно, не тот, что был увеличен) уменьшается на 1. Общий счетчик обращений модуля равен сумме счетчиков по всем процессорам.
Экспортирование символов
При подключении модуля все ссылки на глобальные символы ядра (переменные и функции) в объектном коде модуля должны быть заменены на соответствующие адреса. Эта операция во многом аналогичная той, которую выполняет компоновщик при компиляции программы режима пользователя Ядро использует специальные таблицы символов ядра для хранения символов, к которым могут обращаться модули, и адресов этих символов. Они находятся в трех секциях сегмента кода ядра: секция kstrtab содержит имена
символов, секция ksymtab — адреса символов, доступных всем типам модулей, а секция ksymtab gpi — адреса символов, которыми могут пользоваться модули, выпущенные под GPL-совместимой лицензией. Макросы export symbol и export symbol gpl, вызванные в статически скомпонованном коде ядра, заставляют компилятор С заносить указанный символ в секцию ksymtab И ksymtab_gpl соответственно.
В таблицу включаются только символы, фактически используемые каким- либо активным модулем. Если системному программисту понадобится из модуля обратиться к еще не экспортированному символу ядра, он просто добавляет соответствующий макрос export symbol gpl в исходный код ядра. Конечно, он не может легально экспортировать новый символ для модуля, имеющего лицензию, не совместимую с GPL.
Подключенные модули могут экспортировать свои символы, чтобы другие модули могли обращаться к ним. Таблицы символов модуля содержатся в секциях ksymtab, ksymtab gpi и kstrtab сегмента кода модуля. Чтобы экспортировать подмножество символов из модуля, программист может воспользоваться макросами export_symbol и export_symbol_gpl, описанными ранее. При подключении модуля экспортированные символы модуля копируются в два массива в оперативной памяти, а их адреса сохраняются в полях syms И gpl_syms объекта module.
Заметка: При выборе и создании стиля свадебного дня большое внимание рекомендуется уделять абсолютно всем элементам этого торжества. Начать необходимо с выбора свадебных приглашений. Современные приглашения на свадьбу отличаются красотой и обособленной стилистикой.
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | Следующая страница