-
Notifications
You must be signed in to change notification settings - Fork 0
/
ata-geom.html
398 lines (368 loc) · 36.6 KB
/
ata-geom.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Разбиралки с геометрией в ATA/IDE</title>
</head>
<body>
<p>Пред-замечание от 2024 года: всё это описание стало в
основном иметь чисто исторический характер. Подавляющее большинство
современных подходов основано на 1) интерфейсах с линейным адресом блока
(LBA) — таких, как NVMe; 2) современных драйверах файловых систем; 3)
загрузкой через EFI (UEFI), где обязательно использование таблицы
разделов GPT с линейными адресами. Поэтому 99.9+% современных
пользователей не увидят все перечисленные проблемы. Для остальных же
остаётся данное описание.
</p>
<p>ATA (IDE) — технология с историей и со странностями. Путь ее развития
весьма извилистый. Этим объясняется множество проблем и заморочек, с
которыми приходится на ней сталкиваться. Некоторые из них перешли и на
применение SCSI дисков — например, проблемы с partition tables.</p>
<p>Диск — это непрерывный массив физических блоков(*1).
Непрерывность этого массива
принципиальна — нарушения сейчас допускаются только для "плохих" (нечитаемых
и иным образом испорченных) физических блоков, и то эта особенность
постепенно уходит в прошлое — плохие блоки там, где должны быть критически
важные структуры, и раньше не допускались, а сейчас (по крайней мере для ATA
дисков) сообщение о плохом блоке означает исчерпание внутреннего резерва
запасных блоков и поэтому невозможность дальнейшей работы с этим диском.
В то же время, адресовать блоки в этом непрерывном массиве можно двумя
путями. Первый путь — адресация по прямому номеру блока; блоки нумеруются
от нуля до максимально возможного номера, без разрывов в этой
последовательности. Этот путь был изначальным для SCSI и воспроизводится
в более новых интерфейсах типа NVMe, а также используется в любом
сетевом доступе типа iSCSI, но не для IDE.
Второй — изначальный для IDE/ATA, но не для SCSI — использование трех
чисел, которые называются номером цилиндра, головки (дорожки) и сектора.
Весь наш рассказ посвящен проблемам, которые исходят от этого пути.</p>
<p>((*1) В современных интерфейсах типа NVMe допускается разделение
одного диска средствами его самого на несколько областей, в каждой из
которых своя непрерывная адресация. В это мы сейчас не влазим.)</p>
<p>Понятие номера головки и номера дорожки обычно смешиваются. В дальнейшем
я буду стараться останавливаться на номере головки, как на более точном,
потому что номер дорожки имеет интерпретацию также не в пределах цилиндра,
а по всему диску.</p>
<p>Адресация CHS — то есть, цилиндр/головка/сектор (cylinder/head/sector) -
напрямую отражает технологию, принятую в (ранних) магнитных дисках.
Опишем её подробнее.<br>
Диск — множество пластин (одна или больше), на которых могут
использоваться одна или две стороны. Номер поверхности — номер головки
(еще один синоним к имеющимся двум, но использовать его мы не будем).
Поверхность разбита на кольцевые дорожки. Группа дорожек на равном
расстоянии от центра — цилиндр. На всех дорожках одинаковое количество
одинаковых блоков. Угловая скорость чтения/записи блока — одинакова для
всех цилиндров; линейная — растет по мере удаления от центра. Нехитрая
премудрость этой адресации здесь заканчивается. Интерфейс ATA вплоть до
ATA-6 (2002 г.) требовал поддержку этого режима, которая используется
при начальной загрузке системы и других операциях; номер цилиндра,
головки и сектора пишутся прямо в порты адресов ATA контроллера (и
передаются напрямую диску), при этом диапазоны допустимых значений
таковы: C — 0..65535, H — 0..15, S — 1..255. (По принятому стилю,
нумерация секторов начинается с 1, а не с 0.) Практически, и все
современные диски (в пределах Parallel ATA как минимум) поддерживают CHS
адресацию, сохраняя совместимость с древними стандартами.</p>
<p>С ростом технологий, подобная схема стала слишком примитивной. Росли
плотности как по количеству дорожек на поверхность, так и по количеству
секторов. С какого-то момента контроллер диска стал производить ретрансляцию
переданной ему геометрии в реальную дисковую, которая потеряла описанную
примитивность — количество секторов на дорожку могло меняться, плотность
записи могла меняться, и так далее. Используемая непосредственно на шине
и рапортуемая для этих целей диском геометрия стала фиктивной, от которой
требовалось соответствие желаниям и ограничениям интерфейса и софта, но не
реальной обстановки на диске.</p>
<p>Размер блока (сектора) аж до 2010 года оставался равным 512 байт. В
2010 году производители выдвинули инициативу Big Sector, согласно
которой сначала появляются диски с физическим размером сектора 4KB, но
512 байт на шине; через несколько лет обещали 4KB на шине.
Детальное описание этого
изменения см. в конце статьи. Заметим, что реально это изменение стало
возможным только когда из-за размеров дисков перестала работать MS-DOS
partition table — то есть на границах 1TB и 2TB.
<br>
Реально это изменение состоялось только для небольшого числа серверных
дисков. Для остальных остался видимый для шины логический размер блока
512 байт, но рапортуемый через запрос свойств - 4096 байт - и то не для
всех дисков. Для SSD, к тому же, дополнительная логика, требующая
группировки операций размером блока SSD (обычно не менее 128 KiB),
перекрывает данную группировку... в результате все проблемы группировки
операций возложили на ОС и на кэш диска.</p>
<p>Как сказано выше, ограничение шины — 65536*16*255. В то же время,
BIOS (интерфейсами d-1302, d-1303 — см. Ralf Brownʼs Interrupt List)
ввела другие ограничения: 10 бит на цилиндр, 8 на головку и 6 на сектор,
что дало предельную геометрию 1024*256*63. Эти же ограничения были
повторены в структуре записи раздела в MSDOS partition table.
Одновременно с C/H/S адресом блока, в таблицу писались
абсолютные (линейные) адреса (номер начального блока и длина раздела),
но для доступа средствами MS-DOS они не использовались —
геометрия одна, и проще было применять CHS номера, чем пересчитывать
абсолютные номера блоков. Драйверам файловых систем все равно приходилось
делать такой пересчет, потому что в файловых системах нумерация была
абсолютной; но загрузчики были лишены общения с абсолютными номерами
блоков.</p>
<p>Шинную геометрию можно узнать (если диск поддерживает ATA-5 или более
ранний стандарт) у диска командой Identify Device (код 0xEC). Эта команда
появилась не сразу (но очень рано — во времена приблизительно 60MB дисков);
до этого можно было только задавать геометрию руками в настройках BIOS.
С ее появлением в BIOS появилась возможность сделать автодетект диска -
диску отдавалась команда Identify Device и геометрия бралась из ответа
диска. Значительно позднее стали применять автоидентификацию при каждой
загрузке, вместо ручного прогона при изменении конфигурации.</p>
<p>Идиллия с геометрическим доступом кончилась по достижению барьера в
1024*16*63 блока, то есть 504 MiB (528 MB; производители дисков обычно
пишут объёмы в десятичных мегабайтах, а не двоичных).
Ограничение шины — 65536*16*255 -
почти 2^28 блоков. (С учетом описанного ниже предела в 63 сектора -
почти 2^26 блоков.) Ограничение BIOS и MSDOS — 1024*256*63 — почти 2^24
блока. Зато общее подмножество — только около 2^19 блоков, общая
геометрия — 1024*16*63, что дает 504 "длинных" мегабайта (MiB), или 528
"коротких" (MB). Вместо переделки шин и таблиц, было принято решение по
использованию ретрансляции на произвольном участке между MSDOS (и
Windows, к тому времени) и шиной ATA — это решение откладывало переделку
таблиц как минимум до достижения объема в 32 раза больше, чем 504M.
Два пути, которыми это решалось — поддержка BIOS режимов, названных
LARGE и LBA, и специальные драйвера, загружавшиеся на этапе чтения
config.sys, сделанные из OnTrack Disk Manager производителями своих
дисков (или OnTrack Disk Manager непосредственно). </p>
<p>(Во всём этом для меня самое непонятное - откуда в случае BIOS
взялись именно такие размеры, кто и как их рассчитал. Даже если две
поверхности у одного "блина" (физического диска — носителя информации),
то я не могу себе представить 128 таких блинов в одном устройстве. Если
бы предположили, например, пределы CHS соответственно 1024*64*256, это
было бы значительно логичнее и сложные трансляции (см. ниже) пришлось бы
включать при размере в 4 раза больше.)</p>
<p>Пример решения с трансляциями в BIOS для Quantum Fireball 1.2G.
Геометрия диска, видимая на шине — 2484*16*63, что дает 1.28 "коротких"
G. BIOS, видя количество цилиндров больше чем 1024, включал режимы
ретрансляции: если установлен режим LARGE, то геометрия показывалась
1242*32*63; если LBA — то 621*64*63.
Только вариант, выбранный для LBA трансляции,
был пригоден для использования всего диска в MS-DOS и других системах,
использующих BIOS в качестве драйвера. Группа прерываний BIOS "int 13h"
использовалась в любом случае в DOS, но при установке такого режима,
BIOS производил трансляцию геометрии, полученной в вызовах группы INT
13h, в ту, которая сообщалась диском, или же в абсолютный номер блока,
если такое поддерживалось диском (см. ниже).
</p>
<p>Начиная с дисков размером около 4GB, установилась практика транслировать при
выборе LBA трансляции в фиктивную геометрию с 255 головками и 63
секторами. Режим в 256 головок решили не применять из-за ограничений
используемого софта (много таких программ, которые воспринимали 0 в поле
как 0, а не как положенное 256). Эта трансляция используется и поныне,
хотя в 1024 цилиндра новые диски давно уже не вмещаются даже при ней.</p>
<p>(Точный механизм вычисления так называемой LBA-геометрии, если
точнее — LBA-assist геометрии, следующий. Полное количество блоков
диска, полученное из ответа команды Identify Device, делилось на
1024*63. (Поправка: на mossywell написано, что деление на 1024 было с
округлением вверх, то есть не x/1024, а 1+(x-1)/1024. Это нельзя свести
к такому же округлению при делении на 1024*63.) Если частное было 255
или больше, количество головок в геометрии устанавливалось 255. Если
меньше, происходило округление вверх до ближайшего числа из следующего
набора: 16, 32, 64, 128, 255. Разделив количество блоков диска на 63 и
на подобранное количество головок и округлив ответ вниз до целого,
получали количество цилиндров в итоговой LBA-assist геометрии. Если оно
было более 1024, часть диска уже не могла адресоваться через старые
(геометрические) вызовы BIOS и требовала линейной адресации.)
</p>
<p>Отметим, что от декларирования шинной геометрии с количеством
секторов больше 63 отказались (вплоть до перехода 32G границы — см.
ниже) из-за желания получить все ту же совместимость с BIOS и MSDOS даже
при выборе режима трансляции NORMAL (то есть без трансляции вообще).
Решение вполне обоснованное — до того, как загрузчик сможет загрузить
драйвер, умеющий это обходить, потребуется загрузить очень много другого
и наверняка с секторов с абсолютными номерами больше чем 63.</p>
<p>Одновременно с введением ретрансляции средствами BIOS или специальных
драйверов было начато предоставлять возможность отказаться от CHS адресации
вообще для тех, кто на это способен. В частности, для многих unix систем,
не использующих MSDOS partitioning вообще, это было избавлением от
бессмысленного промежуточного уровня. Аналогично начала работать и Windows
NT (а позднее — Windows 95OSR2, 98 и ME, но только в protected режиме).
Это состояло из двух интерфейсов:<ul>
<li>Для шины ATA — появилась опционально (начиная с ATA-2) и стала
обязательна (начиная с ATA-4) поддержка LBA; признаком адреса в LBA является
единица на линии DH[6]. Начиная с ATA-6 (уточнить), поддержка
геометрической адресации вообще была выкинута из стандарта; но так как
обычно диски поддерживают все версии начиная с ATA-2, они имеют какую-то
эмуляцию данной возможности.</li>
<li>Для BIOS — появились вызовы группы d-134X (INT 13h при AH=0x4X),
использующие LBA номер блока вместо CHS. Эта группа вызовов, называемая
IBM/MS INT13 extensions, она же EDD1, поддерживается почти всеми
современными BIOSʼами (ориентировочно, последние не поддерживавшие EDD1
закончились в 2001 году).
</li>
</ul>
<p>Здесь LBA адресация (не путать с LBA трансляцией!) означает Linear
Block Access — доступ к блокам диска по их линейному (абсолютному)
номеру, а не по фиктивной комбинации C/H/S. В современных BIOSʼах, она
может использоваться и для LBA трансляции.</p>
<p>В ATA-6 появилась поддержка 48-битной LBA адресации, кроме прежней
28-битной. Она используется для дисков объемом более 128G. (Для
сравнения, BIOS вызовы группы d-134X изначально поддерживают 64 бита
номера блока.)</p>
<p>Барьер 1024 цилиндров — барьер ограничений BIOS и MSDOS — не
преодолевается старыми средствами BIOS; для его преодоления нужны как
минимум функции группы d-134X (по номенклатуре Ральфа Брауна). Для BIOSʼов,
не умеющих ретрансляцию геометрии, он наступил на границе 504(528)MB;
диски объемом больше чем этот граничный нельзя использовать в полном объеме
для MSDOS и наследников, если BIOS не поддерживает ретрансляцию геометрии
или поддерживает ее иначе, чем тот, на котором диск был форматирован на
логическом уровне (записана partition table). Если BIOS поддерживает
стандартную LBA ретрансляцию, то этот барьер наступает при достижении диском
размера 8G.</p>
<p>Барьер 8G — барьер 1024 цилиндров при выборе LBA ретрансляции в BIOSʼе.
Предельный адресуемый размер диска средствами старых вызовов BIOS и при
стандартной интерпретации MSDOS partition table — 1024*255*63 блока,
или 8.422 GB.</p>
<p>Преодоление барьера в 1024 цилиндра потребовало ряда специальных мер.
Так как BIOS не дает использовать CHS адресацию для цилиндров более
1024, ОС вынуждены использовать LBA адресацию — через вызовы d-134X или
через свой драйвер — или же производить ретрансляцию в шинную геометрию
своими силами, но тоже через свой драйвер, потому что BIOS этого не
позволяет. (Но второй вариант реально не использовался, все ведущие
производители заложились на доступ по линейному адресу.)
Загрузочные разделы, при использовании старого загрузчика в
MBR, не могут выходить за границы первых 1024 цилиндров. В MSDOS
partition table потребовались специальные меры для обозначения разделов
за пределами первых 1024 цилиндров, потому что стандартные обозначения
непригодны. Для этого были взяты поля записей, которые ранее всегда
писались, но не использовались MSDOS и потомками: абсолютный адрес
начала раздела и абсолютная длина размера; оба — в блоках диска и 32
бита (то есть перестанут удовлетворять по достижению объема диска в
2TB). В старые поля (C,H,S) стали писаться фиктивные параметры: или
правильный C/H/S адрес начала (конца), но с цилиндром обрезанным выше
младших 10 битов, или специальное значение 1023/head_max/sector_max
(чаще всего 1023/254/63). Чтобы избежать конфликта со старыми правилами
понимания partition table, были введены новые типы разделов:<ul>
<li>0x0c — Win95 FAT32 (LBA)</li>
<li>0x0e — Win95 FAT16 (LBA)</li>
<li>0x0f — Win95 Extended (LBA)</li>
</ul>
- для которых интерпретируются только абсолютные адрес начала и длина.
Для систем, иных, чем DOS/Win9x/WinME, проблема опознания границ
раздела была изначально решена в пользу абсолютных номеров (это
относится к WinNT, Linux, FreeBSD и так далее), поэтому для их разделов
новый тип не требовался.</p>
<p>Барьер 32G (для некоторых дисков он был при немного меньшем объеме) -
барьер в 65536 цилиндров для шинной геометрии. Как сказано выше, для
шинной геометрии пределом считалось — 16 головок и 63 сектора (а не 256
и не 255, потому что вмешивается совместимость с BIOS и загрузчиками).
Для дисков больше чем 32G потребовалось рапортовать более чем 65536
цилиндров, например, для IBM IC35L040AVER07 (40G) это 79780*16*63, при
том, что LBA геометрия в этом случае — 5005*255*63. Превышение границы в
65536 цилиндров дало два эффекта:
<ul>
<li>Драйвера, не знающие про это переполнение, читали количество цилиндров,
равное остатку от деления на 65536 реального количества. Для описанного
IC35L040AVER07 устаревшее ядро Linux (ряда 2.2) нашло только 14244 цилиндра и
соответственно рассказало про 7G винт;</li>
<li>Множество BIOSʼов, основанных на коде Award 4.51, висли при попытке
детекта такого диска. Производители дисков вынуждены были добавить
специальный режим установки перемычек, при котором диск ограничивал
видимую и пригодную к использованию шинную геометрию 65536 цилиндрами.
Почти всегда восстановление нормальной работоспособности решалось
апдейтом BIOSʼа.</li>
<li>BIOSʼы группы Award 6.00 во всех трансляциях кроме LBA рапортовали
255 секторов на дорожку в отдаваемой BIOSʼом геометрии (напомню, это не
влезало в пределы интерфейса BIOS и, следовательно, урезалось до
значения 63), что дало следствием неработу геометрических вызовов для
области до 32G. Например: для диска SAMSUNG SP1203N при выборе NORMAL
такой BIOS показывает 57473*16*255, при LARGE — 3831*240*255. Пример
такого следствия — FreeBSD4 не загружалась в первых 32G, но загружалась
за этой границей. Award не проявил стремления лечить это, поэтому при
использовании загрузчиков и ОС предпочитающих геометрическую адресацию
(MS-DOS, Windows 9x в DOS-режиме, FreeBSD до 5.4) установка LBA
трансляции обязательна.</li>
</ul>
<p>Немного о других границах (в порядке убывания) и проблемах от их
пересечения.
<ul>
<li>2TB — граница 32-разрядного номера блока. По достижении этой границы
таблицы разделов MS-DOS становятся окончательно непригодны. Как
альтернатива, Intel разработал GPT (GUID Partition Table) в рамках своей
спецификации EFI (Extensible Firmware Interface), в которой размеры и
адреса начала разделов описываются 64-битными числами. Одновременно это
стало (2010-2011) размером, за которым производители дисков стали
переходить на Advanced Format, то есть физические блоки в 4GB.</li>
<li>1TB — граница 32-разрядного номера блока в понимании как числа со знаком;
по достижении этой границы следует ожидать всплытия большого числа багов
в разнообразном программном обеспечении.</li>
<li>128GB (или 137GB, считая миллиардами байт) — граница доступности через
шинные интерфейсы ATA — геометрический и LBA28. Подробно она описывалась
выше, но есть и ряд других эффектов. Например, в Windows 2000 до SP5 и
Windows XP до SP2 лишние биты обрезались, в результате чего можно было
доступом за пределы области нижних 128G получить затирание начальных областей
диска.</li>
<li>4GB — граница непригодности "классической" ECHS трансляции, которая
порождала геометрию с 256 головками. Для исправления этого был введён
т.наз. "revised ECHS", который пересчитывал геометрию в 15-головочный вариант
и затем удваивал количество головок до тех пор пока оно не достигало 240
или количество цилиндров не становилось не более 1024.</li>
<li>2GB — вызывало проблемы в некоторых BIOS из-за хранения количества
цилиндров в выбранной геометрии в 8 битах (вместо необходимых 10).</li>
</ul>
<p>С 2010-2011 года появилась проблема в виде увеличения фактического
размера физического сектора на диске; производители договорились на
хранение секторами по 4KB. (Об этом говорилось также в начале статьи,
тут описывается ещё набор последствий.) При этом (на начало 2012) размер
того, что называется "блоком" на шине, осталось, у большинства
производителей, байт (фактически, отраслевое соглашение сошлось на том,
что логический размер блока 4KB допускается только для "серверных"
дисков). Вследствие этого,
запись одного такого блока шины приводит к тому, что диск должен
прочитать сектор с диска, изменить его часть, и записать заново.
Одиночные операции с блоками такого размера становятся существенно
дороже и медленнее. Операционным системам настоятельно рекомендуется
узнавать фактический размер блока на диске и просить операции
чтения/записи размером не менее физического блока и с соответствующим
выравниванием. В интерфейсах (ATA и SCSI) предусмотрен метод получить
эти данные — размер физического блока и граница выравнивания.</p>
<p>Начиная с этого момента, меняются требования к разбиению диска на
разделы. Если до Advanced Format нормальным было то, что раздел с
файловой системой начинается с блока 63 (потому что для совместимости с
MS-DOS начало соответствует 0:1:1), то по новому требованию эта граница
должна быть кратна 8 512-байтным блокам. Практически основные ОС
устанавливают выравнивание на границу мегабайта (2048 таких блоков). Для
Windows, например, такая разметка стала обычной начиная с версии 7.
Некоторые производители (например, Western Digital) предусматривают
режим совместимости (устанавливаемый переключателем на диске) для случая
старой ОС с разделом от блока 63 (тогда физическому блоку соответствуют
не 0-7,8-15,...,56-63,64-71..., а 0-6,7-14,...,55-62,63-70...)</p>
<p>Что у нас на 2024 год? Фактически, все описанные проблемы ушли
(повторю с суммированием то, что упомянуто в начале статьи):<ul>
<li>Все современное "железо" включая NVMe и SATA диски, все виды
сетевого доступа используют исключительно линейную адресацию. Даже если
какие-то из них поддерживают CHS, использование этого софтом можно
считать нулевым.</li>
<li>Современные ОС уровня десктоп/лаптоп/сервер для x86 практически
однозначно 64-битные и используют (U)EFI загрузку и GPT таблицы
разбиения, в которых линейные 64-битные адреса.
</ul>
<p>Итого, все геометрические особенности ушли в историю. Возможно ещё
ожидать каких-то последствий на старом оборудовании или не на x86, но
мне крайне слабо верится.</p>
<br>
<hr>
<br>
<p>Ссылки по теме:</p>
<ul>
<li><a href="http://www.mossywell.com/boot-sequence/">Хороший "букварь"
на английском.</a></li>
<li><a href="http://www.wasm.ru/article.php?article=1012001">Статья с
похожим содержанием (остановилась на 8GB), на русском</a>.</li>
<li><a href="https://thestarman.narod.ru/index.html">Описание от
startmanʼа (зеркало сохранения) особенностей загрузки DOS и
Windows. Есть и аналогичная статья про проблемы геометрии.</a></li>
</ul>
<br>
<hr>
<p>(C) 2002-2005,2012,2015,2024 Valentin Nechayev.
License:
<a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA
4.0.</a>
<br>
Разрешается полное или частичное копирование, цитирование.
При полном или частичном копировании ссылка на оригинал
обязательна.</p>
</body>
</html>
<!-- vim:tw=72:et:
-->