• Самая детальная информация у нас на сайте: центр юридическое сопровождение бизнеса

    Самая детальная информация у нас на сайте: центр юридическое сопровождение бизнеса

    brovkina.info





Linux Kernel (Ядро линукса) (часть 1)


Отключение локальных прерываний

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

Макрос iocai_irq_disabie(), в котором используется ассемблерная инструкция cii, отключает прерывания на локальном процессоре. Макрос iocai_irq_enabie, использующий инструкцию sti, включает их. Как было сказано в главе 4, инструкции cii и sti сбрасывают и устанавливают, соответственно, флаг if в управляющем регистре efiags. Макрос irqs disabiedo возвращает единицу, если флаг if в регистре efiags сброшен.

Когда ядро входит в критическую область, оно отключает прерывания, сбрасывая флаг if в регистре efiags. Однако при выходе из критической области ядро часто не может просто взять и установить флаг. Прерывания могут обрабатываться вложенным образом, и ядро не всегда знает, каким был флаг if до начала выполнения текущего тракта. В таких случаях тракт должен сохранять старое значение флага и восстанавливать его в конце своей работы.
Сохранение и восстановление содержимого регистра efiags выполняется с ПОМОЩЬЮ макросов local_irq_save И localirqrestore (соответственно). Макрос localirqsave копирует содержимое регистра efiags в локальную переменную, после чего флаг if сбрасывается инструкцией cii. В конце критической области макрос local irq restore восстанавливает первоначальное содержимое регистра efiags. Таким образом, прерывания включаются, только если они были включены до того, как управляющий тракт ядра выдал ассемблерную инструкцию cii.

Предыдущая страница | 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 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без проблем

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга для вас. А так как к книге прилагается компакт- диск с готовой к работе операционной системой Knoppix Live CD, то лишь достаточно вставить его в привод и перегрузить компьютер,...

Linux Kernel (Ядро линукса) (часть 1)

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

Linux Kernel (Ядро линукса) (часть 2)

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

Linux Kernel (Ядро линукса) (часть 3)

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