Архитектура ядра linux монолитная модульная

Микроядро vs. монолит и «торжество» MINIX

Недавно Эндрю Таненбаум, профессор Амстердамского свободного университета, автор учебной и миниатюрной Unix системы Minix, вновь оказался в центре событий благодаря эпистолярному жанру. В своем письме Интел он поблагодарил компанию за использование Minix, посетовал на то, что та не трубила об этом на каждом шагу и заявил, что из-за этого мало кто знает о том, что Minix — на сегодняшний день самая популярная ОС на свете.

Надо отдать должное профессору, он умеет выбирать адресата, время и место для того, чтобы вызвать громкий и продолжительный эффект с помощью простого сообщения, отправленного по электронной почте. Его предыдущим корреспондентом был Линус Торвальдс, а их переписка о монолитном и микро ядре вошла в анналы истории ИТ. Без этого трудно понять, почему Эндрю Таненбаум так экзальтирован из-за мнимого успеха Миникс, которая всего лишь в течении десятка лет обеспечивала работу интеловского бэкдора IME.

Рождение Linux и критика монолитного ядра

26 лет назад изучение программирования для Unix было нетривиальным делом для обычного студента, так как все разновидности Unix были платными. Чтобы освоить эту операционную систему Линус решает поставить Minix. Интернет в ту пору еще только зарождался, заказ ОС шел через обычную почту, так же как и доставка. Ради Minix пришлось раскошелиться на 169 долларов.

У меня возникло множество претензий к Minix. Хуже всего была эмуляция терминала, очень важная для меня программа, потому что именно ее я использовал для подключения к университетскому компьютеру. Я зависел от этой эмуляции каждый раз, когда связывался с университетским компьютером, чтобы поработать с мощной Unix-системой или просто выйти в онлайн.

Вскоре будущий создатель Linux обнаружил серьезные недостатки Minix. Так как это был всего лишь обучающий вариант Unix, то профессор преднамеренно исковеркал ее. Многие из этих недостатков можно было устранить заплаткой самого известного хакера Minix Брюса Эванса, но для того, чтобы ее поставить нужно было изрядно провозиться. Самым же существенным недостатком для Линуса была программа эмуляции терминала, которую пришлось заменить на свою собственную. Затем понадобился драйвер файловой системы и понеслось, ядро новой ОС зародилось по принципу каши из топора.

25 августа 1991 г. Линус отправляет свое знаменитое сообщение о том, что работает над бесплатной операционной системой, но это будет не такой крупный и профессиональный проект как GNU. Помимо всего прочего внимание заслуживает тот факт, что этот и другие ранние анонсы свое операционной системы Линус отправляет в конференцию Minix, оттягивая на себя пользователей последней.

Эндрю Таненбаум до поры до времени никак на это не реагировал, но Linux рос как снежный ком. Уже в январе 1992 г. вышла версия 0.12, в котором была реализована страничная подкачка на диск — то чего не было в Minix. Вскоре после этого профессор снизошел до выскочки, чтобы лично ему ответить и вот 29-го января Линус получает сообщение в конференцию comp.os.minix с нравоучительным содержанием. Начало было обнадеживающим.

From: ast@cs.vu.nl (Andy Tanenbaum)
То: Newsgroups: comp.os.minix
Subject: LINUX устарела
Date: 29 Jan 92 12:12:50 GMT

Я тут на пару недель уезжал в США, поэтому не писал особенно о LINUX (не то чтобы я стал писать, если бы и был здесь). Однако теперь хочу сделать несколько замечаний.
Как большинство из вас знает, для меня MINIX – хобби, которым я занимаюсь по вечерам, когда мне надоедает писать книжки, а по CNN не показывают никаких войн, революций или парламентских слушаний. Моя основная работа – преподавание и исследования в области операционных систем.

