Зарегистрировать файл - Register file

А зарегистрировать файл это массив регистры процессора в центральное процессорное устройство (ЦПУ). Современное Интегральная схема файлы регистров обычно реализуются путем быстрого статические RAM с несколькими портами. Такие RAM отличаются наличием выделенных портов для чтения и записи, тогда как обычные многопортовые SRAM обычно читают и записывают через одни и те же порты.

В архитектура набора команд ЦП почти всегда определяет набор регистров, которые используются для передачи данных между памятью и функциональными блоками на кристалле. В более простых процессорах эти архитектурные регистры однозначно соответствуют записям в файле физического регистра (PRF) в ЦП. Использование более сложных процессоров зарегистрировать переименование, так что отображение того, какая физическая запись хранит конкретный архитектурный регистр, изменяется динамически во время выполнения. Регистровый файл является частью архитектура и видимым для программиста, в отличие от концепции прозрачного тайники.

Смена банка регистров

Файлы регистров могут быть объединены в банки регистров.[1] Некоторые процессоры имеют несколько банков регистров.

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

В MODCOMP а позже 8051-совместимые процессоры используйте биты в слове состояния программы, чтобы выбрать текущий активный банк регистров.

Выполнение

Regfile array.png

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

Файлы регистров имеют одну строку слов на запись на порт, одну строку битов на бит ширины на порт чтения и две строки на бит ширины на порт записи. Каждая битовая ячейка также имеет Vdd и Vss. Следовательно, площадь шага проводов увеличивается пропорционально квадрату количества портов, а площадь транзистора увеличивается линейно.[2]В какой-то момент может быть меньше и / или быстрее иметь несколько избыточных файлов регистров с меньшим количеством портов чтения, чем один файл регистра со всеми портами чтения. В MIPS R8000 с целое число В модуле, например, имелось 9 64-битных регистровых файлов с 4 портами записи и 32 входа, реализованных в процессе 0,7 мкм, что можно было увидеть, глядя на микросхему с расстояния вытянутой руки.

Двумя популярными подходами к разделению регистров на несколько файлов регистров являются конфигурация файла распределенных регистров и конфигурация файла секционированных регистров.[2]

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

Разрядность регистрового файла в битах обычно равна количеству бит в размер слова процессора Иногда он немного шире, чтобы к каждому регистру добавлялись «лишние» биты, такие как бит яда. Если ширина слова данных отличается от ширины адреса или, в некоторых случаях, например, 68000, даже если они одинаковой ширины - регистры адреса находятся в отдельном файле регистров, чем регистры данных.

Декодер

  • Декодер часто разбивается на предварительный декодер и собственно декодер.
  • Декодер представляет собой серию логических элементов И, управляющих строками слов.
  • На каждый порт чтения или записи приходится один декодер. Если массив имеет четыре порта чтения и два порта записи, например, он имеет 6 строк слов на битовую ячейку в массиве и шесть логических элементов И на строку в декодере. Обратите внимание, что декодер должен быть согласован по высоте с массивом, что заставляет эти вентили И быть широкими и короткими.

Множество

Типичный регистровый файл - «трехпортовый», способный читать из 2 регистров и записывать в 1 регистр одновременно - состоит из битовых ячеек, подобных этой.

Базовая схема для битовой ячейки:

  • Состояние хранится в паре инверторов.
  • Данные считываются транзистором nmos в разрядную линию.
  • Данные записываются путем замыкания одной или другой стороны на землю через стек из двух НМО.
  • Итак: порты чтения занимают один транзистор на битовую ячейку, порты записи - четыре.

Возможны многие оптимизации:

  • Совместное использование линий между ячейками, например, Vdd и Vss.
  • Битовые линии чтения часто предварительно заряжаются до уровня между Vdd и Vss.
  • Считанные битовые линии часто колеблются лишь на небольшую часть пути до Vdd или Vss. Усилитель считывания преобразует этот сигнал с небольшим размахом в полный логический уровень. Небольшие колебательные сигналы быстрее, потому что разрядная линия имеет небольшой привод, но большую паразитную емкость.
  • Битовые линии записи могут быть скручены так, чтобы они одинаково соединялись с соседними битовыми линиями чтения. Поскольку битовые линии записи идут полным ходом, они могут вызывать значительные нарушения в битовых линиях чтения.
  • Если Vdd является горизонтальной линией, он может быть выключен еще одним декодером, если какой-либо из портов записи записывает эту строку в течение этого цикла. Эта оптимизация увеличивает скорость записи.
  • Методы, которые снижают потребление энергии файлами регистров, полезны в маломощная электроника[3]

