terminal damage что это
43. 📎 Основные болячки Mustang. №4. ⭐ Памятка: Mustang terminal damage
Очередная памятка, внезапное включение…
🆕 Найдена новая детская болячка (проверенно на нескольких авто) ⬇️, дополню ею пост №29… проверяйте свои машины.
➡️ Продолжаем цикл статей об известных болячках наших пони, эта уже №4, а ниже список с быстрым переходом на другие:
• Проблемы №1 пост 29 (Маслопомойка, топливный датчик, клапан продувки адсорбера и др.)
• Проблемы №2 пост 32. (Прокладка ГБЦ)
• Проблемы №3 пост 34 (Подсветка луж)
• Проблемы №4 — ЭТОТ ПОСТ (Клеммы АКБ)
• Проблемы №5 пост 53 (Охлаждение)
• Проблемы №6 пост 59 (АКПП 10R80)
Клеммы аккумулятора.
В наших машинах они 2х видов – простые медные и медные с серебристым защитным покрытием.
Так вот, медные очень — быстро изживают себя. С защитным покрытием — живут немного дольше. И дело в том, что у некоторых одноклубников они начали гнить исподнизу, заметить и предотвратить это не приходило даже в голову, ведь ничего не предвещало беду.
К сожалению, видимо исходя из экономических соображений – клеммы пустотелые, коть и чисто медные и потому разрушаются довольно быстро, что приводит к плохому контакту, быстрому износу АКБ и некоторым другим рискам.
✔️ Решение простое:
Предотвратить можно профилактическими средствами ухода или, а если уже поздно — заменить.
Можно на любую понравившуюся…
Неплохие вроде бы варианты от китайцев Mystery:
а таким перфекционистам как я – могу посоветовать пару других вариантов:
⚠️ ОБЯЗАТЕЛЬНО!
Держите АКБ в чистоте (пыль и грязь являются проводником между + и —), а контакты клемм профилактически обрабатывайте правильными смазками:
Никакой рекламы! Все рекомендованное выбирал на свой вкус.
Ваша поддержка и эти кнопочки ниже – творят чудеса! )
Лайк ⬇️ Подписка ⬇️ Репост ⬇️
_____________________________________________
Вся приведенная в статье информация и указанные в ней данные — являются личным мнением автора.
Все действия со своим автомобилем вы производите на свой страх и риск, автор не несет никакой ответственности за последствия частного восприятия, кривых рук и др.
_____________________________________________
© Copyright
Копирование полностью, либо частично — без ссылки на источник запрещено.
Интеллектуальная собственность охраняется законом.
ГК РФ ст. 1225, 1259, 1265
Terminal damage что это
art of rally
I got it somewhere in middle of group B championship, nothing before :).
PS: I love the achievement name «Samir» :D:D:D
Thanks a lot for your answers. What I have been trying was the following (spoiler alert, it did not work):
custom rally in germany
severe damage
vel>110 km/h
hello tree
But all i get is fire, no matter how fast I’m going, the first massive crash just causes fire, and maybe total wreckage, but no samir :/. I have even tried in free roam to park on top of a campfire to see what happens, but no case, it seems that all cars have pyrophobic materials 😛
Дневник доставки авто из США: Как выбрать машину на аукционе?
Сразу скажу, что часть веселья я со своей покупкой пропустил, поскольку брал авто уже в процессе доставки и всё решили за меня. Но об этом позже, а пока я расскажу, как происходит в теории с самого начала.
Итак, в прошлой записи «Муки (и радость) выбора Cadillac ATS Coupe» я уже описал, по каким причинам чётко понял, что хочу именно Cadillac ATS Coupe, причем с 2.0Т и полным приводом. Далее предстоял путь на аукцион и поиск подходящего варианта. Аукционов в США три — Copart, Manheim и IAAI. Второй отпадает сразу, так как Manheim продает небитые авто (а просто после лизинга, проката и т.п.) — это интересно, но не в данном случае, потому что цена на целый ATS Coupe делает покупку для меня бессмысленной, я же хочу «кадиллак за косарь», ггг. Copart самый популярный и проводит гораздо больше аукционов, но и вероятность получить не то, что ожидалось выше, чем на IAAI. Наконец, IAAI неприятен своей замедленностью — от попадания машины в каталог аукциона до фактических торгов может пройти несколько месяцев, в то время, как у Copart этот срок исчисляется неделями. Так что, это аукцион для терпеливых. К тому же, к торгам не допускают частные лица, поэтому конкуренция меньше, но и процедура сложнее — если на Copart можно буквально приобрести авто самостоятельно и не пользоваться посредниками, то для работы с IAAI необходимо быть юридическим лицом.
Параллельно, я тогда смотрел и на IAAI. Так вот, интересовавший меня лот я видел еще в ноябре, а продался он аж в марте. Это примерная иллюстрация скорости работы IAAI по сравнению с Copart. В любом случае, аукционы реально дают время подумать — машин в продаже много, сроки длительные… Изучение рынка надо начинать с самих лотов. Посмотреть, что есть в продаже на Copart и IAAI из желаемых моделей/годов. Так я, скажем, осознал, что седанов ATS всегда много, а вот найти именно купе с 2.0Т и AWD — редкость. Дальше идет вопрос повреждений.
Вообще, «как не ошибиться с выбором битка» это настолько бесконечная тема, что можно сочинить гораздо больший материал. Причем навыки поиска на аукционах во-многом противоположны чутью «автоподборщика». Я же расскажу конкретно свою логику, не претендуя на абсолютную истину. Первый ориентир — это две строки описания машины, «primary damage» и «secondary damage», то есть основные и вторичные повреждения:
1. Утопленникам (water/flood в типе повреждений) — отказать. Под целой кузовщиной может и будет скрываться миллион электрических гремлинов, что на современных машинах гораздо дороже рихтовки и покраски.
2. Жертвам мародеров (stripped) — тоже отказать. Целый кузов без двигателя может пригодиться при восстановлении такой же, но сильно битой машины, но не для импорта и растаможки.
3. С угнанными (theft) все сложно, т.к. это может быть и практически целое авто, и тоже частично разбарахоленное. Как минимум, если хоть чего-то не хватает физически, это уже очень плохой признак.
4. По понятным причинам, погорельцы (fire) тоже исключаются, тут и говорить не о чем.
5. Очень привлекательны бывают побитые градом (hail damage), поскольку обычно вопрос решается заменой пары кузовных деталей и, максимум, стекол, а автомобиль сохраняет способность ездить.
6. Даже если в качестве вторичного повреждения, я бы не рискнул брать всякие третьи субстанции (biohazard/chemical) — описания на аукционе и фото может быть недостаточно для принятия решения.
7. Наконец, еще одна лоторея это «вандализм» (vandalism). Иногда может казаться, что разрисовка баллончиком и порезанные кресла — ерунда, легко устранимая на месте, но фото могут не передать масштаба трагедии.
8. Две стремные, хоть и внешне привлекательные категории это «прошлые повреждения» (damage history) и «частичный ремонт» (partial repair). И то, и другое означает, что над машиной уже трудились шаловливые руки местных механиков, скорее всего — не самых квалифицированных. Зато они могли замаскировать реальные повреждения!
9. Выбирая сравнительно новый автомобиль без возможности его осмотреть, я бы не стал брать и с механическими повреждениями (mechanical), если он не «заводится и едет» — невелика радость чинить новый двигатель или КПП. А вот undercarriage обычно означает мятые рычаги и прочие повреждения подвески, что может быть не так страшно и дорого.
10. Конечно, самые приятные категории это «нормальная эксплуатация» (normal wear) и мелкие повреждения кузовщины (minor dents and scratches). Но цена тоже будет близка к покупке обычного б/у авто, разве что повезет на торгах.
11. Вот и остается, что самый очевидный, самый популярный и самый понятный тип повреждений — является и самым предпочтительным, на мой взгляд из реалистичных по цене. Это ДТП. На аукционах стараются детализировать характер удара по тому, что повреждено (front end, side, rear end, roof), а если затронуто больше трех частей, то квалифицируется, выражаясь нашими терминами, «по кругу» (all over). Работа с битыми авто не удивляет обычных рихтовщиков и маляров, в США очень дорога, а у нас ограничивается больше запчастями, чем ценой за труд — и поэтому очень экономически выгодна.
Но биток битку тоже рознь. После описания на помощь приходят фотографии. Тут здравый смысл в помощь, даже не знаю, как описать коротко. Но я бы не брал машины нынешнего поколения, битые в морду — слишком много там всяких элементов типа датчиков, и слишком дорого теперь стоят мелочи вроде решеток. С другой стороны, тот же Cadillac CTS до 2015 года вполне можно именно «битый в морду» брать, потому что на него все запчасти очень дешевы. В-общем, тут все индивидуально. Увы, 8 не очень детальных фото с аукциона не всегда передают все подробности, так что приходится только рассматривать их и дальше консультироваться с каталогами цен на запчасти, включая многочисленные подушки безопасности. Для General Motors такой каталог — gmpartsdirect.com. По Ford и Chrysler я не в курсе. Есть еще уточнения состояния машины: run & drive («заводится и может проехать метр по парковке»), engine starts («мотор работает, ехать не может») и enhanced vehicle («проведена предпродажная подготовка, поэтому машина выглядит лучше, чем другие, но этом может быть обманчиво»). Фотографии могут быть обманчивы, а иногда и вводить в заблуждение: например, если на машине висит целый бампер, но над ним нет фары, то совсем не факт, что поменять придется только фару — возможно, по-быстрому прикрутили запчасть, чтобы скрыть повреждения под ней. Ведь фото продают!
Далее, если к конкретному кандидату присматриваться уже серьезно, то стоит потратить чуть-чуть денег и купить отчёт CarFax (www.carfax.com/). Он содержит информацию обо всем, что происходило с автомобилем от даты выпуска до, обычно, списания страховой в тотал (что предшествует попаданию на аукцион). Там виден пробег, тип собственника, перепродажи, аварии, ТО у дилера и т.п. Иногда бывает так, что авария не попадает в отчёт, например, у автомобилей в государственной собственности. В теории, это позволит потом продавать машину после восстановления, как «небит-некрашен», но на самом деле в наш век свободного доступа к информации обычный поиск по VIN-коду в Google уже выдаст, что автомобиль когда-то прошел через аукцион… Так что еще вопрос, есть ли преимущество у битого авто с «clean title» перед типичным «salvage title»…
Наконец, помимо модели, года и повреждений, неплохо разобраться с комплектацией. Конечно, покупка на аукционе — это не поход к дилеру, но все равно, есть же возможность выбрать желаемый комплект опций. В этом по умолчанию должен помочь сам аукцион: для большинства авто они стараются точно указывать модификацию. Я, к примеру, очень хотел Cadillac ATS в версии Performance — это предельная комплектация, у которой нет проклятых магнито-резистивных амортизаторов (вещь хорошая, пока новая, но очень дорогая и капризная, может выходить из строя за пару десятков тысяч пробега). Для того, чтобы узнать комплектацию конкретного экземпляра достоверно, существуют платные расшифровщики VIN-кода, например compnine.com. А получить базовые знания о том, что вообще искать и чем отличаются разные версии можно, загуглив «[год] [марка модель] brochure PDF» — для большинства свежих авто дилерские каталоги есть в публичном доступе.
Примерно на этом этапе уже очень хорошо бы знать, какие годы подходят, а какие — нет. Это узнается по минимуму чтением обычной Википедии (англоязычной, конечно, русская никому еще не помогла). С одной стороны, каждый прожитый модельный год снижает цену. С другой — можно лишиться приятных опций или возможностей. Например, ATS Coupe выпускается с 2015 года, но первый год авто шли с 6-ступенчатой АКП вместо 8-ступенчатой, а мультимедиа-система не поддерживает Apple CarPlay и Android Auto, что не очень приятно по нынешнему времени. Да, кстати, на аукционах указан модельный год, а не календарный! Поэтому, если покупка идет под конкретный «самый старый год» в целях оптимизации таможни, нужно обязательно проверять или по фото таблички на двери, или по VIN-коду реальную дату выпуска: под «закон 3251» машину 2010 модельного года, произведенную в декабре 2009-го, таможня скорее всего не пропустит!
Главный тезис всего, что я тут писал, таков: принятие решения совершается вслепую — на аукционе вы не видите автомобиль, не с кем поговорить и поторговаться, смотря в честные глаза перекупа! Поэтому информация — это ВСЁ. Нужно чётко представить себе, что хочется, чего точно _не_ хочется, удостовериться в правдивости данных аукциона… Короче, знать всё про еще не купленный автомобиль. Тогда шанс на провал будет гораздо меньше.
В моем случае, все эти шаги прошли менеджеры компании Atlantic Express, купившие «мой будущий» ATS Coupe на аукционе IAAI в июне. В следующей части истории я расскажу именно о том, что представляет из себя этот конкретный экземпляр, как я на него вышел, как применял описанные выше знания при выборе и сколько стоил сам автомобиль. Подписывайтесь, будет интересно!
Читайте предыдущую часть истории «Дневник доставки авто из США»:
0. Муки (и радость) выбора Cadillac ATS Coupe
Damage control. Second look. Читерство в хирургии
Немного другой формат. Без картинок. Длиннотекст.
К сожалению, вскоре, после первых смельчаков, в частности после Второй мировой войны, эта концепция стала спадать на нет, возник стереотип, что это хирургическая трусость, малодушничание, рукожопость. Надо ли отдельно акцентировать на «особенностях» этого стереотипа на просторах СССР? Тем более, если учесть просто колоссальный опыт отечественной хирургии за годы ВОВ, который фактически был послан в пешее путешествие.
Мешок это чаще всего действительно мешок, пакет для сбора мочи. Его объём около полутора-двух литров, стенка достаточно толстая, прочная, и если его развернуть в один лист по длинной или короткой стороне, то им можно закрыть любого размера лапаротомную рану. После этого рану нарывают влажной повязкой, что бы сохранить влажными открытые части подкожных слоёв, и пациента переводят в палату интенсивной терапии, где доблестные реаниматологи помогают хирургам его стабилизировать. Или наоборот, оберегают пациента от хирургов.
Спустя время, в каждом случае своё, сутки, двое, пациент берётся повторно в операционную, где уже аккуратно, щадяще извлекаются полотенца, сетки, перчатки, и выполняется всё необходимое. Обычно всё или почти всё кровотечение к этому моменту остановлено. Как минимум из капилляров, некрупных вен и мелких артерий. Что продолжает кровить, уже в спокойной обстановке лигируется, или восстанавливается. В это же время занимаются всевозможными протечками (чаще всего желчи при повреждении печени, мочи при повреждении мочевыводящей системы), оценивают жизнеспособность и восстанавливают целостность желудочно-кишечного тракта если это не было сделано в первый раз. Отмывают живот, и уходят, если всё в порядке.
Hello, World! Глубокое погружение в Терминалы
На написание данной статьи меня вдохновила статья об анализе Сишного printf. Однако, там был пропущен момент о том, какой путь проходят данные после того, как они попадают в терминальное устройство. В данной статье я хочу исправить этот недочет и проанализировать путь данных в терминале. Также мы разберемся, чем отличается Terminal от Shell, что такое Pseudoterminal, как работают эмуляторы терминалов и многое другое.
Основы
Давайте для начала разберемся, что такое Terminal, Shell, Console, чем отличается Terminal Emulator от обычного Terminal и почему он так назван. Информации об этом написано уже довольно много, поэтому ничего нового вы здесь не услышите. Почти вся информация здесь была взята из интернета, ссылки приведу в конце статьи. Кто уже знает, что все эти вещи обозначают, может смело пропускать данный раздел.
Terminal
Terminal (терминал) — это комбинация дисплея и клавиатуры, то есть физическое устройство. До того, как терминалы стали именно данной комбинацией, они являлись неким устройством под названием teleprinter (teletype, teletypewriter или TTY сокращенно), то есть комбинацией принтера и клавиатуры. Обычно несколько терминалов подключались к одному и тому же компьютеру. Таким образом возможно было работать нескольким пользователям за одним и тем же компьютером, причем каждому выделялась своя сессия, независимая от других. Терминал был назван так потому, что он находился на конце терминального кабеля (terminal end).
Это Teletype:
А это Terminal:
Console
Console (консоль) — терминал, который подключен напрямую к компьютеру. Дело в том, что большинство терминалов были соединены неявно, но хотя бы один был подключен напрямую к компьютеру. Консоль было разрешено использовать строго определенному кругу лиц, так как она позволяла настраивать компьютер.
Shell
Если предыдущие два представляют собой физические устройства, то данное определение относится исключительно к программному обеспечению.
Shell — это command line interpreter. Главное предназначение — запускать другие программы. Существует большое количество различных Shell’ов. Самым распространенным является Bash (от англ. Bourne Again SHell, что как подсказывает Википедия, является каламбуром для «Born again» Shell, то есть «возрождённый» Shell). Другие примеры: Dash (легковесный Shell, доступен, если запустить бинарник по адресу /bin/sh), Zsh.
Конечно же, и терминалы, и консоли не могли не найти своего отражения в современности. Поэтому далее мы рассмотрим такие вещи, как Terminal Emulator и Virtual Console.
Terminal Emulator
Terminal Emulator — эмулятор старого доброго терминала. Эмулятор терминала требуется для программ, которые не могут напрямую взаимодействовать с X Window System — Bash, Vim и прочие.
Давайте для начала установим обязанности терминала:
Так и наш Terminal Emulator выполняет абсолютно то же самое: он доставляет ввод пользователя в запущенную программу, а также отображает вывод программы на дисплей. В любом случае, смысл сохраняется — между пользователем и запущенной программой, существует какой-то слой, отвечающий за ввод/вывод. Примеры Terminal Emulator: gnome-terminal, xterm, konsole.
Прошу не путать Shell и Terminal Emulator!
Terminal Emulator — GUI приложение, то есть окно в X Window System. Shell — это command line interpreter, то есть просто исполнитель команд, он не имеет графической оболочки. Если говорить совсем правильно, вы не запускаете Bash, вы запускаете Terminal Emulator, который запускает внутри себя Bash. Terminal Emulator и Bash — абсолютно 2 различные программы. Первая отвечает исключительно за ввод/вывод, вторая — за обработку команд.
Далее в статье все упоминания терминала будут относиться к эмулятору терминала.
Virtual Console (Virtual Terminal)
Нажмите Ctrl+Alt+FN, где N, обычно, имеет значения от 1 до 6. То, что вы сейчас видели — называется Virtual Console (виртуальная консоль) или Virtual Terminal (виртуальный терминал). Помните, что я говорил ранее о терминалах? Множество терминалов были подсоединены к одному компьютеру и каждый терминал был отдельной сессией, независимой от других. Virtual Console повторяет эту идею: внутри вашего компьютера может быть несколько независимых сессий (однако, ресурсы компьютера все же, очевидно, общие).
Вы можете именовать данную сущность как Virtual Console, так и Virtual Terminal, так как по определению, консоль — это терминал, подключенный напрямую к компьютеру, но ведь все виртуальные терминалы в каком-то смысле подключены напрямую к компьютеру.
TTY устройства
Каждому терминалу назначается свое TTY устройство (терминальное устройство), которое обеспечивает работу консоли. Хотя телетайпы вы вряд ли уже найдете, но сокращение TTY дошло и до наших дней.
TTY устройство состоит из двух фундаментальных компонентов:
Строение TTY устройства:
Существует 3 типа TTY устройств:
В данной статье мы будем говорить именно о втором типе TTY устройств — псевдотерминалах.
TTY Line Discipline
Начнем рассматривать дисциплину линии TTY устройств.
Первой важной особенностью дисциплиной линии является то, что она отвечает за процессинг ввода/вывода. Это включает в себя, например, обработку управляющих символов (см. Управляющие символы) и форматирование вывода. Например, вы вводите любой текст, но вдруг понимаете, что ошиблись в написании чего-то и хотите это стереть — именно тут в дело вступает дисциплина линии.
Разберем подробно, что именно происходит, когда мы работаем в Bash, запущенном в терминале. По умолчанию TTY устройство работает в каноничном режиме с включенным эхо (echoing). Эхо — это отображение введенных вами символов на экране.
TTY Line Editing
TTY Line Editing — это тот компонент, который отвечает за процессинг ввода в дисциплине линии. Следует сказать, что Line Editing — это общее понятие и относится оно к процессингу ввода. Например, Bash и Vim имеют свой Line Editing.
Мы можем контролировать настройки дисциплины линии текущего TTY устройства с помощью программы stty. Давайте немного поэкспериментируем.
Откройте Bash или любой другой Shell и введите:
Теперь попробуйте что-нибудь ввести — и вы не увидите вашего ввода (не беспокойтесь, вы все еще можете передавать ввод в программу). Вы только что отключили эхо — то есть отображение введенных символов на экране. Теперь введите:
Больше информации вы сможете найти в man stty.
Terminal Emulator и Pseudoterminal
Каждый раз, когда мы открываем новый терминал в X Window System, GNOME Terminal Server порождает новый процесс и запускает в нём выбранную по умолчанию программу. Обычно, это какой-то Shell (например, Bash).
Общение с запущенной программой происходит через так называемый Pseudoterminal (псевдотерминал, PTY). Сам псевдотерминал существует в ядре, однако ввод получает из пользовательского пространства — из эмулятора терминала.
Псевдотерминал состоит из следующих двух виртуальных TTY устройств:
1) PTY master (PTM) — ведущая часть псевдотерминала. Используется GNOME Terminal Server для передачи ввода с клавиатуры в запущенную внутри терминала программу, а также для чтения вывода программы и отображения вывода на дисплей. GNOME Terminal Server в свою очередь общается с X Window System по X протоколу.
2) PTY slave (PTS) — ведомая часть псевдотерминала. Используется программой, запущенной внутри терминала, для чтения ввода с клавиатуры и отображения вывода на экран. По крайней мере, так думает сама программа (объясню, что это значит, чуть далее).
Любые данные, записанные в PTS устройство, являются вводом PTM устройства, то есть становятся доступны для чтения на PTM устройстве. И наоборот: любые данные, записанные в PTM устройство, являются вводом PTS устройства. Именно таким образом и происходит общение GNOME Terminal Server и запущенной внутри терминала программы. Каждому PTM устройству сопоставляется свое PTS устройство.
Помните, я сказал, что программа, использующая PTS устройство, только думает, что она общается напрямую с терминалом? Дело в том, что PTS также является терминальным устройством (TTY устройством), но разница между PTS устройством и действительным TTY устройством в том, что PTS устройство ввод получает не с клавиатуры, а с master устройства, а вывод идет не на дисплей, а на master устройство. Именно поэтому псевдотерминал назван так — псевдотерминал лишь имитирует (опять??) терминал. Разница между эмулятором терминала и псевдотерминалом в том, что эмулятор терминала — это лишь графическая программа, позволяющая запускать терминал прямо внутри оконного интерфейса, но реализована эта возможность с помощью псевдотерминала.
То, что PTS устройство является TTY устройством — это очень важно. Вот почему:
PTM устройство также является TTY устройством, но это не играет никакой роли, так как оно не используется в роли управляющего терминала. Более того, дисциплина линии PTM устройства установлена в raw режим, поэтому процессинг при передаче данных от PTS к PTM устройству не производится. Однако, вызовы read() и write() из пользовательского пространства все равно сперва обслуживаются дисциплиной линии на обоих устройствах. Данный момент сыграет еще большую роль, как мы увидим позднее.
Процесс общения GNOME Terminal Server и запущенной внутри терминала программы выглядит следующим образом:
Следует поподробнее рассмотреть роль, которую играет дисциплина линии при общении между обеими частями псевдотерминала. Здесь дисциплина линии отвечает за процессинг данных, переходящих от PTM к PTS устройству, а также за доставку данных из одной части псевдотерминала в другую. Когда мы находимся в драйвере PTS устройства, мы задействуем дисциплину линии PTM устройства, и наоборот.
Виртуальные устройства
Вы, наверное, могли подумать, что можете открыть файл по пути /dev/pts/N и писать или читать данные из него, как из обычного текстового файла? Да, все устройства в Unix-подобных системах являются файлами благодаря фундаментальному принципу Unix, который гласит, что все является файлом. Однако, никакие специальные файлы устройств (англ. — device file) не являются текстовыми файлами. Такие устройства называются виртуальными устройствами (virtual device) — то есть существуют исключительно в памяти, а не на диске.
Устройство псевдотерминала
Мы все ближе приближаемся к заключительной части статьи, но перед этим заглянем «под капот» Linux — рассмотрим устройство псевдотерминала на уровне ядра. Будет много кода, но я постараюсь объяснять каждый приведенный блок кода максимально подробно, сокращать неважные детали и идти последовательно.
Перед началом введем так называемую «корзину компонентов». По мере продвижения по ядру, мы будет добавлять в нее всё больше компонентов и находить связь между ними. Надеюсь, это еще лучше поможет понять устройство псевдотерминала. Приступим.
Когда Linux запускается, он загружает необходимые драйверы устройств. Такой драйвер имеется и у нашего псевдотерминала. Его регистрация начинается с вызова данной функции:
Для всех современных систем будет вызвана функция unix98_pty_init() :
Здесь нас интересует 3 вещи:
1. tty_set_operations
Функция tty_set_operations() всего лишь устанавливает таблицу функций для текущего драйвера:
Структура tty_operations — это таблица функций, которая используется для доступа к функциям драйвера TTY устройства.
Здесь можете наблюдать уже знакомую по статье о Сишном printf функцию pty_write — к ней мы вернемся чуть позднее.
Давайте добавим данную структуру в нашу корзину компонентов:
2. ptmx_open
Теперь перейдем к ptmx_open():
Сначала разберем функцию alloc_tty_struct() :
Единственное, что нас здесь интересует, это функция tty_ldisc_init() :
Которая вызывает tty_ldisc_get() :
Вроде бы ничего сложного? Давайте добавим все рассмотренные до этого момента структуры в нашу корзину и свяжем их таким же образом, как они связаны в коде:
Но мы создали tty_struct всего лишь для PTM устройства. А что же о PTS устройстве? Для этого вернемся к функции tty_init_dev() и вспомним о том, что дальше нас ожидает вызов функции tty_driver_install_tty() :
Комментарий подсказывает нам, что данный метод ответственен за создание различных дополнительных структур. PTS устройство и будет являться нашей дополнительной структурой. Признаюсь, это было для меня крайне удивительно, ибо это, черт возьми, целое устройство, а не просто какая-то дополнительная структура! Но мы то с вами понимаем, что все устройства — это всего лишь какие-то структуры, так что идем дальше. Хорошо, что такое здесь driver->ops->install? Для этого посмотрим на таблицу функций для PTM драйвера ещё раз:
И поймем, что нас интересует функция pty_unix98_install() :
Которая вызывает функцию pty_common_install() :
Мы видим, что для PTS устройства создается абсолютно такая же структура tty_struct за исключением того, что в ней будет находиться драйвер PTS устройства. Обе структуры хранят указатели друг на друга для общения между собой. Добавляем tty_struct для PTS устройства в нашу корзину.
Регистрация драйвера
Мы не будем рассматривать весь процесс регистрации драйвера, так как нас интересует только установка таблицы функций для файла TTY устройства (ведь мы должны как-то получить доступ к самому устройству при работе с файлом?).
Это — таблица функций, которая будет установлена для файла как PTM, так и PTS устройства:
Мы не будем добавлять данную структуру в нашу корзину, ибо она в принципе то и не относится к устройству псевдотерминалов и служит лишь для доступа к TTY устройству.
Готово. Мы рассмотрели процесс создания обоих устройств, который будет произведен при открытии мультиплексора /dev/ptmx. Таким образом, включая второе PTS устройство, которое имеет точно такое же строение, как и PTM устройство, общая картина строения псевдотерминала складывается следующая:
Hello, World!
Ну вот мы и подошли к самому главному. В данной главе мы полностью разберем путь нашей строки «Hello, World!», отправленной из простой Си программы в терминальное устройство.
Итак, наша строка «Hello, World!» отправляется в увлекательное путешествие. На самом деле, программа не знает ничего, кроме того, что она пишет в стандартный поток вывода. Ей больше нет разницы, куда этот вывод пойдет. Направьте stdout в /dev/null — и вывод вообще не будет нигде отображаться. Здесь я не буду рассказывать о вызовах библиотечных Си функций, а начнем сразу с файловой системы Linux.
Так как каждое устройство в Unix является файлом с определенными для него функциями write(), read(), close() и прочими, то при вызове write() на /dev/pts/0 мы попадаем в общую для всех файлов функцию __vfs_write() :
Здесь мы вызываем операцию write() из таблицы функций для текущего файла. Как вы помните, таблица функций была установлена при регистрации драйвера и выглядела она следующим образом:
Данная функция получает структуру tty_struct для текущего файла TTY устройства, а потом достает из нее дисциплину линии и вызывает функцию write() для нее. Таблица функций дисциплины линии выглядела следующим образом:
Переходим к функции n_tty_write() :
Итак, строка «Hello, World!» наконец отправилась в write() функцию драйвера PTS устройства. Найдем эту функцию в таблице функций драйвера:
Давайте здесь остановимся и проследим наш путь до этого места:
Вроде бы ничего не упустили. Итак, буфер передается в очередь ввода на PTM устройство. Разберемся, как именно это происходит.
Для начала, следует познакомить вас с новой структурой данных под названием flip buffer. Flip buffer — это структура данных, состоящая из двух массивов. Когда tty driver получает новые данные, он сохраняет их в первом массиве. Когда массив заполняется, ожидающая данных сторона будет об этом уведомлена и сможет прочитать данные из этого массива. Если в будущем появятся новые данные, они сохранятся уже во второй массив для того, чтобы не перезаписать читающиеся другой стороной данные. Когда и этот массив заполняется, ожидающая данных сторона снова будет уведомлена, а новые данные в следующий раз будут снова записываться в первый массив. Именно из-за такой логики данная структура данных и названа flip buffer — потому что данные перемещаются между массивами (наверное, здесь лучше подойдет какое-то другое слово, но я не знаю хорошего перевода для слова flip).
На самом деле, flip buffer был замёнен новой имплементацией в новых версиях ядра, однако поведение буфера осталось почти таким же, а все функции остались совместимы с раннее реализованными драйверами. Не стоит сильно вникать в устройство данного буфера, ясно одно — в конце концов данные будут перемещены в PTM устройство, а после окончания записи ожидающая сторона будет уведомлена о готовых для чтения данных.
Итак, наша строка «Hello, World!» оказалась в PTM устройстве. В это время GNOME Terminal Server заблокирован на вызове poll() (техника мультиплексирования I/O) и ожидает новых данных на любом из master устройств. Вы думаете, сейчас он проснется и прочитает новые данные на устройстве? Как бы не так. Когда я говорил об ожидающей стороне, я говорил о дисциплине линии, ведь это именно её задача — принимать ввод и производить его процессинг при необходимости.
Дисциплина линии будет уведомлена о новых данных с помощью вызова функции tty_flip_buffer_push() (в том же pty_write):
Я не знаю, что здесь подразумевается под work (предположу, что это какая-то внутренняя структура ядра для планировки различных задач) и какой компонент ядра отвечает за планировку, но из комментариев ясно следующее — когда задача начнет выполняться, доставку организует функция flush_to_ldisc() :
Все функции, начинающиеся с n_tty_receive_buf (кроме тех, где есть суффикс _raw) производят процессинг данных и записывают данные в буфер под названием read_buf, который и является основным буфером для чтения с TTY устройства. Так как дисциплина линии для PTM устройства установлена в raw режим, то процессинг не будет произведен и данные сразу запишутся в read_buf. Однако, если бы мы разбирали доставку данных от PTM к PTS устройству, то процессинг был бы произведен.
Опишу полную цепочку вызовов до конечного вызова, включая пропущенные вызовы:
Заметьте, никакая функция PTM драйвера при перемещении данных не была использована — вся работа произошла в дисциплине линии и драйвере PTS устройства.
Таким образом, наша строчка «Hello, World!» проходит следующий путь:
Заключение
Подведем итог. В данной статье мы узнали:
На этом все, спасибо за внимание! Если у вас возникли какие-нибудь вопросы — смело задавайте их в комментариях, буду рад ответить!