Далее следовали справочные сведения о монолитном ядре, микроядре и об ОС, исповедующих тот, или иной принцип. Затем следовал несостоятельный с точки зрения логики довод о том, что среди специалистов по разработке операционных систем споры по данному вопросы уже прекратились ввиду явного преимущества микроядра. Дальше декларации о том, что Minix прогрессивна, а Linux — возврат в 1970-е. Кроме того, Linux привязан к одной архитектуре в то время как Minix был перенесен с Intel процессоров на другие платформы: Atari, Amiga, Macintosh, SPARC и NS32016.

Я мог бы многое рассказать о сравнительных преимуществах этих двух подходов, но достаточно сказать, что среди специалистов по разработке операционных систем споры уже закончились. Микроядро победило. Minix – система с микроядром. Файловая система и управление памятью – это отдельные процессы, которые работают вне ядра. Ввод-вывод тоже выполняется отдельно. LINUX – монолитная система. Это большой шаг назад, в 70-е. годы.

В начале 90-х микроядро действительно было в фаворе у проектировщиков операционных систем. По их мнению ядро ОС должно быть минимальным и содержать лишь самое необходимое: управление памятью, планировщик и IPC, а все остальное реализуется в виде сервисов. Разбив целое на множество простых частей, сложность исчезает, а легковесные сервисы без труда обмениваются данными с микроядром. Сбой в драйвере файловой системы или сетевой карты, таким образом элементарно восстанавливался перезагрузкой соответствующего сервиса.

Линус принимает вызов

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

From: torvalds@klaava.Helsinki.FI (Linus Benedict Torvalds)
Subject: Re: LINUX устарела
Date: 29 Jan 92 23:14:26 GMT
Organization: University of Helsinki

.
Да, linux – монолитная система, и я согласен, что микроядро лучше. Если бы у вашего сообщения не был такой спорный заголовок, я бы, вероятно, согласился с большинством ваших высказываний. С теоретической (и эстетической) точки зрения linux проигрывает. Если бы ядро GNU было готово прошлой весной, я бы и не взялся за свою разработку: беда в том, что оно не было готово тогда и не готово до сих пор. Linux выигрывает прежде всего потому, что она уже готова.

Затем перечисляет проблемы Minix с многозадачностью в файловой системе.

Если бы это было единственным критерием качества ядра, вы были бы правы. Однако вы не пишете о том, что микроядро в minix сделано плохо и возникают проблемы с многозадачностью (в ядре). Если бы я сделал ОС, у файловой системы которой были бы проблемы с многозадачностью, я бы не стал так поспешно осуждать других: наоборот, я бы из кожи вон лез, чтобы все забыли о моем провале. Да, я знаю, что для minix есть масса заплаток, обеспечивающих многопоточную работу, но это лишь заплатки, и Брюс Эванс говорит, что все равно остается множество проблем синхронизации.

Перепалка в конференции продолжается, в спор вступают новые участники. Эндрю Таненбаум и Линус Торвальдсь продолжают спор, но уже более в более сдержанной манере. Ниже вольный перевод избранных цитат.

Эндрю Танебаум: Я нарочно написал Minix таким корявым, чтобы студенты могли гонять его на разнообразном и недорогом компьютерном железе, но дизайн у моей ОС норм., а не то что твой отсталый Linux. Его к тому же невозможно переносить на другие платформы. Я бы тебе на экзамене поставил пару.

David Feustel: Ничего страшного, и у Эйнштейна были плохие отметки по математике и физике.

Ken Thompson: Пользователям до лампочки современное ли ПО у них на компьютере, производительность гораздо важнее. Да, будущее за микроядром, однако монолитное ядро проще состряпать. Впрочем, его и запороть проще, если писать код на скорую руку.

Randy Burns: Системные вызовы Linux совместимы с переносимыми ОС, так что жалобы на привязку к одной платформе неуместны. Наоборот, Linux закрывает брешь, позволяя нам использовать програмы GNU. Может быть через пару лет, когда Hurd и недорогие BSD системы получат распространение Linux и устареет, но сейчас мы можем наслаждаться gcc, bash, bison за бесценок и писать код для лучшей ОС.