Микроархитектура

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

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

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

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

В Альфа 21264 (EV6), например, была первой крупной микроархитектурой, реализовавшей «архитектуру файлов теневого регистра». Он имел две копии файла целочисленных регистров и две копии регистра с плавающей запятой, которые располагались во внешнем интерфейсе (будущий и масштабированный файл, каждый из которых содержит 2 порта чтения и 2 порта записи), и потребовался дополнительный цикл для передачи данных между ними во время переключатель контекста. Логика задачи попыталась уменьшить количество операций, пересылающих данные между ними, и значительно улучшила целочисленную производительность и помогла уменьшить влияние ограниченного количества GPR на суперскалярное и спекулятивное выполнение. Позднее дизайн был адаптирован SPARC, MIPS и некоторые более поздние реализации x86.

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

В SPARC также использует «Архитектуру файлов теневого регистра» для своей высокопроизводительной линейки. Он имел до 4 копий файлов целочисленных регистров (будущие, устаревшие, масштабированные, поцарапанные, каждый из которых содержал 7 портов чтения и 4 записи) и 2 копии файла регистров с плавающей запятой. Однако, в отличие от Alpha и x86, они расположены в бэкэнде как удаленный модуль сразу после его Out of Order Unit и переименовывают файлы регистров и не загружают инструкции на этапе выборки и декодирования инструкций, и переключение контекста в этой конструкции не требуется.

IBM использует тот же механизм, что и многие основные микропроцессоры, глубоко объединяя регистровый файл с декодером, но его регистровый файл работает независимо со стороны декодера и не требует переключения контекста, что отличается от Alpha и x86. большая часть его регистрового файла служит не только для специального декодера, но и до уровня потока. Например, МОЩНОСТЬ8 имеет до 8 декодеров команд, но до 32 файлов регистров по 32 регистра общего назначения в каждом (4 порта чтения и 4 порта записи), чтобы облегчить одновременная многопоточность, инструкция которого не может использоваться с другими регистровыми файлами (отсутствие переключения контекста).

в x86 Линия процессора, типичный ЦП до 486 не имел отдельного файла регистров, так как все регистры общего назначения напрямую работали с его декодером, а стек push x87 находился внутри самого модуля с плавающей запятой. Начиная с Pentium, типичный Pentium-совместимый процессор x86 интегрирован с одной копией однопортового файла регистров архитектуры, содержащего 8 регистров архитектуры, 8 регистров управления, 8 регистров отладки, 8 регистров кода состояния, 8 регистров на основе безымянных имен,[требуется разъяснение ] один указатель инструкции, один регистр флага и 6 сегментных регистров в одном файле.

Одна копия выталкиваемого стека 8 x87 FP по умолчанию, MMX Регистры были виртуально смоделированы из стека x87 и требуют регистр x86 для предоставления инструкции MMX и псевдонимов для существования стека. На P6 команда независимо может храниться и выполняться параллельно на ранних этапах конвейера перед декодированием в микрооперации и переименование во внеочередном исполнении. Начиная с P6, все файлы регистров не требуют дополнительного цикла для распространения данных, файлы регистров, такие как архитектурные файлы и файлы с плавающей запятой, расположены между буфером кода и декодерами, называются «буфером удаления», буфером переупорядочения и OoOE, и подключены к кольцевой шине (16 байтов). Сам регистровый файл по-прежнему остается одним регистровым файлом x86 и одним стеком x87, и оба они служат для хранения на пенсии. Его регистровый файл x86 увеличен до двухпортового, чтобы увеличить пропускную способность для хранения результатов. Такие регистры, как отладка / код условия / управление / безымянный / флаг, были удалены из основного файла регистров и помещены в отдельные файлы между ПЗУ микрооперации и секвенсором команд. Только недоступные регистры, такие как регистр сегмента, теперь отделены от файла регистров общего назначения (кроме указателя команд); теперь они расположены между планировщиком и распределителем инструкций, чтобы облегчить переименование регистров и выполнение вне очереди. Стек x87 был позже объединен с файлом регистров с плавающей запятой после того, как 128-битный регистр XMM дебютировал в Pentium III, но регистровый файл XMM по-прежнему расположен отдельно от файлов целочисленных регистров x86.

