Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Оглавление

1. Перечислите и охарактеризуйте средства аппаратной поддержки функций ОС. 2

2. Механизм виртуальной памяти и его реализация в процессорах фирмы Интел. 3

3. Реализация механизма системного вызова в ОС. Таблица системных вызовов и методы ее модификации в ОС LINUX. 5

4. Понятие процесса и потока: раскройте и охарактеризуйте. 6

5. Многослойная структура ядра: принципы построения современных ОС. 7

6. Перечислите и охарактеризуйте основные подсистемы ядра ОС LINUX. 9

7. Перечислите и охарактеризуйте основные классы устройств и модулей ядра ОС LINUX. 10

8. Программная структура модулей ядра. Загрузка и выгрузка модулей. Функции init_module и cleanup_module. 12

9. Реализация пользовательского режима и режима ядра в системе LINUX. 13

10. Сравните модуль ядра и модуль приложения пользовательского режима: что общего и в чем разница 15

11. Опишите процесс динамической компоновки модулей ядра с действующим ядром. Утилиты insmod, modprobe и rmmod. 16

12. Охарактеризуйте механизм проверки версии модулей ядра. 17

13. Подсчет ссылок на модули ядра. Использование макросов MOD_INC_USE_COUNT, MOD_DEC_USE_COUNT и MOD_IN_USE. 18

14. Драйверы символьных устройств. Старший (major) и младший (minor) номера устройств. 19

15. Динамическое выделение старших номеров устройств. 20

16. Регистрация драйвера символьного устройства и удаление драйвера из системы. 21

17. Перечислите основные виды файлов в ОС LINUX и охарактеризуйте их. 22

18. Структура file_operations: основные члены и назначение. Использование расширенного синтаксиса для ее инициализации. 23

НЕ нашли? Не то? Что вы ищете?

19. Структура file: члены и назначение. 25

20. Методы open и release структуры file_operations. 26

21. Методы read и write структуры file_operations. 27

22. Работа с пользовательским адресным пространством. Функции copy_to_user, copy_from_user, access_ok, get_user, put_user и др. 28

23. Функции ввода-вывода пользовательского режима и их связь с обработчиками драйвера устройства. 29

24. Состояние гонки в режиме ядра. Использование семафоров в режиме ядра. 30

25. Функция управления ioctl: ее описание в структуре file_operations и прототип в режиме ядра. 32

26. Генерирование номера команды функции ioctl. Макросы _IOW, _IO, _IOR. 33

27. Операции блокируемого ввода-вывода. Использование очередей. 34

28. Реализация разграничения доступа на уровне драйвера устройства. 36

29. Отладка модулей ядра с помощью функции printk. Управление кольцевым буфером сообщений ядра. 37

30. Выделение и освобождение памяти в режиме ядра. Особенности и отличие от пользовательского режима. 38

31. Файловая система /proc. Создание файлов для чтения и файлов чтения/записи. 39

32. Таймеры ядра. Инициализация таймера, его использование и удаление. 42

33. Использование средств tasklet. Особенности и отличие от таймеров ядра. 44

34. Механизм очередей Workqueue. 46

35. Обработка прерываний. Установка и удаление обработчика прерываний. 47

36. Назначение линии IRQ обработчику прерывания. 48

37. Механизм обработки прерываний в ОС LINUX. 49

38. Верхняя и нижняя половины обработчика прерываний. 50

ВОПРОСЫ К ЭКЗАМЕНУ ПО КУРСУ “СИСТЕМНОЕ ПРОГРАММИРОВАНИЕ”

1. Перечислите и охарактеризуйте средства аппаратной поддержки функций ОС.

Основные средства для аппаратной поддержки:

1)  система прерываний,

выставляется как некоторый уровень сигнала после того, как появился определенный уровень; различные действия в ОС связаны с обработкой различных прерываний

2)  управление привилегиями,

существуют функции, позволяющие разделить привилегии,- ядру предоставляется больше возможностей, пользовательским процессам - меньше; ядро может управлять набором привилегий, предоставленных отдельному процессу, - т. е. с помощью функций аппаратной поддержки ядро управляет пользовательским процессом

3)  системный таймер,