Pete French: А разве микроядро и монолитное ядро не являются артефактами языка программирования, на котором написаны. В чем разница между микроядром, написанным на C и монолитным ядром — на OCCAM?

Линус Торвальдс: Ты старался так ради студентов, ну тогда понятно. Но с многозадачностью в твоей ОС все равно беда, как ни крути, а на моем «отсталом» монолитном Linux все летает. С переносимостью больших проблем не будет, так как Linux API переносимо — были бы желающие. А хорошие оценки мне и так не светят, я тут недавно с другим преподавателем архитектуры ОС повздорил.

Lawrence C. Foard: Теоретики такие теоретики. У них прекрасные идеи, но никто их них не удосужился их проверить на деле. Интелосвкие 32-битные процессоры уже почти 10 лет как доступны на рынке, но никто кроме Линуса не написал для них ОС, которую можно пощупать, без необходимости покупать Unix AT&T за 100,000$. Готовая ОС стоит десятка бумажных. Я уже сегодня могу писать код для Linux и экспериментировать как мне вздумается.

peter da silva: Прекрасно, что Linux существует и монолитное ядро — одна из причин того, что он был создан так быстро. Это мощный аргумент в пользу монолитного ядра и однако это не значит, что микроядро обязательно должно быть медленным, или что оно «бумажное».

Читайте также:  Резервное копирование данных средствами windows

Аргументы в пользу микроядра в то время действительно перевешивали, но на сегодняшний день опыт использования обоих принципов построения ОС внес коррективы.

Несмотря на возможности Mach, такие потери производительности в реальном мире неприемлемы. По ходу того, как остальные коллективы разработчиков приходили к тем же выводам, их энтузиазм довольно быстро стал улетучиваться. Поэтому большая часть сообщества разработчиков ОС посчитала, что использование IPC в качестве основы ОС изначально провально.

На этом первая часть Марлезонского Балета завершилась. Первый раунд битвы остался за профессором, Линус взял свои слова обратно, первым вышел из спора, однако не изменил своего мнение, так в главном он был прав — его ОС выигрывала, потому что была готова. Спустя 14 лет спор знаменитого теоретика и практика продолжился.

Источник

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

Linux (ядро)

Linux kernel
Разработчик Линус Торвальдс и сторонние разработчики
Написана на C и Ассемблер [1]
Линейка ОС Unix-подобная
Дата первого релиза 0.01 (17 September 1991 года ; 30 years ago ( 1991-09-17 ) )
Доступно в Русский
Ядро (тип) Монолитное ядро
Лицензия GNU GPL, version 2 [2] plus various optional freely redistributable (proprietary) binary blobs [3]
Официальный веб-сайт kernel .org

Содержание

Историческая справка

Краткая история Unix

Хронология разработки ядра Linux очень обширна, однако точно прослеживаются истоки его создания, которые ведут к UNIX. В 1969 году Кен Томпсон из исследовательской группы Bell Laboratories совместно с Деннисом Ритчи на передовом микро-компьютере PDP-7 разработал ядро многозадачной, многопользовательской операционной системы UNICS ( позже переименованной в UNIX-TP). В момент создания ядра UNIX-TP Ритчи находился под влиянием своего прошлого проекта — ОС MULTICS, несмотря на наличие достаточно инновационных и передовых идей, таких как: строго сегментированная модель данных, сегментно-страничная виртуальная память, динамическое связывание, переконфигурация всей системы «на ходу», иерархическая файловая система, впервые реализованный подход с использованием стеков для каждого вычислительного процесса внутри системы ядра и др; проект был закрыт ввиду сложной архитектуры ОС, а также из-за недостатков, связанных с распределением памяти файлов, больших по размеру чем установленный системный лимит. Стоит также заметить, что вся операционная система, включая сложный компилятор языка PL/I, пользовательские команды и дополнительные библиотеки, состояла из примерно полутора тысяч исходных файлов, каждый из которых содержал примерно по 200 строк кода. В скомпилированном виде весь этот код занимал около 4,5 Мегабайт, что было огромным размером по тем временам. Компиляторы Multics в основном оптимизировали код по размеру, а не по эффективности использования центрального процессора, что было обосновано стремлением к экономии памяти в многопользовательской системе.