Более поздние реализации P6 (Pentium M, Yonah) представили «Архитектуру файла теневого регистра», которая расширена до двух копий двухпортового целочисленного архитектурного регистрового файла и состоит с переключением контекста (между будущим и удаленным файлом и масштабированным файлом с использованием того же трюка, который использовался между целыми и плавающими точка). Это было сделано для того, чтобы устранить узкое место в регистрах, которое существует в архитектуре x86 после введения микроопераций, но в нем все еще есть 8 записей 32-битных архитектурных регистров, общая емкость которых составляет 32 байта на файл (сегментный регистр и указатель команд остаются в файле. , хотя они недоступны для программы) как спекулятивный файл. Второй файл служит файлом масштабированного теневого регистра, который без переключения контекста масштабированный файл не может хранить некоторые инструкции независимо. Некоторые инструкции из SSE2 / SSE3 / SSSE3 требуют этой функции для целочисленных операций, например, такие инструкции, как PSHUFB, PMADDUBSW, PHSUBW, PHSUBD, PHSUBSW, PHADDW, PHADDD, PHADDSW потребуют загрузки EAX / EBX / ECX / EDX из обоих регистровых файлов, хотя процессор x86 редко использовал другой регистровый файл с той же инструкцией; большую часть времени второй файл используется как файл с сохраненным масштабом. Архитектура Pentium M по-прежнему остается одним двухпортовым регистровым файлом FP ​​(8 записей MM / XMM), совместно используемым с тремя декодерами, а регистр FP не имеет файла теневого регистра с ним, поскольку его архитектура файла теневого регистра не включала функцию с плавающей запятой. Процессор после P6, архитектурный регистровый файл является внешним и находится в бэкэнде процессора после вывода из эксплуатации, напротив внутреннего регистрового файла, который находится во внутреннем ядре для буфера переименования / переупорядочения регистров. Однако в Core 2 он теперь находится в блоке, называемом RAT «таблица псевдонимов регистров», расположенном с распределителем инструкций, но имеет такой же размер регистра, как и исключение. Ядро 2 увеличил внутреннюю кольцевую шину до 24 байтов (позволяет декодировать более 3 инструкций) и расширил свой регистровый файл с двухпортового (одно чтение / одна запись) на четырехпортовый (два чтения / две записи), регистр по-прежнему остается 8 записей в 32 бита и 32 байта (не включая 6-сегментный регистр и один указатель инструкций, поскольку они не могут быть доступны в файле с помощью какого-либо кода / инструкции) в общем размере файла и расширены до 16 записей в x64, что дает общий размер 128 байтов на файл. От Pentium M по мере увеличения его конвейерного порта и декодера, но они расположены с таблицей распределения вместо буфера кода. Его регистровый файл FP XMM также увеличен до четырехпортового (2 чтения / 2 записи), регистр по-прежнему остается 8 записей в 32-битном режиме и расширен до 16 записей в режиме x64, а число по-прежнему остается 1, поскольку его архитектура файла теневого регистра не включает плавающие point / SSE функции.

В более поздних реализациях x86, например Nehalem и более поздних процессоров, как целочисленные регистры, так и регистры с плавающей запятой теперь включены в унифицированный окта-портированный (шесть для чтения и две записи) файл регистров общего назначения (8 + 8 в 32-битных и 16 + 16 в x64 на файл), в то время как регистровый файл расширен до 2 за счет улучшенной «Архитектуры файла теневого регистра» в предпочтительном исполнении Hyper Threading и каждый поток использует независимые файлы регистров для своего декодера. Потом Песчаный Мост и в дальнейшем замененная таблица теневых регистров и архитектурные регистры на гораздо больший и еще более продвинутый файл физических регистров перед декодированием в буфер переупорядочения. Пробежал по тому Сэнди-Бридж и дальше, больше не имеют архитектурного реестра.