таймер устанавливает (генерирует) прерывания через заданный интервал; используется для планирования процессов

4)  переключение процессов,

средства переключения процессов: многозадачность за счет того, что на определенный квант времени процессор «уходит в тень», но при переключении процессов надо сохранять много информации, которая представляется на аппаратном уровне

5)  переключение страниц памяти,

каждый процесс предстает в своем 4-х байтном пространстве: процессор и ОС реализуют общение с виртуальной памятью

6)  ограничение доступа к памяти

реализован совместно со средством переключения страниц; определяет права доступа к страницам

*) защита памяти, механизм преобразования адресов в системах виртуальной памяти, управление каналами и периферийными устройствами.

2. Механизм виртуальной памяти и его реализация в процессорах фирмы Интел.

Существуют различные механизмы, позволяющие распределить адресное пространство-управление памятью:

- с внешней памятью

механизмы использования: страничная память / сегментная память / странично-сегментная память

- без внешней памяти

механизмы использования:

с фиксированными разделами (размер, выделяемый в физ. MEM задается при запуске ОС),

с динамическими разделами (первоначально память не разделена),

с перемещаемыми разделами (overlay / swapping / виртуальная память)

Виртуальным называется ресурс, который пользователю или пользовательской программе представляется обладающим свойствами, которыми он в действительности не обладает. Таким образом, виртуальная память - это совокупность программно-аппаратных средств, позволяющих пользователям писать программы, размер которых превосходит имеющуюся оперативную память; для этого виртуальная память решает следующие задачи, которые выполняются автоматически:

·  размещает данные в запоминающих устройствах разного типа, например, часть программы в оперативной памяти, а часть на диске;

·  перемещает по мере необходимости данные между запоминающими устройствами разного типа, например, подгружает нужную часть программы с диска в оперативную память;

·  преобразует виртуальные адреса в физические.

Наиболее распространенными реализациями виртуальной памяти является страничное, сегментное и странично-сегментное распределение памяти, а также свопинг.

Страничное распределение

Виртуальное адресное пространство каждого процесса делится механически на равные части, - виртуальные страницы. Вся оперативная память машины делится на части такого же размера, - физические страницы. При загрузке процесса часть его виртуальных страниц помещается в оперативную память, а остальные - на диск. При загрузке ОС создает для каждого процесса информационную структуру - таблицу страниц, в которой устанавливается соответствие между номерами виртуальных и физических страниц для страниц, загруженных в оперативную память, или делается отметка, что виртуальная страница выгружена на диск. Кроме того, в таблице страниц содержится управляющая информация. При каждом обращении к памяти происходит чтение из таблицы страниц информации о виртуальной странице, к которой произошло обращение. Если данная виртуальная страница находится в оперативной памяти, то выполняется преобразование виртуального адреса в физический. Если же нужная виртуальная страница в данный момент выгружена на диск, то происходит так называемое страничное прерывание. Выполняющийся процесс переводится в состояние ожидания, и активизируется другой процесс из очереди готовых. Параллельно программа обработки страничного прерывания находит на диске требуемую виртуальную страницу и пытается загрузить ее в оперативную память. Если в памяти имеется свободная физическая страница, то загрузка выполняется немедленно, если же свободных страниц нет, то решается вопрос, какую страницу следует выгрузить из оперативной памяти.

Сегментное распределение

Виртуальное адресное пространство процесса делится на сегменты, размер которых определяется программистом с учетом смыслового значения содержащейся в них информации. Отдельный сегмент может представлять собой подпрограмму, массив данных и т. п. Иногда сегментация программы выполняется по умолчанию компилятором. При загрузке процесса часть сегментов помещается в оперативную память (при этом для каждого из этих сегментов операционная система подыскивает подходящий участок свободной памяти), а часть сегментов размещается в дисковой памяти. Сегменты одной программы могут занимать в оперативной памяти несмежные участки. Во время загрузки система создает таблицу сегментов процесса, в которой для каждого сегмента указывается начальный физический адрес сегмента в оперативной памяти, размер сегмента, правила доступа и другая информация. Если виртуальные адресные пространства нескольких процессов включают один и тот же сегмент, то в таблицах сегментов этих процессов делаются ссылки на один и тот же участок оперативной памяти, в который данный сегмент загружается в единственном экземпляре.