Читайте также:  Меняем ttl windows 10

Несмотря на неудачу своего предшественника, UNIX вобрал в себя концепцию MULTICS и был детально проработан. Первые две версии ОС были написаны на ассемблере, однако третья и четвертая версии использовали язык, разработанный Ритчи — С [4] , архитектура третьей версии использовала встроенный компилятор языка, а четвертая представляла собой полностью переписанное на СИ системное ядро. С приходом пятой версии UNIX был полностью переписан на язык СИ. Изначально создателем он был задуман как язык необходимый в написании операционных систем. Это переписывание разрешено команде UNIX TM с целью перехода на более мощную аппаратную часть — PDP-11/45 и 11/70 компьютеры. С 1974 года UNIX стал распространяться среди университетов и академических учреждений. С 1975 года началось появление новых версий, разработанных за пределами Bell Labs, и рост популярности системы.

В 1980 году компанией AT&T был разработан пакет коммерческих лицензий на все дистрибутивы UNIX, и сведение всех версий в одну: UNIX System V. Университет Калифорнии, Беркли продолжал разрабатывать свою собственную версию Unix под названием BSD. Многие из важнейших разработок в UNIX изначально пришли из BSD, к примеру, включение TCP/IP в основную версию UNIX. Поскольку основная часть системы поставлялась в исходных текстах, написанных на языке С, опытным программистам не требовалось документации, чтобы разобраться в архитектуре UNIX. C ростом популярности микропроцессоров другие компании переносили эту операционную систему на другие платформы, но простота и ясность операционной системы искушали многих на ее расширение и последующую модификацию, в результате чего появилось много разновидностей базовой системы.

Не желая терять инициативу, AT&T в 1982 году объединила несколько существовавших версий UNIX и создала версию под названием SYSTEM |||. В отличие от редакций, предназначавшихся, в первую очередь, для внутреннего использования и не получивших дальнейшего развития, SYSTEM ||| была создана для распространения за пределами Bell Labs и AT&T и положила начало новой ветви UNIX , которая и сегодня жива и развивается.

Краткая история Linux

В 1991 году в Хельсинки, Финляндии, Линус Торвальдс начал работу над проектом, который был, по его словам, «просто для удовольствия». Этот проект в конечном счете стал ядром Linux. Он никогда не был предназначен для чего-то особенного, просто инструмент, который позволил бы студенту получить доступ к UNIX-серверам в соседнем университете. Он написал его специально для железа, на котором он работал на тот момент, и оно не зависело от операционной системы. Linux разработана «с нуля» для процессора Intel i386, сегодня она перенесена на огромный ряд других аппаратных платформ, включая серверы Alpha фирмы DEC.

Переход от Unix к Linux

Linux был разработан в попытке создать бесплатную альтернативу коммерческим UNIX-средам. Его история начинается в 1991 или даже в 1983 гг., когда был создан проект GNU, чьей исходной целью было предоставить бесплатную альтернативу UNIX. Linux работает на гораздо большем количестве платформ, например на Intel®/AMD x86. Большинство ОС UNIX способны работать только на одной платформе.У Linux и UNIX общие исторические корни, но есть и серьезные отличия. Много инструментов, утилит, и бесплатных приложений, являющихся стандартными для Linux, первоначально задумывались как бесплатная альтернатива программам для UNIX. Linux часто предоставляет поддержку множества опций и приложений, заимствуя лучшую или наиболее популярную функциональность из UNIX. Администратору или разработчику, который привык работать с Linux, система UNIX может показаться не очень удобной для использования. С другой стороны, фундамент UNIX-подобной операционной системы (инструменты, файловая система, интерфейсы API) достаточно стандартизирован.

Понятие ядра операционной системы Linux.

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

  1. создает процессы и управляет ими
  2. распределяет и обеспечивает доступ к файлам, а также к периферийным устройствам

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

