Как Linux обрабатывает битовую карту разрешений ввода / вывода в структуре TSS? - PullRequest
1 голос
/ 03 апреля 2019

Следующая цитата из книги «Понимание третьего ядра Linux»:

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

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

  1. Проверяет 2-битное поле IOPL в регистре eflags.Если установлено значение 3, блок управления выполняет инструкции ввода / вывода.В противном случае он выполняет следующую проверку.

  2. Он обращается к регистру tr для определения текущего TSS и, следовательно, правильного битового массива разрешения ввода / вывода.

  3. Он проверяет бит битовой карты разрешения ввода / вывода, соответствующий порту ввода / вывода, указанному в инструкции ввода / вывода.Если он очищен, инструкция выполняется;в противном случае блок управления выдает исключение «Общая защита».

Следующая цитата также из той же книги:

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

Теперь, если в Linux есть только одна структура TSS для всех процессов (вместо того, чтобы каждый процесс имелсвоей собственной структурой TSS), и мы знаем, что каждый процесс должен иметь свою собственную битовую карту разрешений ввода-вывода, означает ли это, что когда Linux планирует выполнение другого процесса, Linux меняет значение битовой карты разрешения ввода-вывода только вСтруктура TSS, которую ЦП использует для значения битовой карты разрешений ввода / вывода процесса, который должен быть выполнен (который Linux предположительно хранит где-то в памяти ядра)?

1 Ответ

1 голос
/ 03 апреля 2019

Да.В том же разделе книги говорится:

Структура tss_struct описывает формат TSS.Как уже упоминалось в главе 2, массив init_tss хранит один TSS для каждого процессора в системе.При каждом переключении процесса ядро ​​обновляет некоторые поля TSS, чтобы соответствующий блок управления ЦП мог безопасно извлекать нужную ему информацию.Таким образом, TSS отражает привилегии текущего процесса на ЦП, но нет необходимости поддерживать TSS для процессов, когда они не запущены.

В более поздних версиях ядра init_tss был переименован в cpu_tss.Структура TSS каждого процессора инициализируется в cpu_init , который выполняется один раз для процессора при загрузке системы.

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

Связанный: Как процессоры Intel, использующие топологию кольцевой шины, декодируют и обрабатывают операции ввода-вывода портов .

...