Странично-сегментное распределение

Виртуальное пространство процесса делится на сегменты, а каждый сегмент в свою очередь делится на виртуальные страницы, которые нумеруются в пределах сегмента. Оперативная память делится на физические страницы. Загрузка процесса выполняется операционной системой постранично, при этом часть страниц размещается в оперативной памяти, а часть на диске. Для каждого сегмента создается своя таблица страниц, структура которой полностью совпадает со структурой таблицы страниц, используемой при страничном распределении. Для каждого процесса создается таблица сегментов, в которой указываются адреса таблиц страниц для всех сегментов данного процесса. Адрес таблицы сегментов загружается в специальный регистр процессора, когда активизируется соответствующий процесс.

Свопинг

Процесс перемещается между памятью и диском целиком, то есть в течение некоторого времени процесс может полностью отсутствовать в оперативной памяти. Существуют различные алгоритмы выбора процессов на загрузку и выгрузку, а также различные способы выделения оперативной и дисковой памяти загружаемому процессу.

3. Реализация механизма системного вызова в ОС. Таблица системных вызовов и методы ее модификации в ОС LINUX.

ОС 2х типов: - с централизованными системными вызовами

- с распределенными системными вызовами

Системные вызовы - это набор функций, реализованных в ядре ОС. Любой запрос приложения пользователя в конечном итоге трансформируется в системный вызов, который выполняет запрашиваемое действие.

Рассмотрим ОС с централиз. сист. вызовами: используется один вектор, к-рый инициирует сист. вызовы (синхр/асинхр)

Механизм организации системных вызовов:

1)  в регистр ядра записывается номер системного вызова (цифра пишется в стек)

2)  вызывается функция INTH

3)  передача управления в обработчик системных вызовов

4)  обработчик syscall проверяет, корректен ли системный вызов (сохраняет контекст текущей работы usera; обращается к таблице syscall, в которой прописаны адреса функций, обрабатывающих системные вызовы)