Исходный код ядра коммерческих дистрибутивов UNIX является собственностью их разработчиков и не распространяется за пределы компании. Полностью противоположная ситуация с Linux. Процедуры для компиляции и исправления ядер и драйверов весьма различны. Для Linux и других операционных систем с открытым исходным кодом патч может быть выпущен в виде исходного кода, и конечный пользователь может установить, проверить и даже модифицировать его. Эти патчи обычно проверены не так тщательно как патчи от поставщиков коммерческих ОС UNIX. Поскольку нет полного списка приложений и сред, которые должны быть оттестированы для корректной работы на Linux, Linux-разработчики зависят от конечных пользователей и других разработчиков, которые будут отлавливать ошибки.

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

Все коммерческие версии UNIX в некоторой степени эволюционировали до модульного ядра. Драйверы и отдельные особенности ОС доступны как отдельные компоненты и могут быть по необходимости загружены или выгружены из ядра. Но открытая модульная архитектура Linux гораздо гибче. Однако гибкость и адаптируемость Linux означают и постоянное изменение. Исходный код Linux постоянно меняется, и, по прихоти разработчика, может поменяться API. Когда модуль или драйвер написан для коммерческой версии UNIX, он проработает гораздо дольше, чем тот же драйвер для Linux.

Читайте также:  Games windows live активация ключа

Устройство компонентов ядра ОС Linux

Ядро состоит из:

  1. Файловая система
  2. Подсистема управления процессами и памятью
  3. Подсистема ввода / вывода

Файловая подсистема

Файловая подсистема обеспечивает унифицированный интерфейс доступа к данным, расположенным на дисковых накопителях, а также к периферийным устройствам. Одни и те же функции open(), read(), write() могут использоваться как при чтении или записи данных на диск, так и при выводе текста на принтер или в терминал. Файловая подсистема контролирует права доступа к файлу, выполняет операции размещения и удаления файла. Поскольку большинство прикладных функций выполняется через интерфейс файловой системы, права доступа к файлам определяют привилегии пользователя в системе. Файловая подсистема обеспечивает маршрутизацию запросов периферийным устройствам, соответствующим модулям подсистемы ввода/вывода.

Подсистема управления запросами

Запущенная на выполнение программа порождает в системе один или более процессов ( задач ). Подсистема управления процессами контролирует:

  1. Создание и удаление процессов
  2. Распределение системных ресурсов ( памяти, вычислительных ресурсов ) между процессами
  3. Синхронизацию процессов
  4. Межпроцессорное взаимодействие

Известно, что в общем случае число активных процессоров превышает число процессоров компьютера, но в каждый конкретный момент времени на каждом процессоре может выполняться только один процесс. Операционная система управляет доступом процессоров к вычислительным ресурсам, создавая ощущение одновременного выполнения нескольких задач. Специальная задача ядра, называемая распорядителем или планировщиком процессов, разрешает конфликты между процессами в конкуренции за системные ресурсы ( процессор, память, периферийные устройства ). Планировщик запускает процесс на выполнение, следя за тем, чтобы процесс монопольно не захватил разделяемые системные ресурсы. Процесс освобождает процессор, ожидая длительной операции ввода/вывода, или по прошествии периода времени. В этом случае планировщик выбирает следующий процесс с наивысшим приоритетом и запускает его на выполнение. Модуль управления памятью обеспечивает размещение оперативной памяти для прикладных задач. Оперативная память является дорогостоящим ресурсом, и, как правило, она редко «простаивает». В случае, если для всех процессов недостаточно памяти, ядро перемещает части процесса или несколько процессов во вторичную память ( как правило, для этого выделена некоторая область жесткого диска ), освобождая ресурсы для действующих процессов. Все современные системы реализуют виртуальную память: процесс выполняется в собственном логическом адресном пространстве, которое может значительно превышать доступную физическую память. Управление виртуальной памятью процесса также входит в перечень задач модуля управления памятью. Модуль межпроцессного взаимодействия.отвечает за уведомление процессов о событиях с помощью сигналов и обеспечивает возможность передачи данных между различными процессами.