На Атом line была современной упрощенной ревизией P5. Он включает отдельные копии общего файлового ресурса регистров с потоком и декодером. Регистровый файл имеет двухпортовый дизайн, 8/16 записей GPRS, 8/16 записей отладочного регистра и 8/16 записей кода состояния интегрированы в один и тот же файл. Однако он имеет 64-битный теневой регистр с восемью записями и 64-битный безымянный регистр с восемью записями, которые теперь отделены от основных GPR, в отличие от оригинальной конструкции P5, и расположены после исполнительного блока, а файл этих регистров является однопортовым. и не подвергать воздействию инструкций, таких как масштабированный файл теневого регистра, найденный на Core / Core2 (файл теневого регистра состоит из архитектурных регистров, а у Боннелла не было из-за отсутствия «Архитектуры файла теневого регистра»), однако файл можно использовать для переименования из-за к отсутствию неисправного исполнения, обнаруженного в архитектуре Боннеля. У него также была одна копия файла регистров с плавающей запятой XMM на поток. Отличие от Nehalem is Bonnell не имеет единого файла регистров и не имеет специального файла регистра для его гиперпоточности. Вместо этого Bonnell использует отдельный регистр переименования для своего потока, несмотря на то, что он исправен. Подобно Боннелю, Ларраби и Ксеон Пхи также у каждого есть только один файл регистров общего назначения, но Larrabee имеет до 16 файлов регистров XMM (8 записей на файл), а Xeon Phi имеет до 128 файлов регистров AVX-512, каждый из которых содержит 32 512-битных файла ZMM. регистры для хранения векторных инструкций, которые могут быть размером с кэш L2.

Есть некоторые другие линейки Intel x86, у которых нет файла регистров во внутренней структуре, Geode GX и Vortex86 и многие встроенные процессоры, которые не Pentium -совместимые или переработанные ранние процессоры 80x86. Поэтому у большинства из них нет регистрового файла для своих декодеров, но их георадары используются индивидуально. Pentium 4, с другой стороны, у него нет регистрового файла для своего декодера, поскольку его x86 GPR не существовали в его структуре из-за введения физического унифицированного файла регистров переименования (похожего на Sandy Bridge, но немного другого из-за невозможность Pentium 4 использовать регистр перед присвоением имени) для попытки заменить файл архитектурного регистра и пропустить схему декодирования x86. Вместо этого он использует SSE для целочисленного выполнения и хранения перед ALU и после результата, SSE2 / SSE3 / SSSE3 также используют тот же механизм для своей целочисленной операции.

AMD Ранний дизайн, такой как K6, не имеет регистрового файла, как Intel, и не поддерживает «архитектуру теневого регистрового файла», так как в нем отсутствуют переключение контекста и обходной инвертор, которые необходимы для правильной работы регистрового файла. Вместо этого они используют отдельные GPR, которые напрямую связываются с таблицей регистров переименования для своего ЦП OoOE с выделенным целочисленным декодером и плавающим декодером. Механизм аналогичен линейке процессоров Intel до Pentium. Например, K6 Процессор имеет четыре int (один временный файл регистров с восьмью записями + один файл будущих регистров с восемью записями + один выбранный файл регистров с восемью записями + безымянный файл регистров с восемью записями) и два файла регистров переименования FP (два файла с восемью записями x87 ST файл, один идет fadd, а другой идет fmov), которые напрямую связаны с его x86 EAX для целочисленного переименования и регистром XMM0 для переименования с плавающей запятой, но позже Athlon включил «теневой регистр» в свой интерфейс, он масштабирован до 40 записей унифицированного файла реестра для целочисленных операций перед декодированием, регистровый файл содержит 8 записей рабочего регистра + 16 будущих файлов регистров GPR + 16 файлов регистров безымянных GPR. В более поздних разработках AMD отказалась от конструкции теневого регистра и отдавала предпочтение архитектуре K6 с конструкцией прямой связи отдельных георадаров. Нравиться Феном, он имеет три файла регистров int и два файла регистров SSE, которые находятся в файле физического регистра, напрямую связанном с GPR. Однако он масштабируется до одного целого числа + одной плавающей запятой на Бульдозер. Подобно ранним разработкам AMD, большинство производителей x86, таких как Cyrix, VIA, DM&P и SIS, также использовали тот же механизм, что приводило к отсутствию целочисленной производительности без переименования регистров для их упорядоченных процессоров. Таким компаниям, как Cyrix и AMD, пришлось увеличить размер кеш-памяти в надежде уменьшить узкое место. Целочисленная операция AMD SSE работает иначе, чем Core 2 и Pentium 4; он использует свой отдельный целочисленный регистр переименования для загрузки значения непосредственно перед этапом декодирования. Хотя теоретически для этого потребуется только более короткий конвейер, чем реализация SSE Intel, но в целом стоимость прогнозирования ветвлений намного выше и выше, чем у Intel, и для выполнения инструкции SSE потребуется не менее двух циклов независимо от в ширину инструкции, поскольку ранние реализации AMD не могли выполнять одновременно FP и Int в наборе инструкций SSE, как это делала реализация Intel.

