Ny fampiharana ny buffer peratra amin'ny NOR flash

prehistory

Misy milina mpivarotra amin'ny endrikay manokana. Ao anatin'ny Raspberry Pi ary ny wiring sasany amin'ny solaitrabe iray. Ampifandraisina amin'ny coin accepter, accepter faktiora, terminal amin'ny banky... Programa nosoratan'ny tena no fehezin'ny zava-drehetra. Ny tantaran'ny asa manontolo dia nosoratana amin'ny log amin'ny kapila tselatra (MicroSD), izay ampitaina amin'ny alàlan'ny Internet (mampiasa modem USB) mankany amin'ny mpizara, izay voatahiry ao anaty tahiry. Ny fampahalalana momba ny varotra dia ampidirina amin'ny 1c, misy ihany koa ny interface web tsotra ho an'ny fanaraha-maso, sns.

Izany hoe, ny diary dia tena ilaina - ho an'ny kaonty (vola, varotra, sns.), fanaraha-maso (ny karazana tsy fahombiazana rehetra sy ny toe-javatra force majeure hafa); Ity, hoy ny olona iray, dia ny fampahalalana rehetra ananantsika momba ity milina ity.

olana

Ny flash drive dia mampiseho ny tenany ho fitaovana tsy azo ianteherana. Tsy mahomby amin'ny tsy tapaka izy ireo. Izany dia mitarika ho amin'ny fahatapahan'ny milina ary (raha noho ny antony tsy azo nafindra an-tserasera ny log) mankany amin'ny fahaverezan'ny angona.

Tsy ity no traikefa voalohany amin'ny fampiasana flash drive, talohan'izay dia nisy tetikasa hafa niaraka tamin'ny fitaovana maherin'ny zato, izay nitahiry ny gazetiboky tamin'ny USB flash drive, nisy ihany koa ny olana momba ny fahamendrehana, indraindray ny isan'ireo izay tsy nahomby. iray volana no tao anatin'ny am-polony. Nanandrana kapila tselatra samihafa izahay, anisan'izany ny marika misy fahatsiarovana SLC, ary ny modely sasany dia azo itokisana kokoa noho ny hafa, fa ny fanoloana ny kapila tselatra dia tsy nahavaha ny olana.

Miangavy azafady! Лонгрид! Если вам неинтересно «почему», а интересно только «как», можете сразу идти Amin'ny farany lahatsoratra.

fanapahan-kevitra

Первое, что приходит в голову: отказаться от MicroSD, поставить, например, SSD, и грузиться с него. Теоретически возможно, наверное, но относительно дорого, и не так уж надёжно (добавляется переходник USB-SATA; по бюджетным SSD статистика отказов тоже не радует).

Ny USB HDD koa dia tsy toy ny vahaolana manintona indrindra.

Noho izany dia tonga amin'ity safidy ity izahay: avelao ny booting avy amin'ny MicroSD, fa ampiasao amin'ny fomba vakiana fotsiny izy ireo, ary tehirizo ny log de operation (sy ny fampahalalana hafa tsy manam-paharoa amin'ny ampahany amin'ny fitaovana manokana - laharana serial, calibration sensor, sns) any an-kafa. .

Ny lohahevitry ny FS vakiana fotsiny ho an'ny voaroy dia efa nodinihina anatiny sy ivelany, tsy hieritreritra ny antsipiriany momba ny fampiharana amin'ity lahatsoratra ity aho. (fa raha misy mahaliana dia mety hanoratra lahatsoratra kely momba ity lohahevitra ity aho). Ny hany teboka tiako homarihina dia na avy amin'ny traikefa manokana na avy amin'ny tsikeran'ireo izay efa nampihatra izany dia misy tombony amin'ny fahatokisana. Eny, tsy azo atao ny manala tanteraka ny fahasimbana, fa ny fampihenana ny fatran'izy ireo dia azo atao. Ary lasa mitambatra ny karatra, izay manamora kokoa ny fanoloana ny mpiasan'ny serivisy.

Ny fitaovana anjara

Tsy nisy fisalasalana manokana momba ny safidy karazana fahatsiarovana - NOR Flash.
kevitra:

  • fifandraisana tsotra (matetika ny fiara fitateram-bahoaka SPI, izay efa manana traikefa amin'ny fampiasana azy, ka tsy misy olana amin'ny hardware);
  • vidiny mampihomehy;
  • стандартный протокол работы (реализация есть уже в ядре Linux, при желании можно взять стороннюю, которые тоже присутствуют, или даже написать свою, благо всё просто);
  • надёжность и ресурс:
    avy amin'ny angona mahazatra: voatahiry mandritra ny 20 taona ny angona, tsingerina famafana 100000 isaky ny sakana;
    avy amin'ny loharanon'ny antoko fahatelo: BER faran'izay ambany, tsy mila kaody fanitsiana diso (в некоторых работах рассматривается ECC для NOR, но обычно всё-таки там имеют в виду MLC NOR, бывает и такое).

Andeha hojerentsika ny fepetra takiana amin'ny volume sy ny loharano.

Tiako ho azo antoka fa ho voatahiry mandritra ny andro maromaro ny angon-drakitra. Ilaina izany mba tsy ho very ny tantaran'ny varotra raha misy olana amin'ny fifandraisana. Hifantoka amin’ny 5 andro isika, mandritra io fe-potoana io (eny fa na dia ny faran'ny herinandro sy ny fialan-tsasatra aza) можно решить проблему.

Amin'izao fotoana izao dia manangona 100kb logs isan'andro (3-4 arivo ny fidirana), saingy mitombo tsikelikely io tarehimarika io - mitombo ny antsipiriany, misy hetsika vaovao. Fanampin'izay, indraindray dia misy fipoahana (ny sensor sasany dia manomboka mandefa spam miaraka amin'ny valiny diso, ohatra). Hikajy ho an'ny rakitra 10 arivo 100 bytes tsirairay avy - megabytes isan'andro.

Amin'ny fitambarany, mivoaka ny angon-drakitra madio (voatsindry tsara) 5MB. More amin'izy ireo (tombanana mihoa-pampana) 1MB ny angona serivisy.

Izany hoe mila puce 8MB isika raha tsy mampiasa compression, na 4MB raha mampiasa azy. Ny isa tena misy tokoa ho an'ity karazana fitadidiana ity.

Что же до ресурса: если мы планируем, что память целиком будет переписываться не чаще, чем раз в 5 дней, то за 10 лет службы мы получаем менее тысячи циклов перезаписи.
Mamelà ahy hampahatsiahy anao fa ny mpanamboatra dia mampanantena zato.

Kely momba ny NOR vs NAND

Ankehitriny, mazava ho azy, ny fahatsiarovana NAND dia malaza kokoa, saingy tsy hampiasa izany amin'ity tetikasa ity aho: NAND, tsy toa an'i NOR, dia tsy maintsy mitaky ny fampiasana kaody fanitsiana diso, latabatra misy sakana ratsy, sns., ary koa ny tongotry ny Ny chips NAND matetika dia betsaka kokoa.

