ИМХО дело тут не столько в NOR/NAND, сколько в том, что-бы их подключать напрямую(ну почти напрямую). Для NAND прямое подключение не очень нужно, по самой её структуре (из одного AND столбика можно считать только один бит за раз), потому NAND всё равно должна быть организована особым образом, и читаться тоже по своему. Ну а вот NOR ты можешь читать как угодно, там двухмерная матрица, как в DRAM. Т.е. данные сливаются как в DRAM, читается вся линейка, и пока она сливается, читается следующая. И так сколько надо бит. NAND трёхмерная, и развернуть её в линию не получится(т.к. она ещё и на острова разделена, т.е. в одном острове несколько слоёв, между которыми надо переключаться, что-то вроде дорожек в HDD)
Обычные флешки прячут эту структуру внутри, но они и читаются не последовательно, а блоками, причём рандомно разбросанными. Для NOR такой разброс не нужен, если ты конечно программно не будешь мучить одни и те же острова. Можно писать/читать последовательно, линейка за линейкой.
С nand все понятно - это на каждом заборе расписано. а зачем NOR сделали mtd я никак не могу понять.
Значит не совсем понятно и с NAND, потому что NOR обладает теми же особенностями что и NAND - имеет ограниченное количество циклов стирания/записи и при этом стереть можно только блок целиком, при этом блок имеет относительно большой размер (от 64 кб), так что обычные ФС для блочных устройств нерациональны в плане жизненного цикла устройства. MTD - прослойка для работы специальных ФС.
почему к RAM, ROM и EEPROM устройствам доступ обычно предоставляют через mtd-драйвер? как минимум первые из этих двух не требуют стирания впринцыпе, а EEPROM какбудто можно стирать вполне разумными кусками.
почему к RAM, ROM и EEPROM устройствам доступ обычно предоставляют через mtd-драйвер?
Первый раз такое слышу. RAM - только специальные случаи типа видеопамять или память недоступная ядру через аллокаторы, второй случай - для эмуляции устройства MTD. ROM - про какую идет речь ? EEPROM - как правило к ним относят флеш память с интерфейсом i2c и очень ограниченным объемом (максимум килобайты), их с MTD я не видел чтобы кто-то использовал.
http://lxr.free-electrons.com/source/drivers/misc/eeprom/
обычная OTP в моем понимании - это конфигурационные биты однократно программируемые, никакого MTD там не используют, по поводу других случаев - в основе этих ROM - NOR, какой-бы интерфейс ни был (spi dataflash или ||)
то что блочный девайс эмулируется в MTD - что-то меняет ? не можешь ты для этой памяти использовать RD еще раз повторяю - для него память выделяется через аллокатор ядра, в данном случае она для них недоступна
Хорошо, какие ты находил другие способы отдачи ROM в юзерспейс?
для OTP - обычный char device со своим интерфейсом, только я чую ты какой-то херней страдаешь из-за своей упертости.
да, тебя видимо смущает что это все делается в mtd и наверно думаешь что надо писать какой-то специальный драйвер, но это не так, достаточно передать физический адрес памяти по которому отображается твоя RAM (или Flash - неважно) и размер
http://lxr.free-electrons.com/source/drivers/mtd/devices/phram.c#L5
я уже давно знаю о этих реализациях и изучил их но до сих пор не понимаю почему это реализовали именно через mtd. мне нигде не удавалось найти хоть какието мысли по этому поводу.
cvv★★★★★ ()автор топика
Последнее исправление: cvv
(всего
исправлений: 1)
я уже давно знаю о этих реализациях и изучил их но до сих пор не понимаю почему это реализовали именно через mtd
mtdblock появился до phram, так что не было смысла изобретать велосипед с отдельным драйвером типа brd - просто дописали модуль для готовой инфраструктуры. Собственно такой модуль о котором ты говоришь я могу минут за 15 написать, но зачем если есть готовое решение ? Поттерингам не место в ядре.
mtdblock появился до phram, так что не было смысла изобретать велосипед с отдельным драйвером типа brd - просто дописали модуль для готовой инфраструктуры.
Я обратил внимание что phram куда лаконичней чем brd. Тоесть ты считаешь что причиной такого решения была низкая трудоемкость реализации? А что мы потеряли в лишнем слое абстракции?
cvv★★★★★ ()автор топика
Последнее исправление: cvv
(всего
исправлений: 2)
там
Device.data = vmalloc(Device.size);
vmalloc замени на ioremap() и через параметры модуля передай физический адрес участка памяти и размер - все, вот тебе простой драйвер как ты хотел :)
спасибо, было интересно, но я хотел разобратся в плюсах и минусах этой и предыдущей реализации а не получить готовый драйвер. Я достаточно хорошо разобрал brd чтобы написать такое самому - но мне до сих пор не понятны преимущества и недостатки первой и второй реализации.
впринцыпе я могу прогнать какието бенчмарки для обеих реализаций но я не думаю что это мне чтото прояснит по сути вещей.