В отличие от Альфа, Sparc, и MIPS это позволяет только одному регистровому файлу загружать / извлекать один операнд за раз; для достижения супермасштабирования потребуется несколько файлов регистров. В РУКА процессор, с другой стороны, не интегрирует несколько файлов регистров для загрузки / выборки инструкций. ARM GPR не имеют специального назначения для набора команд (ARM ISA не требует накопителя, индекса и стека / базовых точек. Регистры не имеют накопителя, а базовая / стековая точка может использоваться только в режиме большого пальца). Любые GPR могут распространять и хранить несколько инструкций независимо с меньшим размером кода, который достаточно мал, чтобы уместиться в одном регистре, а его архитектурный регистр действует как таблица и используется для всех декодеров / инструкций с простым переключением банков между декодерами. Основное различие между ARM и другими конструкциями заключается в том, что ARM позволяет работать с одним и тем же регистром общего назначения с быстрым переключением банков без необходимости в дополнительном файле регистра в суперскалярном режиме. Несмотря на то, что x86 использует тот же механизм с ARM, что его GPR могут хранить любые данные по отдельности, x86 столкнется с зависимостью данных, если хранится более трех несвязанных инструкций, поскольку его GPR на файл слишком малы (восемь в 32-битном режиме и 16 в 64-битный, по сравнению с ARM 13 в 32-битном и 31 в 64-битном) для данных, и невозможно иметь суперскаляр без нескольких файлов регистров для подачи в его декодер (код x86 большой и сложный по сравнению с ARM). Потому что большинство интерфейсов x86 стали намного больше и потребляют больше энергии, чем процессор ARM, чтобы быть конкурентоспособными (пример: Pentium M & Core 2 Duo, Bay Trail). Некоторые сторонние процессоры, эквивалентные x86, даже перестали конкурировать с ARM из-за отсутствия специальной архитектуры регистрового файла. В частности, для AMD, Cyrix и VIA, которые не могут обеспечить приемлемую производительность без переименования регистров и выполнения вне очереди, в результате чего только Intel Atom остается единственным исправным ядром процессора x86 в мобильной конкуренции. Так было до тех пор, пока процессор Nehalem x86 не объединил свои целочисленные регистры и регистры с плавающей запятой в один файл, а также не представил большую таблицу физических регистров и расширенную таблицу распределителя во внешнем интерфейсе перед переименованием во внутреннем ядре, вышедшем из строя. .

Регистрация переименования

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

Зарегистрируйте окна

В SPARC ISA определяет зарегистрировать окна, в котором 5-битные архитектурные имена регистров фактически указывают на окно гораздо большего файла регистров с сотнями записей. Реализация многопортовых файлов регистров с сотнями записей требует большой площади. При перемещении окно регистров сдвигается на 16 регистров, так что каждое имя архитектурного регистра может ссылаться только на небольшое количество регистров в большем массиве, например архитектурный регистр r20 может ссылаться только на физические регистры # 20, # 36, # 52, # 68, # 84, # 100, # 116, если в физическом файле всего семь окон.

Для экономии места в некоторых реализациях SPARC реализован регистровый файл с 32 записями, в котором каждая ячейка имеет семь «битов». Только один из них доступен для чтения и записи через внешние порты, но содержимое битов можно менять. Ротация выполняет за один цикл движение окна регистра. Поскольку большинство проводов, выполняющих перемещение состояния, являются локальными, огромная полоса пропускания возможна при небольшой мощности.

Эта же техника используется в R10000 Файл отображения переименования регистров, в котором хранится 6-битный номер виртуального регистра для каждого из физических регистров. В файле переименования состояние переименования ставится контрольной точкой всякий раз, когда выполняется переход, так что, когда обнаруживается, что ветвление неверно предсказано, старое состояние переименования может быть восстановлено за один цикл. (Видеть Регистрация переименования.)

Смотрите также

Рекомендации

внешняя ссылка