Где именно “логически” находится линия дисциплины tty?

Вопрос или проблема

Я недавно начал изучать операционные системы и ядро Linux. Мне были интересны терминалы, поэтому я начал с них, однако быстро столкнулся с проблемой. Я написал слегка более длинный вопрос, потому что хотел, чтобы вы увидели, где именно возникла проблема в моем понимании и что конкретно мне не ясно. Заранее спасибо 🙂

Я прочитал следующие статьи и вопрос/ответ:

  1. TTY демистифицирован
  2. Руководство по терминалу, консоли и оболочке
  3. Ответ от Стефана Шазеласа

Тем не менее, у меня возникли трудности с пониманием того, где именно находится линия дисциплины терминала (tty) в логическом плане, потому что я нашел несоответствие (как я наивно это понял) между первой статьей и ответом Стефана Шазеласа.

TTY демистифицирован сначала использует следующее изображение:
enter image description here

В статье говорится, что драйвер TTY представлен через tty_io.c, тогда как линия дисциплины по умолчанию представлена через n_tty.c. Процессы (такие как bash) взаимодействуют с драйвером TTY (tty_io.c). Фактически, на практике с файлом, который представляет всё устройство (драйвер UART + линия дисциплины + драйвер TTY). Драйвер UART – это некоторый класс “последовательного” драйвера, который общается с физической линией (и далее с терминалом) с одной стороны и с линией дисциплины с другой.

Следующая картинка из TTY демистифицирован:

enter image description here

Все то же самое, за исключением того, что теперь у нас есть эмулятор и виртуальный терминал. Единственная разница – драйвер UART не будет использоваться, вместо него будет использоваться драйвер “консоль”.

Последняя картинка показывает ситуацию с псевдотерминалом. В этом случае у нас есть мастер и подчиненная сторона. Эмулятор терминала “выталкивается” в пространство пользователя. Также у нас есть два файла, где эмулятор взаимодействует с главным файлом (/dev/ptmx), а процессы (оболочка) взаимодействуют с подчиненным файлом (/dev/pts/..). В этом случае используется драйвер pty, и я бы сказал, что логически, как и в предыдущих случаях, он находится на месте, где на картинке написано “PTY master side”.

enter image description here

Всё было понятно для меня (или я так думал), и затем я наткнулся на ответ от Стефана Шазеласа:

Много из “интеллекта” находится в линии дисциплины tty. Линия дисциплины – это программный модуль (находится в драйвере, в ядре), который накладывается поверх последовательного/pty устройства и располагается между этим устройством и линией/проводом (главная сторона для pty).

Согласно изображениям, у нас есть последовательное/консольное/pty “устройство”, представленное через драйвер в ядре (драйвер UART на первом, эмулятор на втором и “главная сторона” на третьем изображении), и затем линия дисциплины после (как часть драйвера, сверху его). Однако следующий компонент на изображениях – это драйвер TTY (tty_io.c), а не линия/провод, как написал Стефан Шазелас… Возможно, Стефан имеет в виду драйвер TTY, когда говорит “последовательное/pty устройство”, но это не имеет смысла для меня, так как тогда у нас было бы, например, UART (последовательный) драйвер <-> линия дисциплины <-> TTY драйвер/UART (последовательный) драйвер. Дополнительно, на изображениях, драйвер TTY не делает различий между ними, это просто tty_io.c

Я очень запутался. Что я упускаю? Где именно находится линия дисциплины tty “логически”?

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

Для вторых двух случаев, думайте о UART как о центре вещей, но когда он виртуализируется, он исчезает и не отображается на диаграмме.

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

В третьем случае видео и клавиатура также виртуализируются драйвером псевдотерминала с пользовательским программным обеспечением (xterm, screen и др.), виртуализируя те же вещи, которые виртуализирует драйвер консоли ядра во втором случае. Если бы UART был представлен, он фактически был бы между линией дисциплины и “мастерской” стороной PTY.

Если бы вы увеличили детализацию в первой схеме, вы бы обнаружили, что первое устройство внутри терминала – это другой UART, и если бы вы увеличили её ещё больше, вы бы обнаружили, что каждый UART имеет линию драйвер между ним и физической линией. Так что первой из аппаратов исчезает связь (uart<->line driver <-> physical line <-> line driver <-> uart). Линия драйвера может даже включать два модема с линией в виде телефонной линии.

Если копнуть глубже, вы обнаружите, что многие железные терминалы были реализованы на процессорах 6502. Любое дальнейшее изучение этого вопроса больше подходит для https://retrocomputing.stackexchange.com/

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

Дополнительно, на традиционном терминале у вас не будет много последовательных драйверов в терминале, потому что он не работает под Unix, это встроенная система, работающая с монолитной программой без отдельного программного драйвера. Хотя у вас может быть два UART, у вас нет двух последовательных драйверов.

Ссылка на это как “последовательное / pty устройство” корректна…потому что pty эмулирует / виртуализирует аппаратные последовательные части. Помните, когда вы виртуализируете это, все между двумя UART, включая uart, испаряется.

.

Ответ или решение

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

Логическое расположение tty дисциплины линии

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

Структура и место tty дисциплины линии

  1. Физическая и виртуальная структуры:

    • В физическом оборудовании (например, реальный UART) дисциплина линии располагается над драйвером устройства, который может быть представлен UART-драйвером.
    • В случае виртуальных терминалов и псевдотерминалов (pty), такие как xterm или screen, дисциплина линии выполняет аналогичные функции, но в контексте виртуализированных компонентов, таких как консольный драйвер или pty-мастер.
  2. Архитектурное расположение:

    • На схеме, представленной в статье "The TTY demystified", показано, что дисциплина линии функционирует между драйверами UART/консоли/pty и пользовательскими процессами через tty_io.c.
    • Stéphane Chazelas в своем ответе уточняет, что дисциплина логически располагается между устройством (будь то физическое или виртуальное) и линией передачи данных, что может быть интерпретировано как взаимодействие между нижеприведенными драйверами и пользовательскими интерфейсами.
  3. Функциональная роль:

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

Выводы

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

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

Оцените материал
Добавить комментарий

Капча загружается...