
Комментарии 38
Что ж вы, люди, творите. Вы ж можете вместе мир перевернуть…
Интересно, кстати, реалистична ли моя мечта — «видеокарта-утилизатор» для кучи мелких DDR (сейчас уже это будет DDR4, конечно). Ящик или ноут апнули, мелкую планку вынули, добавили в видеокарту. А там какие-нибудь дешманские GPU, которые умеют с ней работать, но их очень много и у каждого — один десктопный слот памяти и два бучных :)
Я про аппаратную сторону вопроса. То, что на уровне драйвера это всё заставить работать и балансировать нагрузку — «задачка-неберучка», я не буду спрашивать :)
Теоретически - возможно, если найдется чип GPU совместимый с DDR4. На практике, увы, есть два затыка: стоимость платы в малой серии будет порядочной. И главное - документация на GPU, достать ее будет трудно.
Была похожая идея для битых планок памяти, которые вообще ничего не стоят. Создаётся материнка с 8-16-32 слотами под них. В качестве контроллера плис, интерфейс общения usb/sata/pci-e. Контроллер точно так же, как и в жёстких дисках хранит информацию о битых адресах и перенаправляет запись в резевную область. Цель - быстрый относительно накопителей и дешёвый относительно озу кэш.
Была похожая идея для битых планок памяти, которые вообще ничего не стоят.
Мне кажется с них просто сдувают норм чипы и собирают из них рабочие планки. Не знаю про характер повреждения в битых чипах, было что то вроде в linux когда блок специально помечался и не использовался. Но есть ли гарантия, что остальные ячейки со временем будут стабильны.
Такая фича с перенаправлением есть прямо внутри чипов памяти, называется Post Package Repair. Бывает 2 видов: персистентная, и soft - до следующего ребута.
Скажите, если на двухранговых модулях чипы паяются с двух сторон печатной платы, то на 4-ранговых как, с 4 сторон?
4 ранга в стандартном декстопном сегменте в контексте DDR4 не может быть, это строго серверные RDIMM и так далее. На стандартном коннекторе DIMM есть контакты только под два ранга.
За DDR4 RDIMM или DDR5 говорить не могу, так как не занимался изучением этих интерфейсов и не работал с ними.
Пояснение про 2 стороны было преведено чисто с обывательской точки зрения, так проще понять о чем идет речь.
А нельзя было все эти "ранги" объяснить проще, например, исходя из названия сигнала — CS это chip select? Сильно проще для понимания.
В сокете DDR4 всего есть 5 линий для выбора ранков не зависимо от типа исполнения (UDIMM/RDIMM/NVDIMM): CS[3:0] для внешних, они one-hot, и C[2:0] для внутренних, они декодируются. CS[3:2] совмещены с C[1:0], в итоге получается от 4 внешних до 2 внешних с до 8 внутренних ранков. Модули на 4 ранка могут быть собраны как из SDP корпусов (для x8: две стороны по два ряда), так и из MDP корпусов, больше 4-х ранков - только из MDP, максимально до 16 ранков.
Там кристаллы клеятся друг на друга. Поскольку процессор рассчитан по нагрузочной способности на не более двух чипов на линию, приходится ставить промежуточный регистр, который сам по себе вносит задержку не менее одного такта. Поэтому обычно лупят от души, делают пироги из сразу 8 чипов. Такая память называется регистровой (RDIMM). Это сугубо серверная история. когда нужно вонзить пару терабайт ОЗУ.
Ну или не клеят, а ставят типа так (это планка на 128 Гб):

