<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Форум программистов и сисадминов Киберфорум - Блоги - R71MT</title>
		<link>https://www.cyberforum.ru/blogs/491967/</link>
		<description>КиберФорум - форум программистов, системных администраторов, администраторов баз данных, компьютерный форум, форум по электронике и бытовой технике, обсуждение софта. Бесплатная помощь в решении задач по программированию и наукам, решение проблем с компьютером, операционными системам</description>
		<language>ru</language>
		<lastBuildDate>Thu, 03 Sep 2026 22:56:23 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>60</ttl>
		<image>
			<url>https://www.cyberforum.ru//cyberstatic.net/images/misc/rss.jpg</url>
			<title>Форум программистов и сисадминов Киберфорум - Блоги - R71MT</title>
			<link>https://www.cyberforum.ru/blogs/491967/</link>
		</image>
		<item>
			<title>Устройство системной памяти</title>
			<link>https://www.cyberforum.ru/blogs/491967/5241.html</link>
			<pubDate>Wed, 25 Apr 2018 19:21:49 GMT</pubDate>
			<description>Подсистема памяти - наиболее мутная и сложная часть архитектуры,  
и на мой взгляд программирование...</description>
			<content:encoded><![CDATA[<div>Подсистема памяти - наиболее мутная и сложная часть архитектуры, <br />
и на мой взгляд программирование нужно начинать именно с неё.<br />
<a href="https://www.cyberforum.ru/low-level/thread2107770.html"><b>Устройство памяти</b></a></div>

]]></content:encoded>
			<dc:creator>R71MT</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/491967/5241.html</guid>
		</item>
		<item>
			<title>Программная модель BIOS</title>
			<link>https://www.cyberforum.ru/blogs/491967/5240.html</link>
			<pubDate>Wed, 25 Apr 2018 19:13:32 GMT</pubDate>
			<description>Как найти SPI-Flash среди прочего/системного железа, и отыскав, ..что можно с ней сделать?...</description>
			<content:encoded><![CDATA[<div>Как найти SPI-Flash среди прочего/системного железа, и отыскав, ..что можно с ней сделать?<br />
Рассмотрим методы поиска и программирования м/схем BIOS. Кроликом послужит моя плата <b>ASRock 945GCM-S</b> <i>(ICH7, flash MXIC-25L4005, 512Kb, AMI).</i> Для начала, небольшой обзор шины PCI Express..<br />
-------------------------------------<br />
<b><br />
PCI-E против Legacy-PCI</b><br />
<br />
Традиционно, в архитектуре компьютера главной системной артерией была параллельная шина PCI. К ней, через мосты подключались уже вторичные шины. Такой подход снижал производительность, т.к. шина была общей и всем устройствам приходилось по-братски делить её пропускную способность.<br />
<br />
Но с тех-пор утекло уже много воды и на смену параллельной PCI, пришла последовательная PCI-Express <i>(PCI-E, PCIe кому-как нравится)</i> изменив архитектуру системы до неузнаваемости. Вспомним, какие вообще версии PCI-шины существовали и в каком направлении развивался их прогресс: <br />
<div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="961977815"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="961977815" style="height: 174px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
</pre></td><td class="de1"><pre class="de1">Стандарт &nbsp; &nbsp; | Частота &nbsp;| Ширина &nbsp;| Скорость &nbsp;| &nbsp; Тип &nbsp; &nbsp; | ConfigSpace
-------------|----------|---------|-----------|-----------|------------
PCI &nbsp; <span class="br0">&#40;</span>v1<span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp;<span class="nu0">33</span> MHz &nbsp; &nbsp; <span class="nu0">32</span>-бит &nbsp; &nbsp; <span class="nu0">133</span> Мб/с &nbsp; Parallel &nbsp; <span class="nu0">256</span>-байт
PCI &nbsp; <span class="br0">&#40;</span>v2<span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp;<span class="nu0">66</span> MHz &nbsp; &nbsp; <span class="nu0">32</span>-бит &nbsp; &nbsp; <span class="nu0">266</span> Мб/с &nbsp; Parallel &nbsp; <span class="nu0">256</span>-байт
PCI64 <span class="br0">&#40;</span>v2.2<span class="br0">&#41;</span> &nbsp; &nbsp;<span class="nu0">33</span> MHz &nbsp; &nbsp; <span class="nu0">64</span>-бит &nbsp; &nbsp; <span class="nu0">266</span> Мб/с &nbsp; Parallel &nbsp; <span class="nu0">256</span>-байт
PCI64 <span class="br0">&#40;</span>v2.3<span class="br0">&#41;</span> &nbsp; &nbsp;<span class="nu0">66</span> MHz &nbsp; &nbsp; <span class="nu0">64</span>-бит &nbsp; &nbsp; <span class="nu0">533</span> Мб/с &nbsp; Parallel &nbsp; <span class="nu0">256</span>-байт
PCI-X <span class="br0">&#40;</span>v1<span class="br0">&#41;</span> &nbsp; &nbsp; <span class="nu0">133</span> MHz &nbsp; &nbsp; <span class="nu0">64</span>-бит &nbsp; &nbsp;<span class="nu0">1033</span> Мб/с &nbsp; Parallel &nbsp; <span class="nu0">4096</span>-байт
PCI-X <span class="br0">&#40;</span>v2<span class="br0">&#41;</span> &nbsp; &nbsp; <span class="nu0">266</span>-<span class="nu0">533</span> &nbsp; &nbsp; <span class="nu0">64</span>-бит &nbsp; &nbsp;<span class="nu0">4096</span> Мб/с &nbsp; Parallel &nbsp; <span class="nu0">4096</span>-байт
PCI-Express &nbsp; &nbsp;<span class="nu0">2.5</span>-GHz &nbsp; &nbsp; 01..<span class="nu0">32</span> &nbsp; <span class="nu0">15872</span> Мб/с &nbsp; Serial &nbsp; &nbsp; <span class="nu0">4096</span>-байт</pre></td></tr></table></div></td></tr></tbody></table></div>До явления PCIe народу, ставки делались на частоту и ширину-шины, это давало ожидаемый прирост пропускной способности. Нужно сказать, что 4 Гбайт/с это не плохой результат - отдадим должное разработчикам.. Потом пришла PCI-Express и одним махом отправила все труды на смарку. Шина стала последовательной, и сразу дала прирост х4 - 15 Гигов/сек. Причём она стала параллельно-последовательной, с возможностью масштабирования её ширины в диапазоне 1-32 бит <i>(например PCIE x1/4/16)</i>, и это сразу в обоих направлениях. По сути это интеловский клон шины HyperTransport от AMD <i>(всю жизнь вороют друг-у-дружки).</i><br />
<br />
Но вернёмся к топологии материнских плат на основе PCI-Express..<br />
Главным её новшеством является соединение устройств по принципу <b>Point-to-Point</b> <i>(точка-точка)</i>. Эта схема предоставляет отдельный канал для передачи данных, каждому из устройств на шине. Делается это посредством коммутатора <b>Switch</b>. Каждое устройство является конечной точкой, а свитч используют для перенаправления данных от устройства к устройству, минуя мост. К рут-комплексу может подключаться несколько свитчей, каждый из которых может иметь свой мост вторичных шин <b>Bridge</b>.<br />
<br />
На рисунке ниже - схема PCI-Express, представляющая собой <b>Root-Complex</b> и <b>Switch</b>. К свитчу присоединяются уже сами устройства. Напомню, что каждое из них представляет собой конечную точку &quot;Endpoint&quot;. Устройства PCIе можно подключать непосредственно к Root-комплексу - это могут быть всевозможные мосты типа PCIE-to-PCI Bridge, или-же точка в виде графической карты PCI-Express.<br />
<br />
<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4792&amp;d=1524681565" rel="Lightbox" id="attachment4792" ><img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4792&amp;thumb=1&amp;d=1524681565" class="thumbnail" border="0" alt="Нажмите на изображение для увеличения
Название: pcie.png
Просмотров: 1641
Размер:	9.7 Кб
ID:	4792" style="margin: 5px" /></a><br />
<br />
Организацию вашей PCIE-системы может показать софт для сбора инфы о машине:<br />
<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Отчёт PC-Wizard моей системы (i945G chipset)</div>
				   <div class="spoiler-body">
					   <br />
<div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="8416697"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="8416697" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">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
</pre></td><td class="de1"><pre class="de1">&nbsp; &gt; Bus PCI-Express &nbsp; : Да &nbsp;<span class="br0">&#40;</span>max. x16<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; Number of PEG &nbsp; : <span class="nu0">2</span>
&nbsp;
&nbsp; &nbsp; &gt;&gt; Bus PCI-Express
&nbsp; &nbsp; &nbsp; Устройство &nbsp; &nbsp; &nbsp;: 82945G/PL PCIe Root Port
&nbsp; &nbsp; &nbsp; Link Width &nbsp; &nbsp; &nbsp;: x16
&nbsp; &nbsp; &nbsp; Link Speed &nbsp; &nbsp; &nbsp;: <span class="nu0">2.5</span> Гб/s
&nbsp; &nbsp; &nbsp; Port &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: <span class="nu0">2</span>
&nbsp;
&nbsp; &nbsp; &gt;&gt; Bus PCI-Express
&nbsp; &nbsp; &nbsp; Устройство &nbsp; &nbsp; &nbsp;: Nvidia Corp
&nbsp; &nbsp; &nbsp; Link Width &nbsp; &nbsp; &nbsp;: x16
&nbsp; &nbsp; &nbsp; Link Speed &nbsp; &nbsp; &nbsp;: <span class="nu0">2.5</span> Гб/s
&nbsp; &nbsp; &nbsp; Port &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: <span class="nu0">0</span>
&nbsp;
&nbsp; &nbsp; &gt;&gt; Bus PCI-Express
&nbsp; &nbsp; &nbsp; Устройство &nbsp; &nbsp; &nbsp;: 82801G <span class="br0">&#40;</span>ICH7 Family<span class="br0">&#41;</span> PCIe Root Port
&nbsp; &nbsp; &nbsp; Link Width &nbsp; &nbsp; &nbsp;: x1
&nbsp; &nbsp; &nbsp; Link Speed &nbsp; &nbsp; &nbsp;: <span class="nu0">2.5</span> Гб/s
&nbsp; &nbsp; &nbsp; Port &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: <span class="nu0">1</span>
&nbsp;
&nbsp; &nbsp; &gt;&gt; Bus PCI-Express
&nbsp; &nbsp; &nbsp; Устройство &nbsp; &nbsp; &nbsp;: 82801G <span class="br0">&#40;</span>ICH7 Family<span class="br0">&#41;</span> PCIe Root Port
&nbsp; &nbsp; &nbsp; Link Width &nbsp; &nbsp; &nbsp;: x1
&nbsp; &nbsp; &nbsp; Link Speed &nbsp; &nbsp; &nbsp;: <span class="nu0">2.5</span> Гб/s
&nbsp; &nbsp; &nbsp; Port &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: <span class="nu0">2</span></pre></td></tr></table></div></td></tr></tbody></table></div>
				   </div>
			   </div><br />
<br />
Таким образом, в современной архитектуре корневой <b>Root-Complex</b> является чуть-ли не центром вселенной. Он встроен в север и имеет свой блок регистров RCRB. Доступ к этим регистрам открывает его базовый адрес в памяти <b>RCBA - Root Complex Base Address</b>. Буквально все устройства чипсета адресуются через RCBA используя его в качестве базы.<br />
<br />
<b>Путешествие к центру вселенной</b><br />
<br />
Инструменты:<ol style="list-style-type: decimal"><li>Даташит на ICH чипсета (для новых PCH);</li>
<li>Крутая утилита для просмотра/редактирования памяти &quot;Read &amp; Write Utility&quot;;</li>
<li>Компилятор ассемблера &quot;fasm&quot; (или любой, с окончанием на *asm);</li>
<li>Виндовый НЕХ-калькулятор.</li>
</ol><br />
Как найти RCBA программным способом? Да очень просто! Достаточно скачать даташит на свой чипсет <i>(у меня ICH7)</i> и запустить в нём поиск с ключевым словом &quot;Root Complex Base Address&quot; - упс...<br />
<br />
<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4793&amp;d=1524682088" rel="Lightbox" id="attachment4793" ><img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4793&amp;thumb=1&amp;d=1524682088" class="thumbnail" border="0" alt="Нажмите на изображение для увеличения
Название: D31F0.png
Просмотров: 1266
Размер:	21.8 Кб
ID:	4793" style="margin: 5px" /></a><br />
<br />
Всякое устройство на PCI-шине имеет в системной памяти своё конфигурационное пространство - <b>ConfigSpace</b>. Стандартный размер этого пространства 256-байт (FFh). Содержимое первых 64-байт (40h) одинаково для всех устройств, а остальные 192-байта специфичны. Каждый байт называют регистром отображённого на память устройства - итого 256-регистров, хотя некоторые из них собираются в слова и двойные слова.<br />
<br />
На рисунке выше - скрин старшей части регистров моста PCI-to-LPC. Как оказалось, начиная с ICH7 до PCH, координаты этого моста в системе у всех одинаковы - <code class="inlinecode">Bus(0):Dev(1Fh):Func(0)</code>. Из даташита видно, что 32-битный RCBA хранится в регистре <code class="inlinecode">F0h</code> LPC-моста. Запустим утилиту <b>RW</b> и посмотрим, что находится в этом регистре:<br />
<br />
<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4794&amp;d=1524682110" rel="Lightbox" id="attachment4794" ><img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4794&amp;thumb=1&amp;d=1524682110" class="thumbnail" border="0" alt="Нажмите на изображение для увеличения
Название: RW_0.png
Просмотров: 1690
Размер:	29.9 Кб
ID:	4794" style="margin: 5px" /></a><br />
<br />
Прокрутив страницу даташита дальше, можно обнаружить описание этого регистра F0h <i>(см.рис.ниже)</i>. Там сказано, что младший бит(0) не относится непосредственно к адресу, и логически должен быть сброшен в нуль. Это &quot;бит достоверности адреса&quot;, т.е. если он сброшен, то адрес считается недействительным <i>(у меня с ним всё в порядке)</i>. Хотя биты(13:1) и указаны как резерв, они обнуляются на аппаратном уровне, в результате чего адрес выравнивается на 14-битную <i>(16-Кбайтную)</i> границу. Отмечу, что Intel указывает координаты <code class="inlinecode">Bus:Device:Function</code> в 10-тичном виде 31 - в хексах это будет 1Fh:<br />
<br />
<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4795&amp;d=1524682150" rel="Lightbox" id="attachment4795" ><img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4795&amp;thumb=1&amp;d=1524682150" class="thumbnail" border="0" alt="Нажмите на изображение для увеличения
Название: RCBA.png
Просмотров: 2465
Размер:	10.6 Кб
ID:	4795" style="margin: 5px" /></a><br />
<br />
Одним словом, свой <b>Root-Complex</b> я могу найти в памяти по адресу <code class="inlinecode">0xFED1C000</code>, и это уже вери-гуд <i>(у вас он может отличаться).</i> В даташите, почти все устройства адресуются через RCBA используя его в качестве базы. Это необходимо учитывать при программировании чипсета. Накатать код мы всегда успеем, но сначала нужно освоить теорию - не зря говорят: <i>-&quot;Не берись за штурвал, не выучив мануал!&quot;</i><br />
<br />
Продолжая поиски котА в дремучем лесу железяк нужно определить, на какой конкретно шине повесился чип SPI-Flash. Знает это один из приоритетных регистров чипсета <b>GCS</b> - 32-битный регистр по смещению <code class="inlinecode">0x3410</code> от RCBA. В его битах закодировано много-чего, но нас интересует только Flash - остальное в топку:<br />
<br />
<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4796&amp;d=1524682395" rel="Lightbox" id="attachment4796" ><img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4796&amp;thumb=1&amp;d=1524682395" class="thumbnail" border="0" alt="Нажмите на изображение для увеличения
Название: GCS.png
Просмотров: 1512
Размер:	37.0 Кб
ID:	4796" style="margin: 5px" /></a><br />
<br />
Угу.. выходит чтобы найти GCS, мне нужно к RCBA прибавить <code class="inlinecode">0x3410</code>, считать этот регистр и проверить его биты(11:10). У меня ICH7.., и если они имеют значение(01), то бивис обслуживается интерфейсом SPI. На скрине ниже, значение этого/32-битного регистра в памяти: <br />
<div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="480703317"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="480703317" style="height: 110px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; RCBA &nbsp; &nbsp; &nbsp; &gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; GCS
0xFED1C000 + 0x3410 = 0xFED1F410
----------
0x200464 = 10.0000.0000.0100.0110.0100
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ++-----------&gt; биты<span class="br0">&#40;</span><span class="nu0">11</span>:<span class="nu0">10</span><span class="br0">&#41;</span> = 01 = SPI-Flash</pre></td></tr></table></div></td></tr></tbody></table></div><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4797&amp;d=1524682455" rel="Lightbox" id="attachment4797" ><img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4797&amp;thumb=1&amp;d=1524682455" class="thumbnail" border="0" alt="Нажмите на изображение для увеличения
Название: GCS_0.png
Просмотров: 1691
Размер:	6.7 Кб
ID:	4797" style="margin: 5px" /></a><br />
<br />
Ладно.. убедился я, что являюсь счастливым обладателем SPI-Flash. Теперь мне нужно найти адрес SPI-контроллёра в памяти, чтобы через него взаимодействовать с чипом ROM-BIOS напрямую. Судя по-всему, инженеры Intel сильно не заморачиваются - его базовый порт они назвали коротко_и_ясно - <b>SPIBAR</b>. Как и большинство девайсов, он имеет своё смещение относительно базы рута RCBA - это offset <code class="inlinecode">0x3020</code>. Здесь упоминается термин RCRB - <b>Root Complex Registers Block</b>, который является синонимом RCBA:<br />
<br />
<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4798&amp;d=1524682564" rel="Lightbox" id="attachment4798" ><img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4798&amp;thumb=1&amp;d=1524682564" class="thumbnail" border="0" alt="Нажмите на изображение для увеличения
Название: SPIBAR.png
Просмотров: 1135
Размер:	27.4 Кб
ID:	4798" style="margin: 5px" /></a><br />
<br />
Вот они - регистры контроллёра SPI-Flash. Непосредственная запись и чтение в эти регистры приводят к физическим операциям с чипом BIOS, их активно юзают все программы-прошивальщики. Особое внимание нужно уделить на выделенные зелёным регистр-статуса, и <b>OpСode-Menu</b>. Рассмотрим их подробней..<br />
<br />
В регистре статуса, особняком стоит старший бит(15), который можно сравнить со-сторожевым питбулем на входе. Остальные биты определяют характер шинных циклов, кэшировать их или нет, завершилась-ли транзакация удачно, и прочее. Вот перевод на русиш 15-го бита, остальные можете посмотреть у себя в даташите: <br />
<div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="758719866"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="758719866" style="height: 126px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
</pre></td><td class="de1"><pre class="de1">SPI Status Register <span class="br0">&#40;</span>SPIBAR + 00h<span class="br0">&#41;</span>
----------------------------------
бит <span class="nu0">15</span>: - Защита данных SPI - R/W/LO.
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> = Нет защиты - потенциальная опасность!
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span> = Конфигурации SPI в смещениях 50h..6Fh изменению не подлежит.
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Взведённый бит может быть очищен только аппаратным сбросом Reset.</pre></td></tr></table></div></td></tr></tbody></table></div>Тут сказано, что если взвести этот бит-защиты 1-раз, то сбросить его уже не получится - он будет аппаратно удерживаться на протяжении всего сеанса, вплоть до перезагрузки. Поэтому инженерам пришлось здесь сесть на шпагат - или под честное/слово юзера оставить периметр открытым, или-же сделать невозможным процесс настроек SPI-контроллёра. Видимо на всеобщем голосовании был принят первый вариант, т.к. буквально на всех исследуемых мною машинах, этот бит сброшен и защита отключена.<br />
<br />
Следующий регистр <b>[OpCode Menu: SPIBAR + 58h]</b> заслуживает ещё большего внимания..<br />
Алгоритм работы со SPI-контроллёром - нестандартный. Коды команд передаются м/схеме ROM не напрямую, а косвенно - через блок регистров &quot;OpCode-Menu&quot;. Каждый байт этого/8-байтного регистра содержит один из восьми кодов-операции для м/схемы ROM <i>(она имеет свои регистры)</i>. Это могут быть команды: чтения вендора/статуса, запись, стирание, etc.. Платформа не знает, с каким чипом ей предстоит иметь дело, поэтому этот блок-регистров <i>(основываясь на данных текущего чипа ROM)</i> заполняет BIOS при старте платформы:<br />
<div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="309384682"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="309384682" style="height: 94px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
</pre></td><td class="de1"><pre class="de1">SPIBAR = 0xFED1F020 <span class="br0">&#40;</span>RCBA + 0x3020<span class="br0">&#41;</span>
-----------------------------------
Status = 0004h
OpMenu = 02,03,D8,05,9F,01,06,00 &nbsp;<span class="br0">&#40;</span><span class="nu0">8</span>-байт<span class="br0">&#41;</span></pre></td></tr></table></div></td></tr></tbody></table></div><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4800&amp;d=1524682856" rel="Lightbox" id="attachment4800" ><img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4800&amp;thumb=1&amp;d=1524682856" class="thumbnail" border="0" alt="Нажмите на изображение для увеличения
Название: opmenu.png
Просмотров: 1334
Размер:	7.8 Кб
ID:	4800" style="margin: 5px" /></a><br />
<br />
Интерфейс SPI поддерживает не только 1-байтные, а двух -и даже трёх-байтные команды. В этом случае они записываются в регистр префикса. Например по-умолчанию, запись во-флэш отключена его битом <b>WriteDisable</b>, поэтому перед операцией записи нужно сначала разрешить.., а уже потом производить саму запись. Для этого предназначен префиксный регистр(54h) <b>PrefixOpcode</b>, в котором уже лежит код <b>04h = WriteDisable</b> <i>(см.скрин выше)</i> - он на старте, и засылается следом за операцией записи во-флэш. В результате получаем снятие защиты только когда это действительно нужно - при записи. <br />
<br />
Ниже - скрин опкодов из доки моего чипа <b>MX-25L4005A.</b><br />
Активные его коды я выделил зелёным - биос прописал их уже в регистр &quot;OpCode-Menu&quot; контроллёра:<br />
<br />
<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4801&amp;d=1524682965" rel="Lightbox" id="attachment4801" ><img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4801&amp;thumb=1&amp;d=1524682965" class="thumbnail" border="0" alt="Нажмите на изображение для увеличения
Название: mx25.png
Просмотров: 2009
Размер:	14.3 Кб
ID:	4801" style="margin: 5px" /></a><br />
<br />
Для передачи команды в чип, программа должна передать контроллёру не сам код, а <b>номер байта</b> в 8-байтном блоке OpCode-Menu содержащего код этой команды. Для выбора <b>достаточно 3-х бит</b>. Поскольку расположение кодов в ячейках может быть произвольным и зависит от настроения BIOS, программа должна просканировать весь/8-байтный регистр и найти в нём номер ячейки, в которой хранится код требуемой команды <i>(например 9Fh для ReadID)</i>. <br />
<br />
Затем, полученный 3-битный номер ячейки отправляется в регистр <b>SPI-Control</b>, где используется как битовое поле <b>Cycle-Opcode-Pointer</b> при формировании 32-битного кода операции для контроллёра SPI. Кроме COP, код-операции содержит инфу о кол-ве передаваемых байт, частоте синхронизации и т.п. Перед началом транзакации на шине SPI, необходимо записать адрес в одноимённый регистр <b>SPI-Address</b>. Затем, циклически опрашивая статус, определяем момент завершения транзакции. Только после этого можно считать данные из регистра <b>SPI-Data(0-7)</b> и считать операцию чтения/записи успешной.<br />
<br />
<b>Послесловие..</b><br />
<br />
Признаюсь, что разговарить на эту тему можно бесконечно, ведь это только мизерная часть всего мануала. В нём запросто можно утонуть, если задумаешь охватить всё и сразу. Одних страниц в даташите на чипсет более 800-штук, и в каждой описывается как-минимум по 32 разнообразных бита. При детальном рассмотрении всех регистров можно выловить в системе столько багов, что ни в сказке-сказать, ни пером-описать, ..а только грубым матом - вроде система внушает доверия, а вроде и нет. <br />
<br />
На повестке дня - непосредственное программирования чипов BIOS <i>(хотя за сроки не ручаюсь).</i> Использовать буду ассемблер FASM, реальный/нереальный/защищённые моды, регистры чипсета и всё/такое низкоуровневое.<br />
<br />
<div align="right"><i>Продолжение следует...</i> </div></div>

]]></content:encoded>
			<dc:creator>R71MT</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/491967/5240.html</guid>
		</item>
		<item>
			<title>Принцип работы Dual-BIOS</title>
			<link>https://www.cyberforum.ru/blogs/491967/5235.html</link>
			<pubDate>Fri, 20 Apr 2018 20:12:40 GMT</pubDate>
			<description>Немного о том, как устроен и что представляет из-себя этот зверь. 