Ny tsy fahampian'ny NOR dia misy:

  • boky kely (ary, araka izany, ny vidiny ambony isaky ny megabyte);
  • ny hafainganam-pandeha ambany fifandraisana (ny ankamaroany noho ny zava-misy fa ny serial interface tsara no ampiasaina, matetika SPI na I2C);
  • famafana miadana (miankina amin'ny haben'ny sakana, maharitra segondra vitsy ka hatramin'ny segondra maromaro).

Toa tsy misy manakiana anay, ka tohizantsika.

Raha mahaliana ny antsipiriany dia voafantina ny microcircuit ny 25df321a (впрочем, это несущественно, на рынке куча аналогов, совместимых по распиновке и системе команд; даже если мы захотим поставить микросхему одругого производителя и/или другого объёма, то всё заработает без изменения кода).

Я использую встроенный в ядро Linux драйвер, на Raspberry благодаря поддержке device tree overlay всё очень просто — нужно положить в /boot/overlays скомпилированный оверлей и немного модифицировать /boot/config.txt.

Ohatra dts file

Raha ny marina, tsy azoko antoka fa nosoratana tsy misy hadisoana izy io, fa mandaitra.

/*
 * Device tree overlay for at25 at spi0.1
 */

/dts-v1/;
/plugin/;

/ {
    compatible = "brcm,bcm2835", "brcm,bcm2836", "brcm,bcm2708", "brcm,bcm2709"; 

    /* disable spi-dev for spi0.1 */
    fragment@0 {
        target = <&spi0>;
        __overlay__ {
            status = "okay";
            spidev@1{
                status = "disabled";
            };
        };
    };

    /* the spi config of the at25 */
    fragment@1 {
        target = <&spi0>;
        __overlay__ {
            #address-cells = <1>;
            #size-cells = <0>;
            flash: m25p80@1 {
                    compatible = "atmel,at25df321a";
                    reg = <1>;
                    spi-max-frequency = <50000000>;

                    /* default to false:
                    m25p,fast-read ;
                    */
            };
        };
    };

    __overrides__ {
        spimaxfrequency = <&flash>,"spi-max-frequency:0";
        fastread = <&flash>,"m25p,fast-read?";
    };
};

Ary andalana hafa ao amin'ny config.txt

dtoverlay=at25:spimaxfrequency=50000000

Hafoiko ny famaritana ny fampifandraisana ny chip amin'ny Raspberry Pi. Amin'ny lafiny iray, tsy manam-pahaizana momba ny elektronika aho, amin'ny lafiny iray, ny zava-drehetra eto dia banal na dia amiko aza: ny microcircuit dia manana tongotra 8 ihany, izay mila tany, hery, SPI (CS, SI, SO, SCK). ); ny haavony dia mitovy amin'ny an'ny Raspberry Pi, tsy misy tariby fanampiny ilaina - ampifandraiso fotsiny ireo tsipika 6 voalaza.

Fanambarana olana

Toy ny mahazatra, ny fanambarana olana dia mandeha amin'ny famerimberenana maromaro, ary toa ahy fa tonga ny fotoana ho an'ny manaraka. Koa aoka hajanontsika, hatambatra izay efa voasoratra, ary hanazava ny antsipiriany izay mijanona ao anaty aloka.

Noho izany, nanapa-kevitra izahay fa hotehirizina ao amin'ny SPI NOR Flash ny log.

Что такое NOR Flash для тех, кто не знает

Ity dia fahatsiarovana tsy miovaova izay ahafahanao manao asa telo:

  1. Famakiana:
    Ny vakiteny mahazatra indrindra: mampita ny adiresy izahay ary mamaky bytes betsaka araka izay ilainay;
  2. Firaketana:
    Ny fanoratana amin'ny NOR flash dia toy ny mahazatra, saingy manana ny mampiavaka azy: 1 ho 0 ihany no azonao ovaina, fa tsy ny mifamadika amin'izany. Ohatra, raha manana 0x55 ao anaty sela fitadidiana isika, dia aorian'ny fanoratana 0x0f aminy dia efa voatahiry ao ny 0x05. (jereo ny tabilao etsy ambany);
  3. Fafao:
    Mazava ho azy fa mila mahay manao ny mifanohitra amin'izany isika - manova 0 amin'ny 1, izany indrindra no ilàna ny famafana. Tsy toy ny roa voalohany izy io, fa tsy amin'ny bytes, fa amin'ny sakana (4kb ny sakana famafana kely indrindra amin'ny chip voafantina). Ny famafana dia manimba ny sakana iray manontolo ary io no hany fomba hanovana ny 0 ho 1. Noho izany, rehefa miasa amin'ny fitadidiana tselatra dia matetika ianao no tsy maintsy mampifanaraka ny rafitra angon-drakitra amin'ny sisin-tanin'ny famafana.
    Запись в NOR Flash:

Двоичные данные

dia
01010101

Записали
00001111

Lasa
00000101

Ny log dia maneho filaharan'ny firaketana miovaova halavany. Ny halavan'ny firaketana iray dia eo amin'ny 30 bytes (na dia misy firaketana iray kilobytes maromaro aza ny halavany indraindray). В данном случае мы работаем с ними просто как с набором байт, но, если интересно, внутри записей используется CBOR

Помимо журнала, нам нужно хранить некоторую «настроечную» информацию, как обновляемую, так и нет: некий ID аппарата, калибровки датчиков, флаг «аппарат временно отключен», etc.
Эта информация представляет из себя набор записей key-value, также хранится в CBOR.Этой информации у нас не очень много (максимум несколько килобайт), обновляется она нечасто.
В дальнейшем будем называть её контекстом.

Raha tadidintsika hoe taiza no niantombohan'ity lahatsoratra ity, dia tena zava-dehibe tokoa ny miantoka ny fitahirizana angon-drakitra azo antoka ary, raha azo atao, ny fandehanana mitohy na dia misy aza ny tsy fahombiazan'ny fitaovana/kolikoly angona.

Inona avy ireo loharanon-olana azo raisina?

  • Отключение питания в момент операций write/erase. Это из разряда «против лома нет приёма».
    Information avy amin'ny fifanakalozan-kevitra amin'ny stackexchange: rehefa tapaka ny herinaratra rehefa miasa miaraka amin'ny tselatra, dia samy mamafa (napetraka amin'ny 1) ary manoratra (napetraka amin'ny 0) dia mitarika amin'ny fitondran-tena tsy voafaritra: azo soratana ny angon-drakitra, soratana amin'ny ampahany (milaza hoe nafindra 10 bytes/80 bits izahay. , fa tsy mbola 45 bits ihany no azo soratana), azo atao ihany koa fa ny sasany amin'ireo bits dia ho ao amin'ny "intermediate" (ny famakiana dia afaka mamokatra 0 sy 1);
  • Error amin'ny fahatsiarovana tselatra mihitsy.
    BER хоть и очень низок, но не может быть равным нулю;
  • Error bus
    Ny angon-drakitra ampitaina amin'ny alàlan'ny SPI dia tsy voaaro amin'ny fomba rehetra; mety hitranga na ny fahadisoana kely tokana na ny fahadisoana amin'ny fampifanarahana - ny fahaverezana na ny fampidirana bits (izay mitarika amin'ny fanodikodinana angon-drakitra lehibe);
  • Прочие ошибки/сбои
    Hadisoana amin'ny kaody, glitches Raspberry, fitsabahan'ny vahiny...

Я сформулировал требования, выполнение которых, на мой взгляд, необходимо для обеспечения надёжности:

  • записи должны попадать во флеш-память сразу, отложенная запись не рассматривается;- если ошибка возникла, то она должна обнаруживаться и обрабатываться как можно раньше;- система должна по возможности восстанавливать работу после ошибок.
    (ohatra avy amin'ny fiainana "tsy tokony ho izy", izay heveriko fa nihaona tamin'ny rehetra: taorian'ny reboot maika, "simba" ny rafi-drakitra ary tsy mandeha ny rafitra fandidiana)

Hevitra, fomba fiasa, fisaintsainana

Rehefa nanomboka nieritreritra an'io olana io aho dia maro ny hevitra nipoitra tao an-dohako, ohatra:

  • использовать сжатие данных;
  • использовать хитрые структуры данных, например хранить заголовки записей отдельно от самих записей, чтобы при ошибке в какой-либо записи можно было без проблем прочитать остальные;
  • mampiasa saha kely hifehezana ny fahavitan'ny fandraisam-peo rehefa tapaka ny herinaratra;
  • mitahiry checksum ho an'ny zavatra rehetra;
  • mampiasa karazana kaody mahatohitra tabataba.

Часть этих идей была использована, от части было решено отказаться. Давайте по порядку.

Fahatsiarovana data

Ny zava-nitranga izay noraketintsika tao amin'ny diary dia mitovitovy ary azo averina ("nanoraka vola madinika 5 roubles", "nitsindry ny bokotra manome fiovana", ...). Noho izany, ny famatrarana dia tokony hahomby.

Накладные расходы на сжатие несущественны (процессор у нас достаточно мощный, даже на первом Pi было одно ядро с частотой 700МГц, на актуальных моделях несколько ядер с частотой свыше гигагерца), скорость обмена с хранилищем невысокая (несколько мегабайт в секунду), размер записей невелик. В общем, если сжатие и окажет влияние на производительность, то только положительное (tsy mitsikera mihitsy, milaza fotsiny). Плюс у нас же не настоящий embedded, а обычный Linux — так что реализация не должна потребовать много усилий (достаточно просто прилинковать библиотеку и использовать несколько функций из неё).

Ny ampahany amin'ny log dia nalaina avy amin'ny fitaovana miasa (1.7 MB, fidirana 70 arivo) ary nojerena voalohany ho an'ny compressibility amin'ny fampiasana gzip, lz4, lzop, bzip2, xz, zstd hita ao amin'ny solosaina.

  • gzip, xz, zstd показали близкие результаты (40Кб).
    Удивило, что модный xz показал тут себя на уровне gzip или zstd;
  • Ny lzip miaraka amin'ny fikandrana default dia nanome vokatra ratsy kokoa;
  • lz4 sy lzop dia nampiseho vokatra tsy dia tsara loatra (150Kb);
  • bzip2 dia nampiseho vokatra mahagaga (18Kb).

Noho izany, ny angon-drakitra dia voatsindry tsara.
Noho izany (raha tsy mahita lesoka mahafaty isika) dia hisy ny famoretana! Satria angon-drakitra bebe kokoa dia mety hifanaraka amin'ny kapila tselatra iray ihany.

Давайте подумаем о недостатках.

Olana voalohany: efa nifanaiky izahay fa tsy maintsy mandeha haingana avy hatrany ny rakitra rehetra. Amin'ny ankapobeny, ny archiver dia manangona angona avy amin'ny stream input mandra-pahitany fa tonga ny fotoana hanoratana amin'ny faran'ny herinandro. Mila mandray avy hatrany ny angon-drakitra voaporitra isika ary mitahiry izany ao anaty fitadidiana tsy miovaova.

Mahita fomba telo aho:

  1. Сжимать каждую запись с помощью словарного сжатия вместо рассмотренных выше алгоритмов.
    Safidy miasa tanteraka io, fa tsy tiako. Mba hiantohana ny haavon'ny fanerena bebe kokoa na latsaka, ny rakibolana dia tsy maintsy "amboarina" amin'ny angon-drakitra manokana; Ny fiovana rehetra dia hitarika amin'ny haavon'ny fanerena hidina be. Eny, ny olana dia azo voavaha amin'ny famoronana dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikandikan-dikandikan-dikandikan-dikandikan-dikan-dikandikan-dikandikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikan-dikanteny rehetra; isaky ny fidirana dia ilaintsika ny manondro izay dikan-tenin'ny rakibolana nopotehina...
  2. Ampidiro ny rakitsoratra tsirairay amin'ny alàlan'ny algorithm "klasika", fa tsy miankina amin'ny hafa.
    Ny algorithm compression dinihina dia tsy natao hiasa amin'ny firaketana an'io habe io (bytes am-polony), ny tahan'ny famatrarana dia ho latsaky ny 1 (izany hoe, mampitombo ny habetsaky ny data fa tsy manindry);
  3. Manaova FLUSH aorian'ny fandraisam-peo tsirairay.
    Trano famakiam-boky maro no manohana ny FLUSH. Ity dia baiko (na mari-pamantarana amin'ny fomba famatrarana), rehefa mahazo izay ny archiver dia mamorona stream voaporitra mba ho azo ampiasaina hamerenana amin'ny laoniny. ny rehetra angon-drakitra tsy voatsindry izay efa voaray. Analogue toy izany sync amin'ny rafitra fichier na commit amin'ny sql.
    Ny zava-dehibe dia ny fampandehanana famoretana manaraka dia afaka mampiasa ny rakibolana voaangona ary ny tahan'ny famatrarana dia tsy hijaly be toy ny tamin'ny dikan-teny teo aloha.

Думаю очевидно, что я выбрал третий вариант, остановимся на нём подробнее.

HITA lahatsoratra lehibe momba ny FLUSH amin'ny zlib.

Nanao fitsapana lohalika mifototra amin'ny lahatsoratra aho, naka 70 logs avy amin'ny fitaovana tena izy, miaraka amin'ny haben'ny pejy 60Kb (hiverina amin'ny haben'ny pejy isika rehefa avy eo) nahazo:

Data matevina
Compression gzip -9 (tsy misy FLUSH)
zlib miaraka amin'ny Z_PARTIAL_FLUSH
zlib miaraka amin'ny Z_SYNC_FLUSH

Volume, KB
1692
40
352
604

Raha vao jerena aloha dia lafo be ny vidin'ny FLUSH, fa raha ny tena izy dia tsy manan-tsafidy isika - na ny tsy hanery mihitsy, na ny hanery (ary tena mahomby) amin'ny FLUSH. Tsy tokony hohadinointsika fa manana rakitra 70 arivo isika, 4-5 bytes isaky ny rakitsoratra fotsiny ny redundancy nampidirin'i Z_PARTIAL_FLUSH. Ary ny tahan'ny famatrarana dia efa ho 5: 1, izay mihoatra noho ny vokatra tsara.

Mety ho mahagaga izany, fa ny Z_SYNC_FLUSH dia fomba mahomby kokoa hanaovana FLUSH

Rehefa mampiasa Z_SYNC_FLUSH dia 4x0, 00x0, 00xff, 0xff, 0xff, 324xff, ny XNUMX farany farany amin'ny fidirana tsirairay. Ary raha fantatsika izy ireo, dia tsy mila mitahiry azy ireo isika, ka ny habe farany dia XNUMXKb ihany.

Misy fanazavana ilay lahatsoratra nampifandraisiko taminy:

Misy bloc karazany 0 vaovao misy votoaty foana no ampiana.

Ny karazana bloc 0 misy votoaty foana dia ahitana:

  • ny lohatenin'ny sakana telo bit;
  • 0 ka hatramin'ny 7 bit mitovy amin'ny aotra, mba hahatratrarana alignment byte;
  • the four-byte sequence 00 00 FF FF.

Araka ny hitanao mora, ao amin'ny bloc farany alohan'ireo 4 bytes ireo dia misy 3 ka hatramin'ny 10 zero bits. Na izany aza, ny fanazaran-tena dia naneho fa raha ny marina dia misy farafahakeliny 10 zero bits.

Raha ny fandehany fa ny sakana fohy toy izany dia matetika (foana?) voakodia mampiasa sakana karazana 1 (fixed block), izay tsy maintsy mifarana amin'ny 7 zero bits, manome total 10-17 antoka zero bits (ary ny sisa dia ho ho aotra amin'ny mety ho 50%).

Noho izany, amin'ny angon-drakitra fitsapana, amin'ny 100% amin'ny tranga dia misy byte aotra iray alohan'ny 0x00, 0x00, 0xff, 0xff, ary amin'ny ampahatelon'ny tranga dia misy aotra roa. (возможно, дело в том, что я использую бинарный CBOR, а при использовании текстового JSON чаще встречались бы блоки типа 2 — dynamic block, соответсвенно встречались бы блоки без дополнительных нулевых байт перед 0x00, 0x00, 0xff, 0xff).

Amin'ny fitambarany, amin'ny fampiasana ny angona fitsapana misy, dia azo atao ny miditra amin'ny angona voaporitra latsaky ny 250Kb.

Можно сэкономить ещё немного, занявшись жонглированием битами: сейчас мы игнорируем наличие нескольких нулевых бит в конце блока, несколько бит в начале блока также не меняются…
Saingy avy eo dia nandray fanapahan-kevitra mahery vaika aho mba hijanona, raha tsy izany dia mety hiafara amin'ny famolavolana ny arsiva manokana aho.

Amin'ny fitambarany, avy amin'ny angona fitsapana nataoko dia nahazo 3-4 bytes isaky ny fanoratana aho, ny tahan'ny famatrarana dia nihoatra ny 6: 1. Ho marin-toetra aho: tsy nanantena vokatra toy izany aho; raha ny hevitro, ny zavatra tsara kokoa noho ny 2: 1 dia efa vokatra izay manamarina ny fampiasana ny fanerena.

Всё отлично, но zlib (deflate) — всё-таки архаичный заслуженный и немного старомодный алгоритм сжатия. Уже одно то, что в качестве словаря используются последние 32Кб из потока несжатых данных, сегодня выглядит странным (то есть если какой-то блок данных очень похож на то, что было во входном потоке 40Кб назад, то он начнёт архивироваться заново, а не будет ссылаться на прошлое вхождение). В модных современных архиваторах размер словаря чаще измеряется мегабайтами, а не килобайтами.

Так что продолжаем наше мини-исследование архиваторов.

Следующим был опробован bzip2 (напоминаю, без FLUSH он показал фантастическую степень сжатия, почти 100:1). Увы, с FLUSH он показал себя очень плохо, размер сжатых данных оказался больше, чем несжатых.

Ny eritreritro momba ny anton'ny tsy fahombiazana

Libbz2 предлагает всего один вариант flush, который, похоже, очищает словарь (аналог Z_FULL_FLUSH в zlib), говорить о каком-то эффективном сжатии после этого не приходится.

Ary ny farany notsapaina dia zstd. Miankina amin'ny masontsivana, dia manindry na amin'ny haavon'ny gzip izy io, saingy haingana kokoa, na tsara kokoa noho ny gzip.

Indrisy, miaraka amin'ny FLUSH dia tsy dia nahomby loatra izy io: manodidina ny 700Kb ny haben'ny angona voaporitra.

Я nametraka fanontaniana на странице проекта в github, получил ответ, что стоит рассчитывать на до 10 байт служебных данных на каждый блок сжатых данных, что близко к полученным результатам, догнать deflate никак не получится.

На этом я решил остановиться в экспериментах с архиваторами (напомню, xz, lzip, lzo, lz4 не показали себя ещё на этапе тестирования без FLUSH, а рассматривать более экзотические алгоритмы сжатия я не стал).

Возвращаемся к проблемам архивации.

Ny olana faharoa (araka ny filaharan'izy ireo fa tsy amin'ny sandany) dia ny angon-drakitra voaporitra dia renirano tokana, izay misy fanondroana tsy tapaka amin'ny fizarana teo aloha. Noho izany, raha simba ny ampahany amin'ny angon-drakitra voaporitra, tsy ny sakana mifandraika amin'ny angon-drakitra tsy voatsindry ihany no very, fa ny manaraka rehetra.

Misy fomba hamahana ity olana ity:

  1. Misoroka ny olana tsy hitranga - ampio ny redundancy amin'ny angon-drakitra voatsindry, izay ahafahanao mamantatra sy manitsy ny lesoka; hiresaka momba izany isika any aoriana;
  2. Минимизировать последствия в случае возникновения проблемы
    Мы уже говорили ранее, что можно каждый блок данных сжимать независимо, при этом проблема исчезнет сама собой (порча данных одного блока приведёт к потере данных только этого блока). Однако, это крайний случай, при котором сжатие данных будет неэффективно. Противоположная крайность: использовать все 4Мб нашей микросхемы как единый архив, что даст нам отличное сжатие, но катастрофические последствия в случае порчи данных.
    Eny, ilaina ny marimaritra iraisana amin'ny resaka fahatokisana. Saingy tsy maintsy tsaroantsika fa mamolavola endrika fitahirizana angon-drakitra ho an'ny fitadidiana tsy miovaova miaraka amin'ny BER faran'izay ambany ary fe-potoana fitahirizana data nambara 20 taona.

В процессе экспериментов я обнаружил, что более-менее заметные потери уровня сжатия начинаются на блоках сжатых данных рамером менее 10Кб.
Efa voalaza teo aloha fa pejy ny fahatsiarovana ampiasaina; Tsy hitako izay antony tsy tokony hampiasana ny taratasin'ny "pejy iray - sakana iray amin'ny angon-drakitra voaporitra".

Izany hoe, 16Kb (miaraka amin'ny tahiry ho an'ny fampahalalana momba ny serivisy) ny habe ambany indrindra amin'ny pejy antonony. Na izany aza, ny haben'ny pejy kely toy izany dia mametraka fameperana lehibe amin'ny haben'ny rakitra ambony indrindra.

Na dia mbola tsy manantena firaketana lehibe kokoa noho ny kilobytes vitsivitsy amin'ny endrika voaporitra aza aho, dia nanapa-kevitra ny hampiasa pejy 32Kb aho (amin'ny fitambaran'ny pejy 128 isaky ny chip).

famintinana:

  • Mitahiry angona voatsindry mampiasa zlib (deflate);
  • Ho an'ny fidirana tsirairay dia mametraka Z_SYNC_FLUSH izahay;
  • Ho an'ny rakitsoratra voatsindry tsirairay dia tapahinay ny bytes manaraka (oh: 0x00, 0x00, 0xff, 0xff); ao amin'ny lohapejy dia manondro ny isan'ny bytes tapaka;
  • Mitahiry angona amin'ny pejy 32Kb izahay; misy angon-drakitra voaporitra tokana ao anatin'ny pejy; Amin'ny pejy tsirairay dia manomboka indray ny famatrarana.

Ary, alohan'ny hamaranana ny famatrarana, tiako ny hisarika ny sainao ho amin'ny zava-misy fa ny angon-drakitra voatsindry vitsy monja no ananantsika isaky ny firaketana, noho izany dia zava-dehibe tokoa ny tsy hampisondrotra ny fampahalalana momba ny serivisy, isaky ny byte no isaina eto.

Mitahiry Lohatenin'ny Data

Koa satria manana firaketana amin'ny halavany miovaova isika, dia mila mamaritra ny fametrahana/faritra firaketana.

Mahafantatra fomba telo aho:

  1. Ny rakitra rehetra dia voatahiry ao anaty renirano mitohy, voalohany misy lohapejy misy ny halavany, ary avy eo ny rakitsoratra.
    Amin'ity endrika ity, ny lohateniny sy ny angona dia mety ho miovaova ny halavany.
    Amin'ny ankapobeny, mahazo lisitra mifandray tokana izay ampiasaina amin'ny fotoana rehetra;
  2. Ny lohapejy sy ny firaketana mihitsy dia voatahiry ao anaty renirano misaraka.
    Amin'ny fampiasana lohapejy misy halavany tsy tapaka, dia miantoka izahay fa tsy hisy fiantraikany amin'ny hafa ny fahasimbana amin'ny lohapejy iray.
    Fomba iray mitovy amin'izany no ampiasaina, ohatra, amin'ny rafi-drakitra maro;
  3. Ny rakitra dia voatahiry ao anaty stream mitohy, ny sisin'ny rakitra dia faritana amin'ny alàlan'ny marika iray (karazana / filaharan'ny endri-tsoratra izay voarara ao anatin'ny sakana data). Raha misy marika ao anatin'ilay rakitsoratra, dia soloinay amin'ny filaharana izany (escap it).
    Fomba iray mitovy amin'izany no ampiasaina, ohatra, ao amin'ny protocol PPP.

Проиллюстрирую.

Option 1:
Ny fampiharana ny buffer peratra amin'ny NOR flash
Тут всё очень просто: зная длину записи мы можем вычислить адрес следующего заголовка. Так мы перемещаемся по заголовкам, пока не встретим область, заполненную 0xff (свободную область) или конец страницы.

Option 2:
Ny fampiharana ny buffer peratra amin'ny NOR flash
Из-за переменной длины записи мы не можем заранее сказать как много записей (а значит и заголовков) на страницу нам потребуется. Можно разнести заголовки и сами данные по разным страницам, но мне симпатичнее другой подход: и заголовки, и данные размещаем на одной странице, однако заголовки (постоянного размера) у нас идут от начала страницы, а данные (переменной длины) — от конца. Как только они «встретятся» (свободного места не хватит на новую запись) — считаем эту страницу заполненной.

Option 3:
Ny fampiharana ny buffer peratra amin'ny NOR flash
Tsy ilaina ny mitahiry ny halavany na ny fampahalalana hafa momba ny toerana misy ny angon-drakitra ao amin'ny lohapejy; ny marika manondro ny sisin'ny rakitra dia ampy. Na izany aza, ny angona dia tsy maintsy karakaraina rehefa manoratra/mamaky.
В качестве маркера я бы использовал 0xff (которым заполнена страница после erase), таким образом свободная область точно не будет трактоваться как данные.

Сравнительная таблица:

Option 1
Option 2
Option 3

Fandeferana diso
-
+
+

hakitroky
+
-
+

Sarotra ny fampiharana
*
**
**

Ny safidy 1 dia misy lesoka mahafaty: raha misy simba ny lohapejy, dia potika ny rojo manaraka. Ny safidy sisa dia ahafahanao mamerina ny angon-drakitra sasany na dia misy fahasimbana goavana aza.
Saingy eto dia mety ny mitadidy fa nanapa-kevitra ny hitahiry ny angon-drakitra amin'ny endrika compressed izahay, ary noho izany dia very ny angon-drakitra rehetra ao amin'ny pejy taorian'ny firaketana "tapaka", ka na dia misy minus aza ao amin'ny latabatra dia tsy manao izany izahay. raiso izany.

Compactness:

  • Ao amin'ny safidy voalohany dia mila mitahiry ny halavany ao amin'ny lohapejy ihany isika, raha mampiasa integer miovaova ny halavany, dia amin'ny ankamaroan'ny tranga dia afaka mahazo amin'ny byte iray isika;
  • во втором варианте нам нужно хранить начальный адрес и длину; запись должна быть постоянного размера, я оцениваю в 4 байта на запись (два байта на смещение, и два байта на длину);
  • ny safidy fahatelo dia mila tarehin-tsoratra iray ihany mba hanondroana ny fanombohan'ny fandraisam-peo, miampy ny firaketana mihitsy dia hitombo 1-2% noho ny fiarovana. Amin'ny ankapobeny, mifanaraka amin'ny safidy voalohany.

Tany am-boalohany dia noheveriko ho ny safidy faharoa ho lehibe indrindra (ary nanoratra ny fampiharana mihitsy aza). Nandao azy io aho rehefa nanapa-kevitra ny hampiasa famatrarana.

Angamba indray andro any dia mbola hampiasa safidy mitovy amin'izany aho. Ohatra, raha tsy maintsy miatrika fitahirizana angon-drakitra ho an'ny sambo mandeha eo anelanelan'ny Tany sy Mars aho, dia hisy fepetra hafa tanteraka ho an'ny fahamendrehana, taratra cosmic, ...

Raha ny safidy fahatelo: Nomeko kintana roa izy io noho ny fahasarotan'ny fampiharana fotsiny satria tsy tiako ny mikorontana amin'ny fiarovana, manova ny halavan'ny dingana, sns. Eny, mety mitongilana aho, fa tsy maintsy manoratra ny kaody - maninona no manery ny tenanao hanao zavatra tsy tianao.

famintinana: Mifidy ny safidy fitehirizana amin'ny endrika rojo "header amin'ny halavany - angon-drakitra amin'ny halavany miovaova" noho ny fahombiazany sy ny fanamorana ny fampiharana.

Mampiasa Bit Fields hanaraha-maso ny fahombiazan'ny asa fanoratana

Tsy tadidiko hoe taiza no nahazoako ilay hevitra, fa toa izao:
Для каждой записи выделяем несколько бит для хранения флагов.
Как мы говорили ранее, после erase все биты заполнены 1, и мы можем изменять 1 на 0, но не наоборот. Noho izany ho an'ny "tsy napetraka ny sainam-pirenena" dia mampiasa 1 isika, ho an'ny "fametrahana ny saina" dia mampiasa 0 isika.

Toy izao ny mety ho endriky ny fametrahana rakitsoratra miovaova-lava amin'ny tselatra:

  1. Устанавливаем флаг “запись длины началась”;
  2. Raketo ny halavany;
  3. Apetraho ny saina "nanomboka ny firaketana an-tsoratra";
  4. Записываем данные;
  5. Apetraho ny saina "tapitra ny firaketana".

Кроме этого, у нас будет флаг “произошла ошибка”, итого 4 битовых флага.

Amin'ity tranga ity, manana fanjakana stable roa izahay "1111" - tsy nanomboka ny firaketana ary "1000" - nahomby ny firaketana; raha misy fahatapahana tsy ampoizina amin'ny fizotry ny fandraisam-peo, dia hahazo fanjakana mpanelanelana isika, izay azontsika tsikaritra sy karakaraina avy eo.

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

famintinana: идём дальше в поисках хорошего решения.

Checksums

Контрольные суммы тоже дают возможность удостовериться (с достаточной вероятностью) что мы читаем именно то, что должно было быть записано. И, в отличие от рассмотренных выше битовых полей, они работают всегда.

Raha mandinika ny lisitry ny mety ho loharanon'ny olana noresahintsika tetsy ambony isika, dia afaka mamantatra fahadisoana ny checksum na inona na inona fiaviany. (за исключением, пожалуй, злокозненных инопланетян — те могут подделать и контрольную сумму тоже).

Ka raha ny hanamarina ny angon-drakitra no tanjonay dia hevitra tsara ny checksum.

Выбор алгоритма вычисления контрольной суммы вопросов не вызывал — CRC. С одной стороны, математические свойства позволяют в 100% ловить ошибки некоторых типов, с другой — на случайных данных обычно этот алгоритм показывает вероятность коллизий не сильно больше теоретического предела Ny fampiharana ny buffer peratra amin'ny NOR flash. Mety tsy ny algorithm haingana indrindra, ary tsy ny kely indrindra amin'ny isan'ny fifandonana, fa manana toetra tena manan-danja izy io: tamin'ny fitsapana hitako dia tsy nisy lamina izay tsy nahomby. Ny fahamarinan-toerana no tena kalitao amin'ity tranga ity.

Ohatra amin'ny fandalinana volumetric: ampahany amin'ny 1, ampahany amin'ny 2 (ссылки на narod.ru, извините).

Na izany aza, ny andraikitry ny fifantenana ny checksum dia tsy vita; CRC dia fianakaviana iray manontolo ny checksum. Mila manapa-kevitra momba ny halavany ianao, ary avy eo misafidy polynomial.

Выбор длины контрольной суммы не такой простой вопрос, как кажется с первого взгляда.

Проиллюстрирую:
Aoka isika hanana ny mety hisian'ny fahadisoana amin'ny byte tsirairay Ny fampiharana ny buffer peratra amin'ny NOR flash ary ny checksum tsara indrindra, andao kajy ny salan'isan'ny lesoka isaky ny rakitra an-tapitrisany:

Данные, байт
Контрольная сумма, байт
Необнаруженных ошибок
Ложных обнаружений ошибок
Fiaraha-miasa diso tanteraka

1
0
1000
0
1000

1
1
4
999
1003

1
2
F0
1997
1997

1
4
F0
3990
3990

10
0
9955
0
9955

10
1
39
990
1029

10
2
F0
1979
1979

10
4
F0
3954
3954

1000
0
632305
0
632305

1000
1
2470
368
2838

1000
2
10
735
745

1000
4
F0
1469
1469

Toa tsotra ny zava-drehetra - miankina amin'ny halavan'ny angon-drakitra arovana, safidio ny halavan'ny checksum miaraka amin'ny lafy tsaran'ny tsy mety - ary ao anaty kitapo ny fika.

Na izany aza, misy olana mipoitra amin'ny checksum fohy: na dia mahay mamantatra lesoka kely tokana aza izy ireo, dia afaka manaiky ny angon-drakitra kisendrasendra ho marina izy ireo miaraka amin'ny mety ho avo. Efa nisy lahatsoratra momba an'i Habré namariparitra проблему в реальной жизни.

Поэтому, чтобы сделать случайное совпадение контрольной суммы практически невозможным, нужно использовать контрольные суммы длиной 32 бита и более (ho an'ny halavany mihoatra ny 64 bits dia matetika ny fiasan'ny hash cryptographic).

Несмотря на то, что ранее я писал, что нужно экономить место всеми силами, всё-таки будем использовать 32-битную контрольную сумму (16 бит мало, вероятность коллизии больше 0.01%; а 24 бита, как говорится, ни туда и ни сюда).

Mety hipoitra eto ny fanoherana: notahirizinay ve ny byte tsirairay rehefa nisafidy ny compression mba hanomezana 4 byte indray izao? tsy aleo ve tsy compresse na asiana checksum? Mazava ho azy fa tsy, tsy misy famatrarana tsy midika, fa tsy mila fanamarinana ny fahamendrehana isika.

Rehefa misafidy polynomial isika dia tsy hamerina ny kodiarana, fa haka ny CRC-32C malaza ankehitriny.
Ity kaody ity dia mahita lesoka 6 bit eo amin'ny fonosana hatramin'ny 22 bytes (angamba ny tranga mahazatra indrindra ho antsika), 4 bit errors amin'ny fonosana hatramin'ny 655 bytes (tranga mahazatra antsika ihany koa), 2 na izay mety ho fahadisoana kely amin'ny fonosana. amin'ny halavany mety.

Raha misy liana amin'ny antsipiriany

Lahatsoratra Wikipedia momba ny CRC.

Ireo singa mifandraika amin'ny CRC-32C amin'ny tranonkala Koopman — angamba ny manam-pahaizana manokana momba ny CRC eto an-tany.

В ny lahatsorany dia ещё один интересный код, izay manome mari-pamantarana somary tsara kokoa ho an'ny halavan'ny fonosana izay mifandraika aminay, saingy tsy noheveriko ho zava-dehibe ny fahasamihafana, ary nahay nisafidy kaody mahazatra aho fa tsy ilay mahazatra sy voadinika tsara.

Ary koa, satria voaporitra ny angonay, dia mipoitra ny fanontaniana hoe: tokony kajy ve ny checksum amin'ny angon-drakitra voaporitra na tsy voafehy?

Tohan-kevitra manohana ny kajy ny checksum ny angona tsy voafehy:

  • нам в конечном итоге нужно проверить сохранность хранения данных — вот мы её напрямую и проверяем (при этом будут заодно проверены возможные ошибки в реализации компрессии/декомпрессии, повреждения, вызванные битой памятью и т.п.);
  • алгоритм deflate в zlib имеет достаточно зрелую реализацию и tsy tokony падать при «кривых» входных данных, более того, зачастую он способен самостоятельно обнаружить ошибки во входном потоке, снизив общую вероятность необнаружения ошибки (провёл тест с инвертированием одиночного бита в короткой записи, zlib обнаружил ошибку примерно в трети случаев).

Hevitra manohitra ny kajy ny checksum ny angona tsy voafehy:

  • Ny CRC dia "namboarina" manokana ho an'ireo lesoka vitsivitsy izay mampiavaka ny fitadidiana tselatra (ny hadisoana kely amin'ny renirano voaporitra dia mety hiteraka fiovana goavana amin'ny renirano mivoaka, izay, amin'ny teny ara-teorika fotsiny, dia afaka "misambotra" fifandonana);
  • Tsy tiako loatra ilay hevitra handefasana angon-drakitra mety ho tapaka amin'ny decompressor, Iza no mahalalaahoana no hataony.

Amin'ity tetikasa ity, nanapa-kevitra ny hiala amin'ny fomba fanao ekena amin'ny ankapobeny aho amin'ny fitehirizana checksum amin'ny angona tsy voafehy.

famintinana: Mampiasa CRC-32C izahay, kajy ny checksum avy amin'ny angon-drakitra amin'ny endrika izay nanoratana azy ho tselatra (aorian'ny fanerena).

Fiverimberenana

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

Afaka mampiasa karazana redundancy isan-karazany isika hanitsiana ny lesoka.
Ny kaody Hamming dia afaka manitsy ny lesoka kely tokana, ny kaody tarehin-tsoratra Reed-Solomon, ny dika mitovy amin'ny angon-drakitra mitambatra amin'ny checksum, na ny kaody toy ny RAID-6 dia afaka manampy amin'ny famerenana ny angona na dia misy aza ny kolikoly goavana.
Изначально я был настроен на широкое использование помехоустойчивого кодирования, но потом понял, что сначала нужно иметь представление от каких ошибок мы хотим защититься, а потом уже выбирать кодирование.

Мы говорили ранее, что ошибки нужно выявлять как можно быстрее. В какие моменты мы можем столкнуться с ошибками?

  1. Fandraketana tsy vita (noho ny antony sasany tamin'ny fotoana nanoratana dia tapaka ny herinaratra, nivaingana ny Raspberry, ...)
    Indrisy, raha misy hadisoana toy izany, ny hany sisa tavela dia ny tsy miraharaha ireo firaketana tsy manan-kery ary mandinika ny angon-drakitra very;
  2. Soraty ny hadisoana (noho ny antony sasany, izay nosoratana tamin'ny fahatsiarovana tselatra dia tsy izay nosoratana)
    Afaka mahita ny fahadisoana toy izany avy hatrany isika raha manao andrana mamaky avy hatrany rehefa avy nandrakitra;
  3. Fanodinkodinana ny angona ao anaty fitadidiana mandritra ny fitahirizana;
  4. Fahadisoana mamaky
    Для исправления достаточно в случае несовпадения контрольной суммы несколько раз повторить чтение.

То есть только ошибки третьего типа (самопроизвольная порча данных при хранении) не могут быть исправлены без помехоустойчивого кодирования. Думается, подобные ошибки всё-таки крайне маловероятны.

famintinana: dia nanapa-kevitra ny handao ny redundant coding, fa raha ny fandidiana mampiseho ny fahadisoana ny fanapahan-kevitra, dia miverena handinika ny olana (miaraka amin'ny antontan'isa efa nanangona ny tsy fahombiazana, izay mamela ny fisafidianana ny tsara indrindra karazana coding).

Прочее

Mazava ho azy fa ny endriky ny lahatsoratra dia tsy mamela antsika hanamarina ny bitika rehetra amin'ny endrika (ary efa lany ny heriko), noho izany dia hojereko fohifohy ny teboka sasany tsy voaresaka teo aloha.

  • Tapa-kevitra ny hanao "mitovy" ny pejy rehetra
    Izany hoe, tsy hisy pejy manokana misy metadata, kofehy misaraka, sns, fa kofehy tokana izay mamerina manoratra ny pejy rehetra.
    Izany dia miantoka na dia eo amin'ny pejy aza, tsy misy teboka tsy fahombiazana, ary tiako izany;
  • Tena ilaina ny manome versioning ny endrika.
    Ratsy ny endrika tsy misy laharana dikan-teny amin'ny lohapejy!
    Достаточно добавить в заголовок страницы поле с неким Magic Number (сигнатурой), которое будет указывать на используемую версию формата (Tsy mieritreritra aho fa amin'ny fampiharana dia hisy na dia am-polony aza);
  • Mampiasà lohan-doha miovaova ho an'ny firaketana (izay be dia be), miezaka ny manao azy ho 1 byte lava amin'ny ankamaroan'ny tranga;
  • Raha te hanakodia ny halavan'ny lohapejy sy ny halavan'ny ampahany voatetika amin'ny rakitra voatsindry dia ampiasao kaody binary miovaova halavany.

Nanampy betsaka онлайн-генератор Huffman codes. Tao anatin'ny minitra vitsy monja dia afaka nifantina ireo kaody halava miovaova ilaina.

Famaritana ny endrika fitahirizana angona

baiko byte

Ny saha lehibe kokoa noho ny bita iray dia voatahiry amin'ny endrika big-endian (filaharana byte tamba-jotra), izany hoe 0x1234 dia nosoratana ho 0x12, 0x34.

Pagination

Ny fahatsiarovana tselatra rehetra dia zaraina ho pejy mitovy habe.

Ny haben'ny pejy default dia 32Kb, fa tsy mihoatra ny 1/4 amin'ny totalin'ny haben'ny puce fahatsiarovana (ho an'ny puce 4MB, pejy 128 no azo).

Каждая страница хранит данные независимо от других (то есть данные одной страницы не ссылаются на данные другой страницы).

Все страницы пронумерованы в естественном порядке (в порядке возрастания адресов), начиная с номера 0 (нулевая страница начинается с адреса 0, первая — с 32Кб, вторая — с 64Кб и т.д.)

Микросхема памяти используется как циклический буфер (ring buffer), то есть сначала запись идёт в страницу с номером 0, потом с номером 1, …, когда мы заполняем последную страницу, то начинается новый цикл и запись продолжается с нулевой страницы.

Внутри страницы

Ny fampiharana ny buffer peratra amin'ny NOR flash
Eo am-piandohan'ny pejy, misy loham-pejy 4-byte voatahiry, avy eo ny lohapejy checksum (CRC-32C), avy eo ny rakitra dia voatahiry ao amin'ny endrika "header, data, checksum".

Ny lohatenin'ny pejy (maitso maloto amin'ny kisary) dia ahitana:

  • saha roa-byte Magic Number (famantarana ny endrika endrika ihany koa)
    ho an'ny dikan-teny ankehitriny amin'ny endrika dia kajy toy ny 0xed00 ⊕ номер страницы;
  • roa-byte counter "Page version" (memory namerina ny tsingerin'ny isa).

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

Каждая запись сжимется с флагом Z_SYNC_FLUSH, при этом в конце сжатого потока оказываются 4 байта 0x00, 0x00, 0xff, 0xff, предварённые, возможно, ещё одним или двумя нулевыми байтами.
Эту последовательность (длиной 4, 5 или 6 байт) мы отбрасываем при записи в флеш-память.

Ny lohatenin'ny firaketana dia 1, 2 na 3 bytes fitehirizana:

  • bit iray (T) manondro ny karazana firaketana: 0 - context, 1 - log;
  • saha miovaova halavany (S) avy amin'ny 1 ka hatramin'ny 7 bit, mamaritra ny halavan'ny lohapejy sy ny "rambony" izay tsy maintsy ampidirina amin'ny firaketana ny decompression;
  • halavan'ny firaketana (L).

Tabilao sanda S:

S
Halavan'ny lohateny, bytes
Ariana amin'ny fanoratana, byte

0
1
5 (00 00 00 ff ff)

10
1
6 (00 00 00 00 ff ff)

110
2
4 (00 00 ff ff)

1110
2
5 (00 00 00 ff ff)

11110
2
6 (00 00 00 00 ff ff)

1111100
3
4 (00 00 ff ff)

1111101
3
5 (00 00 00 ff ff)

1111110
3
6 (00 00 00 00 ff ff)

Niezaka nanazava aho, tsy fantatro hoe ahoana no nivoahan'izany:
Ny fampiharana ny buffer peratra amin'ny NOR flash
Жёлтым тут обозначено поле T, белым — поле S, зелёным L (длина сжатых данных в байтах), голубым — сжатые данные, красным — конечные байты сжатых данных, которые не пишутся во флеш-память.

Noho izany, afaka manoratra lohatenin'ny firaketana amin'ny halavany mahazatra indrindra isika (hatramin'ny 63+5 bytes amin'ny endrika compressed) amin'ny byte iray.

Aorian'ny firaketana tsirairay dia voatahiry ny checksum CRC-32C, izay ampiasaina ho sanda voalohany (init) ny sanda mivadika amin'ny checksum teo aloha.

Ny CRC dia manana ny "faharetan'ny fotoana", ity formula manaraka ity dia miasa (miampy na minus bit inversion amin'ny dingana): Ny fampiharana ny buffer peratra amin'ny NOR flash.
То есть фактически мы высчитываем CRC всех предыдущих байт заголовков и данных на этой странице.

Manaraka mivantana ny checksum no lohatenin'ny rakitsoratra manaraka.

Ny lohapejy dia natao tamin'ny fomba izay tsy mitovy foana amin'ny 0x00 sy 0xff ny byte voalohany (raha toa ka 0xff no mifanena amin'ny byte voalohany amin'ny lohapejy, dia midika izany fa faritra tsy ampiasaina ity; 0x00 dia manondro fahadisoana).

Ohatra algorithm

Famakiana avy amin'ny Flash Memory

Любое чтение идёт с проверкой контрольной суммы.
Если контрольная сумма не сошлась — чтение повторяется несколько раз в надежде прочитать-таки верные данные.

(это имеет смысл, Linux не кэширует чтение из NOR Flash, проверено)

Soraty amin'ny fahatsiarovana tselatra

Raketinay ny angona.
Andeha hovakiantsika izy ireo.

Raha tsy mifanaraka amin'ny angon-drakitra voasoratra ny angon-drakitra novakiana, dia fenoy aotra ny faritra ary manondro fahadisoana.

Manomana microcircuit vaovao ho an'ny fandidiana

Ho an'ny fanombohana dia misy lohapejy misy dikan-teny 1 voasoratra amin'ny pejy voalohany (na aotra kokoa).
Aorian'izay dia soratana amin'ity pejy ity ny contexte voalohany (misy ny UUID an'ny milina sy ny fikandrana default).

Всё, флеш-память готова к работе.

Загрузка автомата

Rehefa mampiditra dia vakiana ny 8 bytes voalohany amin'ny pejy tsirairay (lohateny + CRC), tsy raharahaina ny pejy misy laharana majika tsy fantatra na CRC diso.
Avy amin'ny pejy "marina", ny pejy misy dikan-teny ambony indrindra dia voafantina, ary ny pejy misy isa ambony indrindra dia alaina amin'izy ireo.
Vakina ny rakitsoratra voalohany, voamarina ny fahamarinan'ny CRC ary ny fisian'ny saina "context". Raha tsara daholo ny zava-drehetra, dia heverina ho amin'izao fotoana izao ity pejy ity. Raha tsy izany dia miverina amin'ny teo aloha isika mandra-pahitantsika pejy "mivantana".
ary eo amin'ny pejy hita dia mamaky ny firaketana rehetra, ireo izay ampiasaintsika miaraka amin'ny saina "context".
Tehirizo ny rakibolana zlib (ilaina amin'ny fampidirana ity pejy ity).

Izay ilay izy, vita ny fampidinana, naverina ny contexte, afaka miasa ianao.

Fanampiana diary

Сжимаем запись с правильным словарём, указывая Z_SYNC_FLUSH.Смотрим, помещается ли сжатая запись на текущей странице.
Если не помещается (или на странице были ошибки CRC) — начинаем новую страницу (см. ниже).
Manoratra ny firaketana sy ny CRC izahay. Raha misy hadisoana dia manomboka pejy vaovao.

Pejy vaovao

Mifidy pejy maimaim-poana miaraka amin'ny isa kely indrindra izahay (heverinay fa pejy iray misy checksum diso eo amin'ny lohapejy na misy dikan-teny latsaka noho ny ankehitriny ny pejy maimaim-poana). Raha tsy misy pejy toy izany dia fidio ny pejy misy isa kely indrindra avy amin'ireo izay manana dikan-teny mitovy amin'ny ankehitriny.
Делаем выбранной странице erase. Сверяем содержимое с 0xff. Если что-то не так — берём следующую свободную страницу, и т.д.
Manoratra lohapejy amin'ny pejy voafafa izahay, ny fidirana voalohany dia ny toe-javatra misy ankehitriny, ny manaraka dia ny fidirana amin'ny log tsy voasoratra (raha misy).

Fomba azo ampiharina

Raha ny hevitro dia lasa endrika tsara izy io amin'ny fitehirizana ireo onjam-baovao azo tsapain-tanana (lahatsoratra tsotra, JSON, MessagePack, CBOR, mety ho protobuf) ao amin'ny NOR Flash.

Mazava ho azy fa ny format dia "namboarina" ho an'ny SLC NOR Flash.

Его не стоит использовать с носителями с высоким BER, например NAND или MLC NOR (azo amidy ve ny fahatsiarovana toy izany? Hitako tamin'ny asa momba ny kaody fanitsiana ihany izy io).

Ankoatr'izay, tsy tokony hampiasaina amin'ny fitaovana manana ny FTL azy manokana: USB flash, SD, MicroSD, sns (ho an'ny fitadidiana toy izany dia namorona endrika misy pejy 512 bita aho, sonia eo am-piandohan'ny pejy tsirairay ary isa tokana firaketana - indraindray dia azo atao ny mamerina ny angon-drakitra rehetra avy amin'ny kapila tselatra "glitched" amin'ny famakiana tsotra misesy).

Miankina amin'ny asa, ny format dia azo ampiasaina tsy misy fiovana amin'ny kapila tselatra manomboka amin'ny 128Kbit (16Kb) mankany 1Gbit (128MB). Raha tianao dia azonao ampiasaina amin'ny chips lehibe kokoa izany, saingy mety mila manitsy ny haben'ny pejy ianao (Saingy efa mipoitra eto ny fanontaniana momba ny fahafaha-manao ara-toekarena; tsy mampirisika ny vidin'ny NOR Flash be dia be).

Raha misy olona mahita ilay endrika mahaliana ary te hampiasa izany amin'ny tetikasa misokatra, manorata, dia hiezaka ny hahita ny fotoana aho, hanala ny kaody ary handefa izany amin'ny github.

famaranana

Araka ny hitanao, tamin'ny farany dia nanjary tsotra ny endrika ary mankaleo aza.

Sarotra ny mitaratra ny fivoaran'ny fomba fijeriko amin'ny lahatsoratra iray, fa minoa ahy: tamin'ny voalohany dia te-hamorona zavatra saro-takarina, tsy azo rava, afaka mivelona na dia fipoahana nokleary aza eo akaiky. Na izany aza, ny antony (manantena aho) dia mbola nandresy ary nifindra tsikelikely ho amin'ny fahatsorana sy ny fahamatorana ny laharam-pahamehana.

Может ли получиться так, что я ошибся? Да, конечно. Вполне может оказаться, например, что мы закупили партию некачественных микросхем. Или по какой-то другой причине оборудование не оправдает ожидания по надёжности.

Есть ли у меня план на этот случай? Я думаю, что по прочтению статьи вы не сомневаетесь, что план есть. И даже не один.

Если чуть более серьёзно, формат разработан одновременно и как рабочий вариант, и как «пробный шар».

Amin'izao fotoana izao dia mandeha tsara ny zava-drehetra eo amin'ny latabatra, ara-bakiteny amin'ny andro hafa dia hapetraka ny vahaolana (eo ho eo) amin'ny fitaovana an-jatony, andeha hojerentsika ny zava-mitranga amin'ny hetsika "ady" (indrisy, manantena aho fa ny format dia mamela anao hamantatra ny tsy fahombiazana; mba hahafahanao manangona antontan'isa feno). Afaka volana vitsivitsy dia ho azo atao ny manatsoaka hevitra (ary raha tsy tsara vintana ianao, na dia teo aloha aza).

Если по итогам использования обнаружатся серьёзные проблемы и потребуются доработки, то я обязательно об этом напишу.

boky sy gazety

Tsy te hanao lisitra lava be momba ny asa efa nampiasaina aho; raha ny marina, manana Google ny rehetra.

Eto aho dia nanapa-kevitra ny hamela lisitr'ireo zavatra hita izay toa nahaliana ahy manokana, saingy nifindra tsikelikely tao amin'ny lahatsoratry ny lahatsoratra izy ireo, ary nisy singa iray nijanona tao amin'ilay lisitra:

  1. Utility infgen от автора zlib. Умеет в понятном виде отображать содержимое архивов deflate/zlib/gzip. Если вам приходится разбираться с внутренним устройством формата deflate (или gzip) — настоятельно рекомендую.

Source: www.habr.com

Add a comment