А можно с таких планок переставить чипы на обычные не регистровые? Учитывая, что бу северные планки стоят значительно дешевле обычных. Или там и чипы другие?
…а можно из одноранговой планки сделать двухранговую методом «оттопырь CS, напаяй чип сверху, смыть, повторить, CS проводками кинуть на контакт планки»?
…а то валяются на совершенно помоечную ёмкость, а вот в два раза больше уже имела бы хоть какой-то смысл. Древность древняя, не BGA.
Но убить без-двух-минут-антиквариат не хочется :)
Почему конденсаторы для VTT на модуле памяти ставятся между VTT и VDD ? Почему не между VTT и GND? Посмотрел несколько примеров модулей. Там один сплошной слой VDD, а GND собирают из кусочков. Получается для CMD/ADDR опорный слой VDD. Но, допустим, у меня собственная плата (не DIMM) на которой стоит и контроллер и память. Много сплошных слоев GND и один VDD. Опорный слой для всех сигналов GND. Не лучше и проще подключать конденсаторы между VTT и GND ?
Аналогичный вопрос про CK_t/CK_c .
А вот адресно-командная шина…она особенная, ведь опорой для нее является питание VDD
Всякие SPI (I2C,SWD..) так веду для экономии. Две витых пары, одна с землёй, вторая с питанием, только на концах между питанием и землей надо по конденсатору строго. Приветствуется если кто то поправит если что.
Да, для низкоскоростных это проходит. А то, что VDD используется как опора - это похоже на PECL, для избранных сигналов использовать чуть менее шумный + питания.
Использование VDD как опоры для CA-шины - это требование JEDEC в их документации на DDR4, вероятно, связано с особенностями устройства блока ввода-вывода контроллера памяти и самих чипов. Тут конденсаторы на землю особо не участвуют в передаче возвратного тока. Более того - на высоких частотах конденсатор такую роль просто не может исполнять из-за роста его индуктивности.
Касательно SPI/I2C/SWD - не то, чтобы для них нужна была адекватная опора, если линии не метровые. С SPI только опора желательна, если частоты выходят за 10 МГц.
Было бы здорово если бы кто то разработал переходник с M.2 nvme ssd на sata и возможность объединять множество М2 ссд в один кластер в нем. Скорости сата3 будет достаточно чтоб найти применение 128-256гб дискам для файлохранидища.
Переходник PCIe-SATA - есть такая штука как ASM1166/1164. Есть и в виде платы M2 с SATA-коннекторами.
А вот разветвление PCIe на несколько отдельных линий - вопрос открытый. Нужен или хаб, что умеет дробить одну линию на несколько (но тогда от x4 останется x1 по пропускной способности), или пытаться разделить эти x4 на 4 по x1, добавив генератор REFCLK для каждой из этих линий. Но PERST тоже как-то надо делить (участвует в инициализации интерфейса), да и вряд ли какая десктопная система умеет дробить одну шину на несколько.
Спрашиваю из любопытства. Что будет, если обратиться к несуществующей памяти? Я знаю про то, что контроллер памяти не даст этого сделать. Но все же, если обмануть контроллер и сказать, что память (именно планка памяти) большого объема, а фактически такого объема нет, обманутый контроллер отправит планке запрос данных, но ни одна из микросхем памяти не ответит контроллеру, какие байты увидит процессор?
Зависит от конкретной реализации схемы. От висячки шины до отзеркаленных данных существующей памяти.
Я правильно понимаю, что "отзеркаленные данные", это когда старшие биты отбрасываются и данные считываются из микросхем из адреса по младшим битам, которые действительно адресуют память, т.е. при обращении происходит зацикливание адреса? А что такое "висячка шины"?
Да, верно понимаете. Что касается висячки то тут зависит от реализации. Если есть подтяжки то считается значение этой подтяжки. Если её нет, то считается значение предыдущей транзакции либо её искажённый фантом, всё зависит от паразитной ёмкости шины, которая будет удерживать это значение во времени.
PS Между прочим мироринг (от mirroring) использовался в одном из взломов PS3, где до закрытого ключа добирались именно используя факт отзеркаливания ОЗУ. При этом регистр безопасности не покрывал запретом на чтение эти зеркала. Позже Sony закрыла эту дырку.
Это когда шина висит в ожидании события ( строба данных), которое никогда не наступит.
Обмануть контроллер можно попытаться разве что из-под SPD, зашив другие данные. Но не исключено, что в процессе инициализации ОЗУ контроллер заметит отличие конфига памяти и SPD и просто откажется поднимать ее, выдав ошибку.
Не заметит: https://badram.eu/
Объем планки определяется не количеством микросхем (чаще всего их 8 по 8 бит, хотя их количество тоже может быть разным), а внутренним объемом чипов. Конртоллер обращается одновременно ко всем микросхемам по всем 64 битам данных (в рамках одного chip select, конечно - что называется ранком). Если обратиться за пределы адресного пространства микросхемы, то старшие биты адреса (там сложная поэтапная адресация, но в данном контексте это не важно) будут проигнорированы и произойдет доступ к соответсвующей нижней части адресного пространства.
Если какая-то из микросхем памяти внезапно перестала отвечать на запросы, то на соответсвующих разрядах данных будет значение шины по-умолчаню, обусловленное электрическим стандартом. Для DDR4 это вроде как high, т.е. 1. Для каких-то была половина напряжения питания, т.е. может быть случайное значение.
В общем случае это хрупко и очень платформозависимо. Обработка ошибок протокола DDR - это довольно больно. Детали зависят от конкретного протокола (для DDR4 и DDR5 логика похожая, но реализация значимо разная), и также от конкретной реализации конкретного вендора, вплоть до различий от ревизии корпуса. При ошибке протокола будет выставлен сигнал ALERT, заполнены конкретные MR, и проигнорированы команды, которые были в полете до появления ошибки (после ALERT на DQ не будут данных для чтения, и также посланные в DQ данные записи будут тихо проигнорированы без записи). Надо вычитывать MR и смотреть, где была проблема - там будут записана копия сигналов, которые не понравились корпусу. Итого для DDR4 не будет прочитано ничего, команда прервется до фазы DQ - это на логическом уровне. На физическом уровне DQ подтянуты вверх и вниз, итого другой конец будет видеть idle сигнал в то время, когда там должны были быть данные от чтения. Часто, но не всегда и не везде есть соглашение чтение idle интерпретировать как -1 по ширине запроса - если такой запрос надо отдать дальше, а не сигнализировать ошибку. Но нельзя это принимать как правило - при корректной работе протокола idle в нужные временные интервалы там не может быть. С DDR5 такое симитировать довольно просто на корпусах по 24Gbit - у них ограничение по значениям верхних битов строки. С DDR4 будет сложно - там все в степени 2, корпуса меньшего объема просто игнорируют верхние линии адресов, и доступ будет по модулю реальной емкости без ошибок.
Есть простор для обмана в отображении адресного пространства на сокет, и вот здесь не сложно намеренно присвоить регион на пустой ранк в сокете. Но это будет замечено во время калибровки, и для такого эксперимента нужна платформа, которая может игнорировать калибровку. Тогда при команде чтения на DQ будет idle из-за подтяжки на стороне приемника, и опять по соглашению часто будет получено -1. Запись будет тихо проигнорирована.
Чтобы xSignals (инструмент Altium Designer) считал общую задержку на всей протяженности можно применить один «костыльный» метод
Альтиум умеет строить xSignals через несколько компонентов, костыли не нужны