Речь пойдёт об аппаратной (и...</description>
			<content:encoded><![CDATA[<div>Немного о том, как устроен и что представляет из-себя этот зверь.<br />
Речь пойдёт об аппаратной <i>(и далее программной)</i> реализации <b>'Dual-BIOS'</b>. Gigabyte не охотно делится с подноготной своего продукта, ограничиваясь тремя скудными картинками у себя на сайте. Ну не хотят - не надо. В свободном доступе есть принципиальные схемы мат/плат и даташиты чипсетов - они и прольют свет на происходящее.<br />
<br />
Суть в том, чтобы вдохнуть жизнь в материнку с убитым бивисом. На плате имеются 2 чипа с одинаковыми прошивками: M_BIOS и B_BIOS <i>(main/backup)</i>, которыми программно управляет чипсет. Если контрольная сумма основного биос искажена, то хост подключает к пространству системной памяти резервную м/схему, и подаёт сигнал сброса 'Reset'. Машина перезагружается уже с кодом бэкап-биоса, и предлагает восстановить Main. Неплохая идея.. Посмотрим, как она воплощается в жизнь.<br />
<br />
Параллельная флэш-память уже канула в лету, освободив нишу для последовательной <b>'SPI-Flash'</b>. Сейчас, в качестве носитей кода BIOS мат/плат широкое распространение получила 25-я их серия, которую производят: Winbond(W), Silicon(SST), Macronix(MX). Это &quot;одного поля ягоды&quot; с такими характеристиками:<br />
<br />
<div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="168538021"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="168538021" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">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
</pre></td><td class="de1"><pre class="de1">SST25VF080B <span class="br0">&#40;</span><span class="nu0">8</span> Мбит = <span class="nu0">1</span> Мб<span class="br0">&#41;</span>
----------------------------
Тип........: &nbsp;SPI-Flash;
Вольтаж....: &nbsp;<span class="nu0">2</span>,<span class="nu0">7</span>...<span class="nu0">3</span>,6v;
Частота....: &nbsp;<span class="nu0">75</span> MГц;
Скорость...: &nbsp;<span class="nu0">150</span> Мбит/сек;
Ток чтения.: &nbsp;<span class="nu0">9</span> мА;
Объём......: &nbsp;до <span class="nu0">64</span> Мбит <span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">2</span>,<span class="nu0">4</span>,<span class="nu0">8</span> Мб<span class="br0">&#41;</span>;
Страница...: &nbsp;<span class="nu0">256</span> байт;
Сектор.....: &nbsp;04 кБ;
Блок.......: &nbsp;<span class="nu0">64</span> кБ;
Возможности: &nbsp;<span class="nu0">4</span> кБ посекторное стирание;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">64</span> кБ блочное стирание;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Полное стирание;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Авто/инкремент адреса;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">100.000</span> циклов перезаписи;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">10</span> лет хранение данных;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Программная и аппаратная защита от записи;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Защита всего содержимого, или её части;
--------------------------------------------------------
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_____
&nbsp; &nbsp;CS#--|<span class="nu0">1</span> &nbsp; <span class="nu0">8</span>|--VDD &nbsp; &nbsp; &nbsp; CS# = вход 'Chip Select' - активация чипа лог.нулём;
&nbsp; MISO--|<span class="nu0">2</span> &nbsp; <span class="nu0">7</span>|--HOLD# &nbsp; &nbsp; WP# = вход 'Write Protect' - запрет на запись <span class="br0">&#40;</span>только чтение<span class="br0">&#41;</span>;
&nbsp; &nbsp;WP#--|<span class="nu0">3</span> &nbsp; <span class="nu0">6</span>|--SCLK &nbsp; &nbsp;HOLD# = вход запроса шины <span class="br0">&#40;</span>мастер отвечает единицей HLDA<span class="br0">&#41;</span>;
&nbsp; &nbsp;GND--|<span class="nu0">4</span> &nbsp; <span class="nu0">5</span>|--MOSI &nbsp; &nbsp; MOSI = вход 'Master-Out, Slave-IN' <span class="br0">&#40;</span>DI - DataIn<span class="br0">&#41;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; |_____| &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SCLK = вход синхро/импульса Clock <span class="br0">&#40;</span>генерит Мастер<span class="br0">&#41;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MISO = выход 'Master-IN, Slave-Out' <span class="br0">&#40;</span>DO - DataOut<span class="br0">&#41;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;VDD = плюс источника питания <span class="nu0">3</span>,3v.
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GND = минус источника питания;</pre></td></tr></table></div></td></tr></tbody></table></div>В интерфейсе SPI один ведущий может управлять несколькими(N) ведомыми.<br />
Поскольку речь идёт про Dual-BIOS, ведомых получается двое - Main и Backup чипы.<br />
Встроенный в ICH(7..10) SPI-контроллёр может работать как в режиме 'Master', так и в режиме 'Slave'.<br />
<br />
Мастер выбирает ведомого лишь одной линией(<b>CS#</b>), раздельно формируемой для каждого из флэш-чипов. При подаче на вывод(СS#) единицы, SPI-модуль переходит в неактивное состояние и приём/передача данных становится невозможной (отключается буфер I/O внутри флэш). Активным является логический нуль, который помечается решёткой(#).<br />
<br />
Для защиты от записи используется генерируемый Мастером cигнал(<b>WP#</b>). Сигнал(<b>HOLD#</b>) останавливает обращение к памяти, не отключая при этом само устройство. По сути HOLD# - это запрос шины, на что хост отвечает подтверждением HLDA (высокий уровень), но чтобы не тратить время на обмен любезностями, в схемах его сразу подымают через резистор к шине +3,3v. Такая архитектура используется для построения систем с одним контроллёром, и рядом Slave-устройств. <br />
<br />
Обмен начинается с подачи мастером 8-битного кода-команды по линии(<b>MOSI</b>). При операциях записи, за кодом команды следует адрес ячейки, и только потом - байты данных. Итого, транзакация состоит из трёх частей. Операция чтения происходит аналогично, только после приёма адреса, по линии(<b>MISO</b>) начинается вывод данных из SPI-Flash. <br />
<br />
В шинных транзакациях, данные передаются сдвиговым регистром (последовательно) старшим битом вперёд, причём сразу в обоих направлениях. Поэтому в характеристиках м/схем указывается удвоеная пропускная способность - при частоте 75 МГц, спобность 150 Мбит/сек <i>(150/8 = 18,7 Мбайт/с)</i>. Принцип отображён на рис.ниже:<br />
<br />
<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4761&amp;d=1524254284" rel="Lightbox" id="attachment4761" ><img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4761&amp;thumb=1&amp;d=1524254284" class="thumbnail" border="0" alt="Нажмите на изображение для увеличения
Название: spi.gif
Просмотров: 1640
Размер:	14.1 Кб
ID:	4761" style="margin: 5px" /></a><br />
<br />
Нужно сказать, что это не единственный способ подключения двух чипов к хосту - производитель вправе сам выбирать организацию и способ их переключения. Например, всё начиналось с обычного тумблера, при помощи которого переключалась линия(CS#). Когда main отправлялся к праотцам, юзеру достаточны было щёлкнуть этим переключателем, и загрузка происходила с резервного чипа BIOS. Хоть вариант был и топорный, зато безотказный!<br />
<br />
Сейчас-же, чтобы автоматом запустился бэкап - на 'мэйне' обязательно должен быть живой загрузчик и не совпадать контрольная сумма основного блока. Такой подход отталкивает саму идею Dual-BIOS на второй план. Остаётся только гадать, зачем разработчикам понадобились такие выкрутасы..<br />
<br />
Встречались и схемы с последовательным соединением чипов, как на схеме ниже.<br />
Поскольку в интерфейсе SPI данные передаются сразу в обе стороны <i>(двусторонний обмен по разным линиям)</i>, то для записи в 'main' достаточно продублировать команду 'backup'. В этом случае, фактически данные выталкиваются из второго чипа(В), в первый(М): <br />
<div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="95852568"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="95852568" style="height: 206px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; &nbsp;+----CS<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>--&gt;&gt;--+
&nbsp;____|___ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;__|___
| &nbsp; MISO |&lt;-------| MISO |
| &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; +---&gt;| MOSI | Main
| &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; | &nbsp; &nbsp;|______|
| I C H &nbsp;| &nbsp; | &nbsp; &nbsp; ______
| &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; +-&lt;--| MISO | 
| &nbsp; MOSI |-------&gt;| MOSI | Backup
|________| &nbsp; &nbsp; &nbsp; &nbsp;|______|
&nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |
&nbsp; &nbsp; &nbsp;+----CS<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>--&gt;&gt;--+</pre></td></tr></table></div></td></tr></tbody></table></div>Как видим, это тоже хороший вариант, но из-за громоздкости реализации, данная схема не прижилась. Сейчас почти во-всех системах применяется первый вариант с шинной архитектурой. В ней, все выводы кроме <b>CS#</b> и <b>WP#</b> соединяются между собой. Рассмотрим тонкости её реализации..<br />
<br />
<br />
<font size="3"><b>Физическая разводка</b></font><br />
<br />
Как говорилось выше, мастером является встроенный в южный мост SPI-контроллёр. На рис.ниже отображены его пины, и в квадратных скобках указаны листы схемы <i>(sheets)</i>, на которые идут эти выводы. Видно, что все/они уходят к листу[26], где представлена распиновка самих чипов BIOS. Выделяется только пин(CS#), который помимо листа[26] ссылается ещё и на лист[24]:<br />
<br />
<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4762&amp;d=1524254597" rel="Lightbox" id="attachment4762" ><img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4762&amp;thumb=1&amp;d=1524254597" class="thumbnail" border="0" alt="Нажмите на изображение для увеличения
Название: ich.png
Просмотров: 2032
Размер:	29.7 Кб
ID:	4762" style="margin: 5px" /></a><br />
<br />
Здесь нет ничего особенного - одноимённые пины <b>MISO,MOSI,CLK,HOLD</b> обоих чипов замыкаются, и идут напрямую к контроллёру. Но почему пин(CS#) контроллёра уходит ещё и к листу[24]? Вот тут-то и начинается самое интересное..<br />
<br />
Как оказалось, чипом 'backup' управляет не ICH, а контроллёр <b>'SIO 8718F'</b>, его схема показана на листе[24]. Помимо прочего, внутри SIO находится т.н. сторожевой таймер <b>'WatchDog'</b>, играющий чуть-ли не главную роль в реализации технологии Dual-BIOS. В задачи этого таймера входит отсчёт определённого интервала времени <i>(в данном случае около 2-сек)</i>, по истечении которого схемы таймера подают в чипсет сигнал сброса 'Reset'. Подразумевается, что контролирующее работу этого таймера устройство <i>(здесь 8718F)</i>, должно сбрасывать таймер в нуль, до истечении заданного промежутка времени.<br />
<br />
<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4763&amp;d=1524254635" rel="Lightbox" id="attachment4763" ><img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4763&amp;thumb=1&amp;d=1524254635" class="thumbnail" border="0" alt="Нажмите на изображение для увеличения
Название: ich_0.png
Просмотров: 1938
Размер:	32.4 Кб
ID:	4763" style="margin: 5px" /></a><br />
<br />
<b>Dual-BIOS</b> ставит перед разработчиком следующие задачи:<br />
<br />

<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message"><u>1. Необходим триггер (Main/Backup)</u>, от состояния которого зависит режим старта: 0=Main, 1=Backup.<br />
<br />
<u>2. Обязанности адресного дешифратора, управляющего доступом к ROM, расширяются.</u> Он должен обеспечить выбор одной из двух м/схем, которая будет размещена в верхнем диапазоне системной памяти 0xFFFFFFFF минус размер ROM-BIOS. Выбор осуществляется в зависимости от состояния триггера Main/Backup.<br />
<br />
<u>3. Необходимо реализовать алгоритм управления триггером</u> и рестарта платформы для запуска Backup. При первом старте, триггер устанавливается в '0' и выбирается M-BIOS. Если его содержимое достоверно, POST выполняется обычным образом. Если Main кривой, триггер переключается в '1' и генерируется сигнал сброса. ЦП повторно начинает POST с адреса FFFFFFF0h, но теперь уже на адресный диапазон отображается Backup.</div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table>Триггером управляет таймер 'WatchDog', который после сброса начинает отсчёт 2-секундного промежутка времени. При успешном старте Main, фрагмент кода POST должен остановить таймер. Если Main искажён и произошла потеря управления, ответственный за остановку таймера фрагмент не будет выполнен и сторожевой пёс 'WatchDog' переключив триггер Main/Backup в состояние '1', сгенерит сигнал сброса Reset.<br />
<br />
На следующем рисунке изображена структурная схема соединения SPI-контроллёра с двумя м/схемами биос. Нужно отметить, что таким образом сигнал выбора чипа(CS#) коммутируется только в 2-чиповой архитектуре. Если-же чип один, то линия(CS#) подключается напрямую от южного моста(ICH) к м/схеме SPI-Flash:<br />
<br />
<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4764&amp;d=1524254660" rel="Lightbox" id="attachment4764" ><img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4764&amp;thumb=1&amp;d=1524254660" class="thumbnail" border="0" alt="Нажмите на изображение для увеличения
Название: dual.png
Просмотров: 1135
Размер:	4.0 Кб
ID:	4764" style="margin: 5px" /></a><br />
<br />
Таким образом, поддержку технологии Dual-BIOS обеспечивают следующие узлы контроллёра IT8718F:<br />
<br />
1. Триггер Main/Backup, определяющий тип старта платформы;<br />
2. Демультиплексор сигналов(CS#), выбирающий одну из двух м/схем BIOS;<br />
3. 'WatchDog' таймер с формирователем сигнала сброса CPU.<br />
<br />
<div align="right"><i><font color="DimGray">Продолжение следует... </font></i></div></div>

]]></content:encoded>
			<dc:creator>R71MT</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/491967/5235.html</guid>
		</item>
		<item>
			<title>Web-дизайн: откуда черпать идеи</title>
			<link>https://www.cyberforum.ru/blogs/491967/5230.html</link>
			<pubDate>Wed, 18 Apr 2018 11:27:51 GMT</pubDate>
			<description><![CDATA[Всем привет! 
Поделюсь рац/предложением на тему "Как сверстать индивидуальную пагу?". 
Идеи давно...]]></description>
			<content:encoded><![CDATA[<div>Всем привет!<br />
Поделюсь рац/предложением на тему &quot;Как сверстать индивидуальную пагу?&quot;.<br />
Идеи давно уже лежат на поверхности, поэтому и придумывать ничего ненадо - всё уже давно придумали. В зависимости от интересов, делаю скрин менюшки какой/нибудь любимой геймы, и с некоторыми поправками переношу его в HTML-документ.<br />
<br />
В фотошопе рисую копии буттонов и всей &quot;атмосферы&quot; в целом. Проблема в том, как отобразить в станичке всякие кривые/ломаные/фигурные участки. Это просто, если применить в фотошопе инструмент &quot;Раскройка&quot;. Нужно просто нарисовать макет, и раскроить его на мелкие рисунки, из которых и собрать полную картину в целом. <br />
<br />
[Файл --&gt; Сохранить для Web --&gt; PNG --&gt; Сохранить]<br />
<br />
<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4758&amp;d=1524050704" rel="Lightbox" id="attachment4758" ><img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4758&amp;thumb=1&amp;d=1524050704" class="thumbnail" border="0" alt="Нажмите на изображение для увеличения
Название: 0256.png
Просмотров: 1132
Размер:	17.8 Кб
ID:	4758" style="margin: 5px" /></a><br />
<br />
На выходе получаю папку, в которой лежат уже две части одного рисунка - размер первого <i>(который с текстом)</i> в html-паге фиксирую пикселями, а размер второго <i>(линии)</i> задаю в процентах на всю/оставшуюся ширину. С остальными элементами проделываю тоже/самое, вставляю фоном каку-нибудь картинку по тематике сайта, и получается то, что получилось. Пример дизайна сайта скомунизденного у игры &quot;CRYSIS&quot; представлен ниже..<br />
<br />
<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4759&amp;d=1524050740" rel="Lightbox" id="attachment4759" ><img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4759&amp;thumb=1&amp;d=1524050740" class="thumbnail" border="0" alt="Нажмите на изображение для увеличения
Название: site1.jpg
Просмотров: 1340
Размер:	62.8 Кб
ID:	4759" style="margin: 5px" /></a><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4760&amp;d=1524050773" rel="Lightbox" id="attachment4760" ><img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4760&amp;thumb=1&amp;d=1524050773" class="thumbnail" border="0" alt="Нажмите на изображение для увеличения
Название: site0.jpg
Просмотров: 1512
Размер:	56.2 Кб
ID:	4760" style="margin: 5px" /></a></div>

]]></content:encoded>
			<dc:creator>R71MT</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/491967/5230.html</guid>
		</item>
	</channel>
</rss>
