Вопрос или проблема
Я недавно начал изучать операционные системы и ядро Linux. Мне были интересны терминалы, поэтому я начал с них, однако быстро столкнулся с проблемой. Я написал слегка более длинный вопрос, потому что хотел, чтобы вы увидели, где именно возникла проблема в моем понимании и что конкретно мне не ясно. Заранее спасибо 🙂
Я прочитал следующие статьи и вопрос/ответ:
Тем не менее, у меня возникли трудности с пониманием того, где именно находится линия дисциплины терминала (tty) в логическом плане, потому что я нашел несоответствие (как я наивно это понял) между первой статьей и ответом Стефана Шазеласа.
TTY демистифицирован сначала использует следующее изображение:
В статье говорится, что драйвер TTY представлен через tty_io.c
, тогда как линия дисциплины по умолчанию представлена через n_tty.c
. Процессы (такие как bash) взаимодействуют с драйвером TTY (tty_io.c
). Фактически, на практике с файлом, который представляет всё устройство (драйвер UART + линия дисциплины + драйвер TTY). Драйвер UART – это некоторый класс “последовательного” драйвера, который общается с физической линией (и далее с терминалом) с одной стороны и с линией дисциплины с другой.
Следующая картинка из TTY демистифицирован:
Все то же самое, за исключением того, что теперь у нас есть эмулятор и виртуальный терминал. Единственная разница – драйвер UART не будет использоваться, вместо него будет использоваться драйвер “консоль”.
Последняя картинка показывает ситуацию с псевдотерминалом. В этом случае у нас есть мастер и подчиненная сторона. Эмулятор терминала “выталкивается” в пространство пользователя. Также у нас есть два файла, где эмулятор взаимодействует с главным файлом (/dev/ptmx
), а процессы (оболочка) взаимодействуют с подчиненным файлом (/dev/pts/..
). В этом случае используется драйвер pty, и я бы сказал, что логически, как и в предыдущих случаях, он находится на месте, где на картинке написано “PTY master side”.
Всё было понятно для меня (или я так думал), и затем я наткнулся на ответ от Стефана Шазеласа:
Много из “интеллекта” находится в линии дисциплины 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 дисциплины линии
-
Физическая и виртуальная структуры:
- В физическом оборудовании (например, реальный UART) дисциплина линии располагается над драйвером устройства, который может быть представлен UART-драйвером.
- В случае виртуальных терминалов и псевдотерминалов (pty), такие как xterm или screen, дисциплина линии выполняет аналогичные функции, но в контексте виртуализированных компонентов, таких как консольный драйвер или pty-мастер.
-
Архитектурное расположение:
- На схеме, представленной в статье "The TTY demystified", показано, что дисциплина линии функционирует между драйверами UART/консоли/pty и пользовательскими процессами через
tty_io.c
. - Stéphane Chazelas в своем ответе уточняет, что дисциплина логически располагается между устройством (будь то физическое или виртуальное) и линией передачи данных, что может быть интерпретировано как взаимодействие между нижеприведенными драйверами и пользовательскими интерфейсами.
- На схеме, представленной в статье "The TTY demystified", показано, что дисциплина линии функционирует между драйверами UART/консоли/pty и пользовательскими процессами через
-
Функциональная роль:
- Дисциплина линии управляет переходом данных между различными слоями, обеспечивая корректность передачи и соответствие различным протоколам терминального ввода-вывода.
- Она может обрабатывать данные до их передачи на уровень драйвера или пользовательского приложения.
Выводы
Ваше замешательство может проистекать из различий в использовании терминов и перспективы анализа в разных материалах. Важно понимать, что дисциплина линии служит мостом между уровнем аппаратной или виртуальной составляющей и уровнем программного обеспечения, обеспечивая согласованное и управляемое взаимодействие данных. Логически, она является частью драйверов устройств, но также вовлекает в себя управляющие функции, важные для корректной обработки данных.
Таким образом, для ясного понимания рекомендуется рассматривать дисциплину линии как сервисный слой, обеспечивающий функцию управления данными между физическим/виртуальным оборудованием и интерфейсами пользователей/приложений.