Значит я не до конца разобрался. Вполне нормальная ситуация, наличие пробелов очевидно.
Спасибо за подсказку, теперь работать будет значительно удобнее)
Либо у вас старая версия, но он так умеет уже года два точно.
24.4. Но, скорее всего, это моя ошибка, ибо xSignals я осваивал именно под проект планки DDR4. Занимался этим делом в начале этого года (заработало, кстати, с первой попытки). До этого вообще страдал с excel файлом для задержек/длин линий.
Увы, предоставлен сам себе, поэтому многие фичи САПР открываются для меня под соусом "а так можно было?!"
А вообще, насколько (не)реально сделать для DDR2-3-4 какой-нибудь переходник-объединитель, собирающий из двух одноранговых планок одну двухранговую? Удлинение линий, разветвление, звоны, согласование, терминирование… На каком стандарте это станет нереальным? Сразу? Третья? Четвёртая? Все получатся?
Отдельным ЭБИТЭ́Сом, правда, станет распознавание их мамкой — придётся какую-нибудь тиньку ставить, которая перехватывает SMBus и мамке передаёт правильную геометрию. И скорость ещё может задегродить, в силу описанного выше. И красный светодиодик зажечь, если геометрия никак не вяжется в две (сильно разная или вовсе в одну половинку воткнули двухранговую планку).
Просто, имея такую схему в опенсорсе, можно попробовать методом лазерной безутюжной сотворить экземплярчик…
Как работать с DDR4