Подсистема ввода/вывода

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

Особенности архитектуры

Ядро Linux поддерживает многие унаследованные от UNIX особенности, такие как:

  1. многозадачность
  2. виртуальную память
  3. динамические библиотеки
  4. отложенную загрузку
  5. производительную систему управления памятью
  6. современные сетевые протоколы

На сегодняшний день Linux — монолитное ядро с поддержкой загружаемых модулей. Драйверы устройств и расширения ядра обычно запускаются в 0-м кольце защиты, с полным доступом к оборудованию. В отличие от обычных монолитных ядер, драйверы устройств легко собираются в виде модулей и загружаются или выгружаются во время работы системы, эта особенность также является унаследованной от первого предшественника — ОС Multics. То, что архитектура Linux не является микроядерной, вызвало обширнейшие споры между Линусом Торвальдсом и Эндрю Таненбаумом в конференции.

Выполнение в режиме ядра

Существуют всего три события, при которых выполнение процесса переходит в режим ядра:

  1. аппаратные прерывания
  2. особые ситуации
  3. системные вызовы

Во всех случаях ядро Linux получает управление и вызывает соответствующую системную процедуру для обработки события. Непосредственно перед вызовом ядро сохраняет состояние системы, а именно состояние прерванного процесса в системном стеке. После завершения обработки, состояние процесса восстанавливается и процесс возвращается в исходный режим выполнения. Чаще всего это режим задачи, например, когда прерывание возникло, когда процесс уже находился в режиме ядра, после обработки события он останется в том же состоянии. Стоит разграничить особые ситуации и прерывания. Аппаратные прерывания генерируются периферией при наступлении исключительных событий ( например, завершение печати или поступление данных на последовательный вход ввода ) и имеют асинхронный характер, поскольку невозможно в тот или иной момент сказать, когда система нам пробросит исключение. Часто, эти прерывания не связаны с текущим процессом, а вызваны внешними событиями. Именно поэтому, обработка прерываний происходит в системном контексте, при этом недопустим доступ к адресному пространству процесса. По этой причине обработка ситуаций не должна блокироваться, поскольку это вызовет блокирование выполнения независимого процесса Системные вызовы позволяют процессам воспользоваться базовыми услугами ядра. Интерфейс системных вызовов определяет ограниченный набор точек входа в ядро системы, обращение к которым изменяет режим выполнения процесса и позволяет выполнять привилегированные функции ядра. Стандартная библиотека C, позволяющая использовать системные функции как обычные процедуры, на самом деле содержит заглушки, обеспечивающие фактическую реализацию вызова соответствующей точки входа ядра. Эта реализация практически не зависит от аппаратной части системы. Например, для систем на базе процессоров Intel используются шлюзы. Имеются два типа шлюзов: шлюзы ловушек и шлюзы вызовов. Для осуществления вызова через шлюз ловушки процесс выполняет команду прерывания, а при работе через шлюз вызова — команду межсегментного вызова. Выполнение системного вызова происходит в режиме ядра, но в контексте процесса, сделавшего системный вызов. Таким образом, открыт доступ к адресному пространству процесса и используется стек ядра процесса.

Примечания

  1. ↑ Balsa, Andrew D. «The linux-kernel mailing list FAQ». Tux.Org.
  2. ↑ Martens, China (28 July 2006). «Linux creator Torvalds still no fan of GPLv3». InfoWorld. IDG . Retrieved 15 February 2015 .
  3. ↑»kernel/git/stable/linux-stable.git». git.kernel.org. 16 October 2002 . Retrieved 21 August 2012 . path: root/firmware/WHENCE
  4. ↑Си

Литература

Робачевский, Андрей (2002). Autotools : Операционная система Unix / by Андрей Робачевский. No Starch Press. p. 528. ISBN 5-8206-0030-4.

Источник

Оцените статью