5)  вызывается процедура и результат отправляется user`y

void** sys_call_table;

int mkdir(const char* path)

{return 0;}

int (*orig_mkdir)(const char*);

int init_module (void){

sys_call_table=(void**)0xc0331f0;

printk("Hella!\n");

orig_mkdir=sys_call_table[SYS_mkdir];

sys_call_table[SYS_mkdir]=(void*)mkdir;

return 0;

};

sys_read

Используется для чтения из файлов

sys_write

Используется для записи в файлы

sys_open

Используется для создания или открытия файлов

sys_chdir

Используется для изменения текущей директории

sys_ioctl

Используется для работы с устройствами

sys_kill

Используется для отправки сигналов процессам

4. Понятие процесса и потока: раскройте и охарактеризуйте.

Процесс – адресное пространство (~рассматривается операционной системой как заявка на потребление всех видов ресурсов, кроме одного-проц. вр.) - выполняемое приложение, обладающее собственной памятью, описателями файлов и другими системными ресурсами. С каждым процессом связано свое адресное пространство. Любой процесс, обращаясь при доступе к ядру, приобретает привилегии ядра, переходит в режим ядра; а после выполнения процесса переходит обратно в пользовательский процесс.

Поток – последовательность команд (~ последовательность/список команд, которые должен выполнять процессор) - код, исполняемый внутри процесса. Процессорное время распределяется операционной системой между потоками.

Внутри процесса существует хотя бы один поток. Процесс может иметь как один поток, так и множество параллельно выполняющихся потоков. Все потоки одного и того же процесса используют одни и те же ресурсы.

Все пространство кода и данных процесса доступно всем его потокам. Несколько потоков могут обращаться к одним и тем же глобальным переменным или функциям.

Потоками управляет операционная система, и у каждого потока есть свой собственный стек.

5. Многослойная структура ядра: принципы построения современных ОС.

ОС включает:

·  модули самой ОС

·  исходные коды

·  файлы документации

·  дополнительные программные модули

В общем случае: ядро ОС (основная часть) + вспомогательные модули (дополнительные модули ОС)

Ядро: управление виртуальной памятью

Модули ОС: управление функциональными компонентами ОС, архивация и обработка данных

Безопасность ОС реализуется за счет привилегированности процессов.

Любой процесс при доступе обращаясь к ядру, приобретает привилегии ядра, переходит в режим ядра; а после выполнения процесса переходит обратно в пользовательский процесс.

В операционной системе Unix одновременно работает множество процессов, выполняющих самые разнообразные задачи. Каждый процесс запрашивает у системы различные ресурсы, - принимает и обрабатывает все эти запросы -- ядро, которое является одним большим испоняемым файлом.

Ядро операционной системы должно управлять всеми устройствами и программами в системе, распределяя аппаратные ресурсы и запуская программы по мере надобности.

За управление памятью, управление программным обеспечением, управление устройствами системы и за управление файловой системой отвечает главным образом ядро.

Наиболее часто используется «послойная система» ядра, элементы типовой модели:

·  аппаратная поддержка ОС со стороны микропроцессора

·  аппаратно-зависимый слой (Hardware Associated Layer) // повторяет «железо»

·  базовые механизмы ОС // пытается оторваться от «железа»

·  менеджеры ресурсов

(менеджер процессов, менеджер вв/выв, менеджер вирт. памяти = выгр/загр. страниц)

·  слой API (слой системных вызовов) //через этот слой происходит переключение режимов

Принципы построения ОС:

1)  должна быть написана на языке высокого уровня

2)  элементы в «железе» необходимо заменить «абстрактными»

3)  необходимо минимизировать число модулей, работающих непосредственно с «железом»

6. Перечислите и охарактеризуйте основные подсистемы ядра ОС LINUX.

Рисунок 1-1. Структурная схема ядра.

Управление процессами

Одной из функций ядра является управление созданием и уничтожением процессов, обеспечение взаимодействия процессов с внешним миром (ввод/вывод) и обеспечение взаимодействия процессов между собой (сигналы, каналы - pipes, и IPC-примитивы (interprocess communication)). Также, в функции управления процессами, входит диспетчеризация процессов, которая управляет разделением времени процессора между процессами.

Управление памятью

Память компьютера представляет собой очень важный ресурс компьютера, и реализация политики его разделения существенно влияет на производительность операционной системы. Ядро предоставляет огромные виртуальные пространства памяти некоторым или всем процессам на фоне ограниченных физических ресурсов. Различные части ядра взаимодействуют с подсистемой управления памятью через определенный набор функций, например malloc()/free().

Файловые системы

Unix жестко связан с концепцией файловых систем: почти все в Unix может быть представлено как файл. Ядро выстраивает структурированную файловую систему из неструктурированного аппаратного слоя, и результирующая файловая абстракция жестко вплетена во все компоненты системы. В дополнении к этому, Linux поддерживает множество типов файловых систем, которые различным способом организуют данные на физических носителях информации. Для примера, дискета может быть отформатирована либо в Linux стандарте, файловой системе ext2, либо, в распространенных на Windows платформе, форматах FATx.

Управление устройствами

Практически каждая системная операция, в конечном счете, отображается на физическое устройство. За исключением процессора, памяти и некоторых других элементов, все остальные операции управления устройствами выполняются кодом, специфичным для адресуемого устройства. Этот код называется драйвером устройства. Ядро должно включать в себя драйвер каждого устройства, управляемого системой, начиная от жесткого диска и заканчивая клавиатурой и мышью.

Сетевые службы

Сетевой транспорт должен быть реализован в ядре операционной системы, т. к. большинство сетевых операций не специфичны для процессов – поступление пакетов является асинхронным событием. Пакеты должны быть собраны, идентифицированы и диспетчеризованы перед тем, как будут переданы на дальнейшую обработку в пользовательские процессы. Система должна управлять передачей пакетов данных между программами через сетевые интерфейсы. Маршрутизация и система распознавания различных классов сетевых адресов также должны быть реализованы в ядре операционной системы.

Одной из замечательных характеристик ядра Linux является способность расширять функциональность ядра во время его работы. Это означает, что можно добавить требуемые функции в ядро без перезагрузки операционной системы.

7. Перечислите и охарактеризуйте основные классы устройств и модулей ядра ОС LINUX.

В Unix устройства подразделяются на три класса (типа). Каждый модуль реализует поддержку одного из этих классов устройств, и, таким образом, подразделяется на модули символьных, блочных и сетевых устройств. Такое разделение модулей на различные классы не является жестким. Программист может создать большой модуль, реализующий различные драйверы в одном куске кода. Однако более верным стилем программирования является создание различных модулей для каждой новой функциональности, которую они добавляют, т. к. декомпозиция является ключевым элементом масштабируемости и расширяемости.

Символьные устройства (character devices)

- устройство, которое может быть представлено потоком байт (как файл). Такие драйвера реализуют, по меньшей мере, системные вызовы open(), close(), read() и write(). Текстовая консоль (/dev/console) и последовательные порты (/dev/ttyS0 и аналогичные) представляют собой примеры символьных устройств. Доступ к символьным устройствам реализуется через специальные файлы, называемые интерфейсами устройств, которые обычно располагаются в каталоге /dev. Отличие между символьным устройством и файлом, заключается в том, что открыв обычный файл, вы можете перемещаться по нему как вперед, так и назад, в то время как символьное устройство представляет собой последовательный канал данных. Однако, существуют символьные устройства, которые представляются как область данных, и вы также можете перемещаться по ней как вперед, так и назад, используя функции lseek() и mmap().

Блочные устройства (block devices)

Доступ к блочным устройствам, так же как и к символьным, осуществляется через специальные файлы-интерфейсы устройств, расположенные, обычно, в каталоге /dev. На блочных устройствах, как правило, размещаются файловые системы. В большинстве Unix систем, блочные устройства могут быть представлены только как множество блоков. Размер блока кратен степени двух и часто равен одному килобайту данных. Linux позволяет приложениям читать и писать в блочные устройства, также как и в символьные. Разница заключается в том, что при обращении к блочному устройству передается блок данных, а не один байт (символ). Для пользователя, блочные и символьные устройства неразличимы. Драйвер блочного устройства взаимодействует с ядром через более широкий блочно-ориентированный интерфейс, но это скрыто от пользователя и приложений, которые взаимодействуют с устройством через файл интерфейса устройства, расположенного, как правило, в каталоге /dev. Интерфейсы блочных устройств наиболее удобны для монтирования файловых систем.

Сетевые интерфейсы (network interfaces)

Сетевой интерфейс м. б. реализован на основе аппаратного устройства(обычно) или чисто программно (интерфейс loopback). На сетевой интерфейс, который управляется сетевой подсистемой ядра, наложены функции приема и передачи пакетов данных. Разные сетевые службы, например telnet или FTP, ведут передачу данных через одно и тоже сетевое устройство, которое не знает об индивидуальных потоках, и только передает пакеты данных. При этом и telnet и FTP являются потоко-ориентированными системами, в то время как сетевой интерфейс не принадлежит к потоко-ориентированным устройствам, а работает с дискретными данными - пакетами. Вместо чтения и записи, ядро вызывает функции, относящиеся к передаче пакетов.

Основное различие блочных и символьных устройств состоит в том, что обмен данными с блочным устройством производится порциями байт — блоками. Они имеют внутренний буфер, благодаря чему повышается скорость обмена. В большинстве Unix-систем размер одного блока равен 1 килобайту или другому числу, являющемуся степенью числа 2. Символьные же устройства — это лишь каналы передачи информации, по которым данные следуют последовательно, байт за байтом. Большинство устройств относятся к классу символьных, поскольку они не ограничены размером блока и не нуждаются в буферизации. Если первый символ в списке, полученном командой ls-l /dev, 'b', тогда это блочное устройство, если 'c', тогда — символьное.

В ОС Linux представлены и другие классы модулей. Модули каждого класса предоставляют интерфейс для предоставления определенного типа устройств. Поэтому, можно говорить о модулях шины USB, последовательного порта и т. д.

К наиболее общему, нестандартному классу устройств относятся устройства SCSI. (Small Computer System Interface, и представляет собой учрежденный стандарт на рынке рабочих станций и high-end серверов). И хотя любое устройство подсоединенное к шине SCSI представляется файлом интерфейсом в каталоге /dev как символьное или блочное устройство, внутренняя организация таких драйверов различна.

8. Программная структура модулей ядра. Загрузка и выгрузка модулей. Функции init_module и cleanup_module.

Основное назначение модулей - расширение функциональности ядра. Код модуля исполняется в пространстве ядра. Обычно модуль реализует две задачи - одни функции выполняются как часть системных вызовов, другие - выполняют обработку прерываний.

Модуль регистрирует себя самого в ядре, подготавливая его для обслуживания возможных запросов, и его функция "main" завершает свою работу сразу же после вызова.

Добавить функцию:

Отключить функцию:

1)  необходимо прописать в файле name. c

init_module

2)  gcc = name. o

3)  insmod (insert module) name

1)  необходимо прописать в файле name. c cleanup_module

2)  gcc = name. o

3)  insmod (insert module) name

4)  …..

5)  remmod (remove module) name

Любой модуль ядра должен иметь по меньшей мере хотя бы две функции: функцию инициализации модуля — init_module(), которую вызывает insmod во время загрузки модуля, и функцию завершения работы модуля — cleanup_module(), которую вызывает rmmod.

Обычно функция init_module(точка входа) выполняет регистрацию обработчика какого-либо события или замещает какую-либо функцию в ядре своим кодом (который, как правило, выполнив некие специфические действия, вызывает оригинальную версию функции в ядре).

Функция cleanup_module(вторая точка входа) является полной противоположностью, она производит "откат" изменений, сделаных функцией init_module(), что делает выгрузку модуля безопасной.

На рисунке показана схема вызова функций и как используются указатели на функции в модуле при добавлении его в ядро.

Поскольку модуль не связывается ни с одной из стандартных библиотек, исходные тексты модуля не должны подключать обычные заголовочные файлы. В модулях ядра могут использоваться только те функции, которые экспортируются ядром.

Все заголовочные файлы, которые относятся к ядру, расположены в каталогах include/linux и include/asm, внутри дерева каталогов с исходными текстами ядра (как правило это каталог /usr/src/linux).

9. Реализация пользовательского режима и режима ядра в системе LINUX.

Модуль выполняется в так называемом пространстве ядра (режим ядра), тогда как приложения работают в пространстве пользовательского процесса (пользовательский режим).

Пользовательский режим - наименее привилегированный режим, поддерживаемый LINUX; он не имеет прямого доступа к оборудованию и у него ограниченный доступ к памяти. В режиме "пользователь" запрещено выполнение действий, связанных с управлением ресурсами системы, в частности, корректировка системных таблиц, управление внешними устройствами, маскирование прерываний, обработка прерываний. В режиме "пользователь" выполняются оболочка и прикладные программы.

Режим ядра - привилегированный режим.. Когда процесс запускает системный запрос, он не передает управление другому процессу, а скорее меняет режим исполнения на режим ядра. В этом режиме он запускает он запускает защищенный от ошибок код ядра. В режиме "система" выполняются программы ядра.

При необходимости выполнить привилегированные действия пользовательский процесс обращается с запросом к ядру в форме так называемого системного вызова. В результате системного вызова управление передается соответствующей программе ядра. С момента начала выполнения системного вызова процесс считается системным. Таким образом, один и тот же процесс может находиться в пользовательской и системной фазах. Эти фазы никогда не выполняются одновременно.

Если процессор имеет более двух уровней привилегий, то используются наинизший и наивысший (0й). Ядро Unix работает на наивысшем уровне привилегий, обеспечивая управление оборудованием и процессами пользователя. Аппаратный уровень привилегий процессора определяет возможное множество инструкций, которые может вызывать исполняемый в данный момент процессором код.

Хотя понятия «режим пользователя» и «режим ядра» часто используются для описания кода, на самом деле это уровни привилегий, ассоциированные с процессором.

Уровень привилегий накладывает три типа ограничений:

1) возможность выполнения привилегированных команд,

2) запрет обращения к данным с более высоким уровнем привилегий,

3) запрет передачи управления коду с уровнем привилегий, не равным уровню привилегий вызывающего кода.

Когда мы говорим о пространстве ядра и пространстве пользовательского процесса имеются в виду не только разные уровни привилегий исполняемого кода, но и разные адресные пространства.

Unix передает исполнение из пространства пользовательского процесса в пространство ядра в двух случаях:

1) когда пользовательское приложение выполняет обращение к ядру (системный вызов),

2) во время обслуживания аппаратных прерываний.

Обычно, модуль осуществляет две задачи: некоторые функции модуля исполняются как часть системных вызовов, а некоторые ответственны за управление прерываниями.

Драйвер будет запущен в режиме работы с ядром, а ядро Linux не имеет средств принудительного сброса => если драйвер будет долго работать, не давая при этом работать другим программам, - компьютер может "зависнуть". Нормальный пользовательский режим с последовательным запуском не обращается к вашему драйверу.

Процесс работает одновременно и в режиме ядра, и в режиме пользователя. Основная часть процесса запускается в пользовательском режиме, системные вызовы запускаются в режиме ядра. Стеки, используемые работающими в разных режимах процессами, различны - определенный сегментный стек используется в пользовательском режиме, а режим ядра использует стек определенной величины.

10. Сравните модуль ядра и модуль приложения пользовательского режима: что общего и в чем разница

Модуль - это код, который может быть загружен или выгружен ядром по мере необходимости.

Модули ядра исполняется на высшем уровне (он еще называется привилегированный режим), где позволяется выполнение любых действий.

Модули приложения исполняются на самом нижнем уровне (так называемый непривилегированный режим), где прямой доступ к аппаратуре и памяти регулируется процессором.

Разл: Модули ядра старше, вызываются ядром;

Общ: режимы связаны между собой,-функциональность

Приложение имеет одну точку входа, которая начинает исполняется сразу же после размещения запущенного приложения в оперативной памяти компьютера. Эта точка входа описывается как функция main(). Завершение функции main() означает завершение приложения.

Модуль имеет несколько точек входа, исполняемых при установке и удалении модуля из ядра, а также при обработке поступающих, от пользователя, запросов. Так, точка входа init_module() исполняется при загрузке модуля в ядро. Функция cleanup_module() исполняется при выгрузке модуля.

Приложение может вызвать функцию, которая не была объявлена в приложении. На стадиях статической или динамической линковки определяются адреса таких функций из соответствующих библиотек.

Одна из особенностей ОС Linux - отсутствие библиотек, которые могут быть слинкованы с модулями ядра. Модули при загрузке, линкуются в ядро, поэтому все, внешние для этого модуля, функции должны быть объявлены в заголовочных файлах ядра и присутствовать в ядре. Исходники модулей никогда не должны включать обычные заголовочные файлы из библиотек пользовательского пространства. В модулях ядра вы можете использовать только функции, которые действительно являются частью ядра.

11. Опишите процесс динамической компоновки модулей ядра с действующим ядром. Утилиты insmod, modprobe и rmmod.

После написания программного кода модуля ядра происходит его компиляция.

gcc – c –I/usr/src/linux-$(uname - r)/include mod. c

После компиляции получается объяктный код, в котором не произведена линковка с ядром.

После загрузки модуля с помощью команды insmod модуль связывается с ядром и имеет доступ к опубликованным (экспортированным) функциям и переменным ядра. Т. е. утилита insmod связывает все неопределенные символы (вызовы функций и пр.) модуля с символьной таблицей запущенного ядра, при этом она не изменяет дисковый файл модуля, а загружает слинкованный с ядром объект модуля в оперативную память. Утилита insmod может принимать некоторые опции командной строки.

Функциональность утилиты modprobe во многом похожа на утилиту insmod, но при загрузке модуля проверяет его нижележащие зависимости, и, при необходимости, подгружает необходимые модули до требуемого заполнения стека модулей. Таким образом, одна команда modprobe может приводить к нескольким вызовам команды insmod. Можно сказать, что команда modprobe является интеллектуальной оболочкой над insmod. Можно использовать modprobe вместо insmod везде, за исключением случаев загрузки собственных модулей из текущего каталога, т. к. modprobe просматривает только специальные каталоги размещения модулей, и не сможет удовлетворить возможные зависимости.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3