Kuitwa kwangu kwemhete buffer muNOR flash

prehistory

Kune michina yekutengesa yedhizaini yedu. Mukati meRaspberry Pi uye imwe wiring pane imwe bhodhi. Mugamuchiri wemari, anobvuma bhiri, bhangi terminal yakabatanidzwa ... Zvinhu zvose zvinodzorwa nepurogiramu yakanyorwa. Nhoroondo yese yebasa inonyorerwa kulogi pane flash drive (MicroSD), iyo inobva yaparidzirwa kuburikidza neInternet (uchishandisa USB modem) kune sevha, iyo inochengetwa mu database. Ruzivo rwekutengesa rwakaiswa mu1c, kune zvakare yakapusa yewebhu interface yekutarisa, nezvimwe.

Ndiko kuti, iro bhuku rakakosha - kune accounting (mari, kutengesa, nezvimwewo), kutarisa (ese marudzi ekutadza uye mamwe masimba majeure mamiriro); Izvi, mumwe angati, ndiwo ruzivo rwese rwatinarwo nezvemuchina uyu.

dambudziko

Flash Drives inozviratidza semidziyo isina kuvimbika. Vanokundikana neanoshuva nguva dzose. Izvi zvinotungamira kune ese ari maviri muchina nguva yekudzikira uye (kana nekuda kwechimwe chikonzero irogi harina kukwanisa kutamiswa online) mukurasikirwa nedata.

Ichi hachisi chiitiko chekutanga chekushandisa flash drives, izvi zvisati zvaitika pane imwe purojekiti ine zvigadzirwa zvinopfuura zana, apo magazini yakachengetwa pa USB flash drives, pakanga panewo matambudziko nekuvimbika, dzimwe nguva nhamba yeavo vakakundikana. mwedzi waiva mumakumi. Takaedza madhiraivha akasiyana siyana, kusanganisira ane mabranded ane SLC memory, uye mamwe mamodheru anovimbika kupfuura mamwe, asi kutsiva madhiraivha hakuna kugadzirisa dambudziko racho.

Cherechedza chinyorwa! Yakareba! Kana iwe usingafariri "nei", asi chete mu "sei", unogona kuenda zvakananga Pakupedzisira zvinyorwa.

chisarudzo

Chinhu chekutanga chinouya mupfungwa ndechekuti: siya MicroSD, isa, semuenzaniso, SSD, uye boot kubva mairi. Nechepfungwa zvinogoneka, pamwe, asi zvinodhura, uye zvisina kuvimbika (adapter ye-USB-SATA inowedzerwa; nhamba dzekutadza dzebhajeti SSDs hadzikurudzire).

USB HDD zvakare haina kutaridzika seyakanyanya kutaridzika mhinduro.

Naizvozvo, isu takasvika pane iyi sarudzo: siya kubhowa kubva kuMicroSD, asi shandisa iwo mukuverenga-chete modhi, uye chengetedza irogi rekuvhiya (uye rumwe ruzivo rwakasiyana kune chimwe chidimbu chehardware - serial nhamba, sensor calibrations, nezvimwewo) kumwewo. .

Тема read-only ФС для малинки уже изучена вдоль и поперёк, я не буду останавливаться на деталях реализации в этой статье (asi kana paine kufarira, pamwe ndichanyora mini-chinyorwa pane ino nyaya). Chinhu chimwe chete chandinoda kucherechedza ndechekuti zvese kubva pane zvakaitika pachedu uye kubva pawongororo yeavo vakatozviita, kune budiriro mukuvimbika. Ehe, hazvibviri kubvisa zvachose kuparara, asi zvakanyanya kuderedza kuwanda kwavo kunogoneka. Uye makadhi ari kubatana, izvo zvinoita kuti kutsiva kuve nyore kune vashandi vebasa.

Hardware

Pakanga pasina kukahadzika pamusoro pesarudzo yemhando yendangariro - NOR Flash.
Nharo:

  • простое подключение (чаще всего шина SPI, опыт использования которой уже есть, так что «железных» проблем не предвидится);
  • mutengo usina musoro;
  • standard inoshanda protocol (kushandiswa kwatove muLinux kernel, kana uchida, unogona kutora wechitatu-bato, iyo iripo, kana kutonyora yako, rombo rakanaka zvese zviri nyore);
  • kuvimbika uye zviwanikwa:
    kubva kune yakajairwa dhetabheti: data inochengeterwa makore makumi maviri, 20 erase cycles kune yega block;
    kubva kune wechitatu masosi: yakanyanya kuderera BER, inomiririra hapana chikonzero chekukanganisa makodhi makodhi (в некоторых работах рассматривается ECC для NOR, но обычно всё-таки там имеют в виду MLC NOR, бывает и такое).

Ngatitarisei zvinodikanwa zvevhoriyamu uye resource.

Хочется, чтобы гарантированно сохранялись данные за несколько дней. Нужно это для того, чтобы в случае каких-либо проблем со связью история продаж не была потеряна. Будем ориентироваться на 5 дней, за этот срок (kunyangwe uchifunga nezvekupera kwevhiki uye mazororo) dambudziko rinogona kugadziriswa.

Isu iye zvino tinounganidza anenge 100kb ematanda pazuva (3-4 zviuru zvinyorwa), asi zvishoma nezvishoma iyi nhamba iri kukura - iyo tsanangudzo iri kuwedzera, zviitiko zvitsva zviri kuwedzerwa. Uyezve, dzimwe nguva kune kuputika (imwe sensor inotanga spamming nenhema positives, semuenzaniso). Tichaverengera zviuru gumi zvinyorwa 10 bytes imwe neimwe - megabytes pazuva.

Pakazara, 5MB yeakachena (yakanyatso kumanikidzwa) data inobuda. Zvimwe kwavari (грубая прикидка) 1Мб служебных данных.

То есть нам нужна микросхема на 8Мб если не использовать сжатие, или 4Мб если использовать. Вполне реальные цифры для этого типа памяти.

Kana zviri zvekushandisa: kana tikaronga kuti chiyeuchidzo chose chichanyorwazve kwete kamwechete mazuva ose e5, zvino pamusoro pemakore gumi ebasa tinowana zvishoma kudarika chiuru chekunyorazve.
Rega ndikuyeuchidze kuti mugadziri anovimbisa zviuru zana.

Zvishoma nezve NOR vs NAND

Nhasi, hongu, chiyeuchidzo cheNAND chinonyanya kufarirwa, asi ini handingachishandise kune chirongwa ichi: NAND, kusiyana neNOR, inoda kushandiswa kwemakodhi ekugadzirisa kukanganisa, tafura yezvivharo zvakashata, nezvimwewo, uyewo makumbo e NAND machipisi anowanzo akawandisa.

Zvakaipa zveNOR zvinosanganisira:

  • vhoriyamu shoma (uye, maererano, mutengo wakakwira pa megabyte);
  • yakaderera kutaurirana kumhanya (zvikuru nekuda kwekuti serial interface inoshandiswa, kazhinji SPI kana I2C);
  • kudzima zvishoma (zvichienderana nehukuru hwebhuroka, zvinotora kubva pachikamu chesekondi kusvika kumasekonzi akati wandei).

Zvinoita sekuti hapana chinhu chakakosha kwatiri, saka tinoenderera mberi.

Kana iyo nhoroondo inonakidza, iyo microcircuit yakasarudzwa pa25df321a (впрочем, это несущественно, на рынке куча аналогов, совместимых по распиновке и системе команд; даже если мы захотим поставить микросхему одругого производителя и/или другого объёма, то всё заработает без изменения кода).

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

Muenzaniso dts faira

Kutaura chokwadi, handina chokwadi chekuti zvakanyorwa pasina zvikanganiso, asi zvinoshanda.

/*
 * 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?";
    };
};

И ещё строчка в config.txt

dtoverlay=at25:spimaxfrequency=50000000

Ini ndichasiya tsananguro yekubatanidza chip kuRaspberry Pi. Kune rumwe rutivi, ini handisi nyanzvi mune zvemagetsi, kune rumwe rutivi, zvinhu zvose pano zviri banal kunyange kwandiri: microcircuit ine makumbo 8 chete, ayo tinoda pasi, simba, SPI (CS, SI, SO, SCK). ); iwo mazinga akafanana neaya eRaspberry Pi, hapana yekuwedzera wiring inodiwa - ingobatanidza iyo yakaratidzwa 6 pini.

Kugadzirwa kwedambudziko

Semazuva ese, chirevo chedambudziko chinoenda nekudzokororwa kwakati wandei, uye zvinoratidzika kwandiri kuti yave nguva yeinotevera. Saka ngatimirei, toisa pamwe chete izvo zvakatonyorwa, uye tijekese mashoko akasara mumimvuri.

Saka, isu takasarudza kuti irogi richachengetwa muSPI NOR Flash.

Chii chinonzi NOR Flash kune avo vasingazive?

Ichi chiyeuchidzo chisiri-chinotenderera chaunogona kuita mashandiro matatu:

  1. Kuverenga:
    Kunyanya kuverenga: tinotumira kero uye tinoverenga mabheti akawanda sezvatinoda;
  2. Record:
    Kunyorera kuNOR flash kunoratidzika seyenguva dzose, asi ine imwe chete yakasarudzika: unogona kungochinja 1 kusvika 0, asi kwete zvinopesana. Semuenzaniso, kana isu taive ne0x55 musero yekurangarira, zvino mushure mekunyora 0x0f kwairi, 0x05 inenge yatochengetwa ipapo. (ona tafura iri pazasi);
  3. Dzima:
    Разумеется, нам нужно уметь делать и обратную операцию — менять 0 на 1, именно для этого и существует операция erase. В отличие от первых двух, она оперирует не байтами, а блоками (минимальный erase block в выбранной микросхеме — 4кб). Erase уничтожает весь блок целиком и это единственный способ поменять 0 на 1. Поэтому, при работе с флеш-памятью часто приходится выравнивать структуры данных на границу erase block.
    Kurekodha neNOR Flash:

Binary data

Zvanga zviri
01010101

Recorded
00001111

Zvave
00000101

Сам журнал представляет последовательность записей переменной длины. Типичная длина записи около 30 байт (хотя иногда случаются и записи длиной в несколько килобайт). Mune ino kesi, isu tinoshanda navo seti seti yemabheti, asi, kana uchifarira, CBOR inoshandiswa mukati mezvinyorwa.

Pamusoro peiyo logi, isu tinofanirwa kuchengetedza imwe "setting" ruzivo, zvese zvakagadziridzwa uye kwete: imwe mudziyo ID, sensor calibrations, "mudziyo wakaremara" mureza, nezvimwe.
Ruzivo urwu seti yemarekodhi akakosha, akachengetwawo muCBOR. Hatina ruzivo rwakawanda urwu (makirobhati mashoma zvakanyanya), uye anogadziridzwa kasingaperi.
Mune zvinotevera tichaidaidza kuti mamiriro.

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

Manyukoi ezvinetso anogona kurangarirwa?

  • Kudzima panguva yekunyora/kudzima mabasa. Izvi zvinobva muchikamu che "hapana hunyengeri hunopesana necrowbar."
    Информация из hurukuro pane stackexchange: kana simba radzimwa uchishanda neflash, zvese zviri zviviri dzima (kuiswa ku1) uye nyora (yakaiswa ku0) inotungamira kune isina kutsanangurwa maitiro: data inogona kunyorwa, yakanyorwa zvishoma (taura, takatamisa gumi bytes/10 bits. , asi kwete chete 80 bits inogona kunyorwa), zvinogonawo kuti mamwe mabhiti achange ari mu "pakati" mamiriro (kuverenga kunogona kubudisa zvose 45 uye 0);
  • Zvikanganiso mune flash memory pachayo.
    BER, kunyange yakaderera zvikuru, haigoni kuenzana ne zero;
  • Kukanganisa kwebhazi
    Dhata inofambiswa kuburikidza neSPI haina kuchengetedzwa neimwe nzira; zvese zviri zviviri zvikanganiso zvidiki uye zvikanganiso zvekuyananisa zvinogona kuitika - kurasikirwa kana kuisirwa mabits (izvo zvinotungamira mukukanganiswa kukuru kwedata);
  • Zvimwe zvikanganiso / glitches
    Zvikanganiso mukodhi, Raspberry glitches, kupindira kwevatorwa ...

Ndakagadzira zvinodikanwa, kuzadzikiswa kwazvo, mumaonero angu, kunofanirwa kuve nechokwadi chekuvimbika:

  • marekodhi anofanirwa kupinda muflash memory nekukasira, kunonoka kunyora hakutariswe; - kana chikanganiso chikaitika, chinofanira kuonekwa uye kugadziriswa nekukurumidza sezvinobvira; - iyo system inofanirwa, kana zvichibvira, kupora kubva mukukanganisa.
    (muenzaniso kubva kuhupenyu "zvisingafaniri kuva", izvo zvandinofunga kuti munhu wose akasangana nazvo: mushure mekugadzirisa kwechimbichimbi, iyo faira yefaira "yakaputsika" uye hurongwa hwekushanda hauiti boot)

Mazano, maitiro, fungidziro

Pandakatanga kufunga nezvedambudziko iri, pfungwa dzakawanda dzakapenya mumusoro mangu, semuenzaniso:

  • shandisa data compression;
  • shandisa akangwara data zvimiro, semuenzaniso, kuchengetedza misoro yerekodhi zvakasiyana kubva kune zvinyorwa ivo pachavo, kuitira kuti kana paine chikanganiso mune chero rekodhi, iwe unogona kuverenga zvakasara pasina matambudziko;
  • shandisa bit fields kudzora kupedzwa kwekurekodha kana simba radzimwa;
  • chengetedza macheki ezvose;
  • shandisa imwe mhando yekodha isingaite ruzha.

Dzimwe dzepfungwa idzi dzakashandiswa, nepo dzimwe dzakasarudzwa kuti dziregedzwe. Handei muhurongwa.

Dhata kumanikidza

Zviitiko izvo zvatinonyora mujenari zvakangofanana uye zvinodzokororwa ("akakanda 5 ruble coin", "akadzvanya bhatani rekupa shanduko", ...). Saka, compression inofanira kunyatsoshanda.

Iyo yekumanikidza pamusoro haina kukosha (yedu processor ine simba kwazvo, kunyangwe yekutanga Pi yaive nemusimboti ine frequency ye700 MHz, mamodheru azvino ane akati wandei macores ane frequency yeinopfuura gigahertz), mwero wekutsinhana nekuchengetedza wakaderera (zvinoverengeka. megabytes pasekondi), saizi yemarekodhi idiki. Kazhinji, kana kudzvanywa kuine chekuita nekuita, zvinongove zvakanaka. (hazvina kutsoropodza, kungotaura). Uyezve, isu hatina chaiyo yakamisikidzwa, asi yenguva dzose Linux - saka kuitisa hakufanire kuda kushanda nesimba (zvakakwana kungobatanidza raibhurari uye kushandisa akati wandei mabasa kubva mairi).

Chidimbu cherogi chakatorwa kubva kuchishandiso chinoshanda (1.7 MB, zviuru makumi manomwe zvakapinda) uye chakatanga kutariswa kuti chinobatika uchishandisa gzip, lz70, lzop, bzip4, xz, zstd inowanikwa pakombuta.

  • gzip, xz, zstd показали близкие результаты (40Кб).
    Удивило, что модный xz показал тут себя на уровне gzip или zstd;
  • lzip ine default marongero yakapa zvishoma zvakaipisisa mhedzisiro;
  • lz4 uye lzop yakaratidza zvisina kunaka mhedzisiro (150Kb);
  • bzip2 yakaratidza mhedzisiro yakanaka (18Kb).

Saka, iyo data inomanikidzwa zvakanyanya.
Saka (kana tikasawana zvikanganiso zvinouraya) pachave nekumanikidzana! Zvingori nekuti data rakawanda rinogona kukwana pane imwechete flash drive.

Ngatifungei pamusoro pezvakaipira.

Dambudziko rekutanga: isu takatobvumirana kuti rekodhi yega yega inofanirwa kuenda kuflash. Kazhinji, muchengeti anounganidza data kubva parukova rwekupinza kusvika yafunga kuti yave nguva yekunyora pakupera kwesvondo. Isu tinofanirwa kukurumidza kugashira yakadzvanywa block yedata uye kuichengeta mune isiri-inotenderera ndangariro.

Ndinoona nzira nhatu:

  1. Dzvinyirira rekodhi rega rega uchishandisa kudzvanya kweduramazwi pachinzvimbo chealgorithms yakurukurwa pamusoro.
    Iyo isarudzo inoshanda zvachose, asi ini handiifarire. Kuti ive nechokwadi chekuwedzera kana kushomeka mwero wekumanikidza, duramazwi rinofanirwa "kurongedzerwa" kune chaiyo data; chero shanduko inozotungamira kune yekumanikidza kudonha zvine njodzi. Hongu, dambudziko rinogona kugadziriswa nekugadzira vhezheni itsva yeduramazwi, asi uku kurwadza kwemusoro - tichada kuchengetedza mavhezheni ese eduramazwi; muchikamu chega chega tichada kuratidza kuti yakatsikiswa neshanduro yeduramazwi...
  2. Сжимать каждую запись «классическими» алгоритмами, но независимо от других.
    The compression algorithms iri kutariswa haina kugadzirirwa kushanda nemarekodhi ehukuru uhu (makumi emabhayiti), iyo yekumanikidza reshiyo ichave yakajeka isingasviki 1 (kureva, kuwedzera data vhoriyamu pachinzvimbo chekumanikidza);
  3. Ita FLUSH mushure mekurekodha kwega kwega.
    Во многих библиотеках сжатия есть поддержка FLUSH. Это команда (или параметр к процедуре сжатия), получив которую архиватор формирует сжатый поток так, чтобы чтобы на его основании можно восстановить all the uncompressed data yakatogamuchirwa. Analogue yakadaro sync mumafaira masisitimu kana commit muri sql.
    Chakakosha ndechekuti mashandiro anotevera ekumanikidza anozokwanisa kushandisa duramazwi rakaunganidzwa uye iyo yekumanikidza reshiyo haizotambura zvakanyanya sezvakaita mushanduro yapfuura.

Ndinofunga zviri pachena kuti ndakasarudza sarudzo yechitatu, ngatitarisei zvakadzama.

Found chinyorwa chikuru про FLUSH в zlib.

Сделал по мотивам статьи наколенный тест, взял 70 тысяч записей журнала с реального устройства, при размере страницы в 60Кб (tichadzoka kuhukuru hwepeji gare gare) rakagamuchira:

Data yekutanga
Kudzvanya gzip -9 (hapana FLUSH)
zlib ine Z_PARTIAL_FLUSH
zlib ine Z_SYNC_FLUSH

Vhoriyamu, KB
1692
40
352
604

На первый взгляд цена, вносимая FLUSH чрезмерно высока, однако на самом деле у нас небогатый выбор — или не сжимать вовсе, или сжимать (и весьма эффективно) с FLUSH. Не надо забывать, что у нас 70 тысяч записей, избыточность, вносимая Z_PARTIAL_FLUSH составляет всего 4-5 байт на запись. А коэффициент сжатия оказался почти 5:1, что более, чем отличный результат.

Zvinogona kuuya sechishamiso, asi Z_SYNC_FLUSH inotova nzira inoshanda yekuita FLUSH.

Paunenge uchishandisa Z_SYNC_FLUSH, mabhayithi mana ekupedzisira ega ega ekupinda anogara ari 4x0, 00x0, 00xff, 0xff. Uye kana tichidziziva, saka hatifanirwe kuzvichengeta, saka saizi yekupedzisira i0Kb chete.

Chinyorwa chandakabatanidza nacho chine tsananguro:

Iyo nyowani mhando 0 block ine zvisina chinhu zvirimo inowedzerwa.

A type 0 block with empty contents consists of:

  • iyo matatu-bit block header;
  • 0 kusvika 7 bits akaenzana ne zero, kuwana byte alignment;
  • iyo mana-byte kutevedzana 00 00 FF FF.

Sezvauri kuona zviri nyore, mubhuroko rekupedzisira pamberi peaya mabhayiti mana pane kubva pa4 kusvika pagumi zero bits. Nekudaro, maitiro aratidza kuti pane angangoita gumi zero bits.

Zvinoitika kuti mapfupi mabhuroki e data anowanzo (nguva dzose?) akavharidzirwa uchishandisa block yerudzi rwekutanga (fixed block), iyo inopera ne1 zero bits, ichipa huwandu hwe7-10 yakavimbiswa zero bits (uye mamwe achaita. ive zero ine mukana we 17%).

Saka, pabvunzo data, mu100% yezviitiko pane zero byte isati yasvika 0x00, 0x00, 0xff, 0xff, uye mune inodarika chikamu chimwe muzvitatu pane maviri zero byte. (zvichida chokwadi ndechekuti ini ndinoshandisa binary CBOR, uye kana ndichishandisa mavara JSON, mabhuroki emhando yechipiri - dynamic block angave akajairika, zvichiteerana, mabhuroko asina mamwe zero byte pamberi pe2x0, 00x0, 00xff, 0xff angasangana).

Pakazara, uchishandisa iyo iripo bvunzo data, zvinokwanisika kukwana mune isingasviki 250Kb yedata yakamanikidzwa.

Iwe unogona kuchengetedza zvishoma nekuita bit juggling: ikozvino isu tinoregeredza kuvepo kweashoma zero bits pakupera kwebhuroka, mashoma mabhiti pakutanga kwebhuroka zvakare haachinje...
Asi ipapo ndakaita sarudzo yakasimba yekumira, zvikasadaro pamwero uyu ndaigona kupedzisira ndagadzira yangu yekuchengetera zvinyorwa.

Итого, я из своих тестовых данных получил 3-4 байта на запись, коэффициент сжатия получился более 6:1. Честно скажу: я на такой результат и не рассчитывал, на мой взгляд всё, что лучше 2:1 — уже результат, оправдывающий использование сжатия.

Zvese zvakanaka, asi zlib (deflate) ichiri yechinyakare, yakanyatsokodzera uye zvishoma yekare-yechinyakare compression algorithm. Icho chokwadi chekuti iyo yekupedzisira 32Kb yeiyo isina kudzvanywa data rwizi inoshandiswa seduramazwi inotaridzika kushamisa nhasi (kureva kuti, kana imwe data block yakafanana neyaive murukova rwekupinza 40Kb yapfuura, zvino ichatanga kuchengetwa zvakare, uye haizorevi kune zvakaitika kare). Mumafashoni emazuva ano anochengeterwa, saizi yeduramazwi inowanzoyerwa muma megabytes kwete kilobytes.

Saka tinoenderera mberi ne mini-study yevachengetedzi.

Tevere takaedza bzip2 (rangarira, isina FLUSH yakaratidza yakanakisa compression ratio yeanenge zana: 100). Nehurombo, yakaita zvisina kunaka neFLUSH; saizi yedata yakamanikidzwa yakave yakakura kupfuura iyo isina kudzvanywa data.

Mafungiro angu pamusoro pezvikonzero zvekukundikana

Libbz2 inongopa sarudzo imwe chete, inoita seinojekesa duramazwi (rinofanana neZ_FULL_FLUSH muzlib); hapana kutaura kwekumanikidza kunoshanda mushure meizvi.

Uye wekupedzisira kuyedzwa aive zstd. Zvichienderana nemaparamita, inomanikidza pamwe padanho regzip, asi nekukurumidza zvakanyanya, kana zvirinani pane gzip.

Maiwe, neFLUSH haina kuita zvakanaka: saizi yedata yakamanikidzwa yaive ye700Kb.

Я akabvunza mubvunzo pane peji regithub reprojekiti, ndakagamuchira mhinduro yekuti iwe unofanirwa kuverenga kusvika kugumi mabhayiti edatha yebasa kune yega yega yedata yakamanikidzwa, iri padyo nemhedzisiro yakawanikwa; hapana nzira yekubata nayo deflate.

Ndakafunga kumira panguva ino mukuedza kwangu nevanochengetera zvinyorwa (rega ndikuyeuchidze kuti xz, lzip, lzo, lz4 havana kuzviratidza kunyangwe padanho rekuyedza pasina FLUSH, uye ini handina kufunga nezve exotic compression algorithms).

Ngatidzokere kumatambudziko ekuchengeta.

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

Pane nzira yekugadzirisa dambudziko iri:

  1. Dzivirira dambudziko kuti rirege kuitika - wedzera redundancy kune yakamanikidzwa data, iyo ichakubvumidza iwe kuona nekugadzirisa zvikanganiso; tichazotaura nezvazvo gare gare;
  2. Минимизировать последствия в случае возникновения проблемы
    Мы уже говорили ранее, что можно каждый блок данных сжимать независимо, при этом проблема исчезнет сама собой (порча данных одного блока приведёт к потере данных только этого блока). Однако, это крайний случай, при котором сжатие данных будет неэффективно. Противоположная крайность: использовать все 4Мб нашей микросхемы как единый архив, что даст нам отличное сжатие, но катастрофические последствия в случае порчи данных.
    Hongu, kubvumirana kunodiwa maererano nekuvimbika. Asi isu tinofanirwa kuyeuka kuti isu tiri kugadzira dhata rekuchengetedza fomati yekusagadzikana yekuyeuka ine yakaderera zvakanyanya BER uye yakaziviswa data yekuchengetedza nguva yemakore makumi maviri.

В процессе экспериментов я обнаружил, что более-менее заметные потери уровня сжатия начинаются на блоках сжатых данных рамером менее 10Кб.
Zvakambotaurwa kuti ndangariro yakashandiswa yapeji; Ini handioni chikonzero nei "peji rimwe - rimwe bhuroka reakamanikidzwa data" tsamba isingafanirwe kushandiswa.

Ndokunge, iyo shoma inonzwisisika saizi yepeji ndeye 16Kb (ine chengetedzo yeruzivo rwesevhisi). Nekudaro, saizi diki yakadai peji inoisa zvirambidzo zvakakosha pahukuru hwerekodhi saizi.

Kunyangwe ini ndisati ndatarisira marekodhi akakura kupfuura mashoma kilobytes mune yakamanikidzwa fomu, ndakasarudza kushandisa 32Kb mapeji (yehuwandu hwe128 mapeji pa chip).

Pfupiso:

  • Isu tinochengeta data yakamanikidzwa tichishandisa zlib (deflate);
  • Для каждой записи устанавливаем Z_SYNC_FLUSH;
  • Kune yega yega yakamanikidzwa rekodhi, isu tinocheka mabheti ekutevera (semuenzaniso 0x00, 0x00, 0xff, 0xff); в заголовке указываем как много байт мы отрезали;
  • Isu tinochengeta data mumapeji 32Kb; pane imwe rwizi rwe data yakamanikidzwa mukati pejiji; Papeji rega rega tinotanga compression zvakare.

Uye, ndisati ndapedza nekumanikidza, ndinoda kukwevera pfungwa dzako kune chokwadi chekuti isu tine mashoma mabyte e data akadzvanywa pane rekodhi, saka zvakakosha zvakanyanya kuti usapfudze ruzivo rwesevhisi, yega yega inoverengera pano.

Kuchengeta Data Headers

Sezvo isu tine marekodhi ehurefu hwakasiyana, tinoda neimwe nzira kuona kuiswa / miganhu yemarekodhi.

Ndinoziva nzira nhatu:

  1. Все записи хранятся в непрерывном потоке, сначала идёт заголовок записи, содержащий длину, а потом сама запись.
    Mune ino embodiment, ese misoro uye data inogona kuve yehurefu hwakasiyana.
    Chaizvoizvo, tinowana runyoro rwakabatana runoshandiswa nguva dzese;
  2. Misoro uye zvinyorwa pachazvo zvakachengetwa muhova dzakasiyana.
    Nekushandisa misoro yehurefu hwenguva dzose, tinoona kuti kukuvadzwa kwemusoro mumwe hakukanganisi mamwe.
    Nzira yakafanana inoshandiswa, semuenzaniso, mune dzakawanda mafaira mafaira;
  3. Zvinyorwa zvinochengetwa murukova runoramba ruripo, muganho werekodhi unotemwa neimwe mucherechedzo (unhu/kutevedzana kwemavara anorambidzwa mukati me data blocks). Kana paine chiratidzo mukati merekodhi, isu tinoitsiva neimwe kutevedzana (kuipukunyuka).
    Nzira yakafanana inoshandiswa, semuenzaniso, muPPP protocol.

Ndichaenzanisira.

Sarudzo 1:
Kuitwa kwangu kwemhete buffer muNOR flash
Zvose zviri nyore kwazvo pano: kuziva urefu hwerekodhi, tinogona kuverenga kero yemusoro unotevera. Saka isu tinofamba nemumisoro kusvika tasangana nenzvimbo yakazadzwa ne0xff (nzvimbo yemahara) kana kupera kwepeji.

Sarudzo 2:
Kuitwa kwangu kwemhete buffer muNOR flash
Nekuda kwekusiyana kwerekodhi kureba, hatigone kufanotaura kuti marekodhi mangani (uye saka misoro) yatinozoda peji. Iwe unogona kuparadzira misoro uye data pachayo pamapeji akasiyana, asi ini ndinosarudza imwe nzira: tinoisa zvese misoro uye data pane peji rimwe chete, asi misoro (yehukuru hunogara) inouya kubva pakutanga kwepeji, uye iyo data (yehurefu hwakasiyana) inobva kumagumo. Pavanongo "sangana" (hapana nzvimbo yakakwana yemahara yekupinda patsva), tinofunga peji ino yakakwana.

Sarudzo 3:
Kuitwa kwangu kwemhete buffer muNOR flash
Iko hakuna chikonzero chekuchengetedza kureba kana rumwe ruzivo nezve nzvimbo yedata mumusoro; mamaki anoratidza miganhu yezvinyorwa zvakakwana. Nekudaro, iyo data inofanirwa kugadziriswa pakunyora / kuverenga.
Ini ndaizoshandisa 0xff sechiratidzo (inozadza peji mushure mekudzima), saka nzvimbo yemahara haizobatwa sedata.

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

Sarudzo 1
Sarudzo 2
Sarudzo 3

Kukanganisa kushivirira
-
+
+

Compactness
+
-
+

Сложность реализации
*
**
**

Sarudzo 1 ine chikanganiso chinouraya: kana chero yemisoro yakakuvadzwa, ketani yese inotevera inoparadzwa. Sarudzo dzasara dzinokutendera kuti udzore imwe data kunyangwe pakaitika kukuvara kukuru.
Но тут уместно вспомнить, что мы решили хранить данные в сжатом виде, так и так мы теряем все данные на странице после «битой» записи, так что хоть в таблице и стоит минус, мы его не учитываем.

Compactness:

  • mune yekutanga sarudzo, isu tinofanirwa kuchengetedza kureba chete mumusoro; kana tikashandisa akasiyana-kureba integers, saka kazhinji tinogona kupfuura nebyte imwe;
  • во втором варианте нам нужно хранить начальный адрес и длину; запись должна быть постоянного размера, я оцениваю в 4 байта на запись (два байта на смещение, и два байта на длину);
  • третьему варианту достаточно всего одного символа для обозначения начала записи, плюс сама запись из-за экранирования вырастет на 1-2%. В целом примерный паритет с первым вариантом.

Pakutanga, ndakafunga yechipiri sarudzo seyo huru (uye ndakatonyora kuita). Ndakazvisiya chete pandakazofunga kushandisa compression.

Возможно, когда-нибудь я всё-таки буду использовать подобный вариант. Например, если мне придётся заниматься хранением данных для корабля, курсирующего между Землёй и Марсом — совсем другие требования к надёжности, космическое излучение, …

Kana iri yechitatu sarudzo: Ndakaipa nyeredzi mbiri kuomerwa kwekuita nekuda kwekuti ini handifarire kukanganisa nekudzivirira, kushandura kureba mukuita, nezvimwe. Hongu, pamwe ndine rusarura, asi ndichafanira kunyora kodhi - sei uchizvimanikidza kuita chimwe chinhu chausingade.

Pfupiso: выбираем вариант хранения в виде цепочек «заголовок с длиной — данные переменной длины» из-за эффективности и простоты реализации.

Kushandisa Bit Fields kutarisa Kubudirira Kwekunyora Mashandiro

Ini handichayeuki iko zvino kwandakawana zano, asi rinotaridzika seizvi:
Pakupinda kwega kwega, tinogovera akati wandei mabheti ekuchengetedza mireza.
Sezvatakambotaura, mushure mekudzima mabits ese akazadzwa ne1s, uye isu tinogona kuchinja 1 kusvika 0, asi kwete zvinopesana. Saka kuti "mureza hauna kuiswa" tinoshandisa 1, nekuti "mureza wakaiswa" tinoshandisa 0.

Hezvino izvo kuisa rekodhi-refu rekodhi muflash zvingaite senge:

  1. Устанавливаем флаг “запись длины началась”;
  2. Nyora kureba;
  3. Seta iyo "data kurekodha yatanga" mureza;
  4. Isu tinorekodha data;
  5. Isa iyo "rekodhi yakapera" mureza.

Mukuwedzera, isu tichava ne "kukanganisa kwakaitika" mureza, kune yakazara 4 bit mireza.

Muchiitiko ichi, tine nyika mbiri dzakagadzikana "1111" - kurekodha hakuna kutanga uye "1000" - kurekodha kwakabudirira; muchiitiko chekuvhiringidzwa kusingatarisirwi kwemaitiro ekurekodha, isu tinogashira nyika dzepakati, dzatinogona kuona nekugadzirisa.

Nzira yacho inonakidza, asi inongodzivirira kubva kune kamwe-kamwe kubuda kwemagetsi uye kukundikana kwakafanana, izvo, zvechokwadi, zvakakosha, asi izvi hazvisi kure chete (kana kunyange chikuru) chikonzero chekukundikana kunobvira.

Pfupiso: Ngatienderere mberi tichitsvaga mhinduro yakanaka.

Контрольные суммы

Macheki zvakare anoita kuti zvikwanise kuve nechokwadi (pamwe paine mukana unonzwisisika) kuti tiri kuverenga chaizvo izvo zvaifanira kunge zvakanyorwa. Uye, kusiyana nendima diki dzakurukurwa pamusoro, dzinogara dzichishanda.

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

Saka kana chinangwa chedu chiri chekuona kuti data racho rakasimba here, macheki ipfungwa huru.

Sarudzo yealgorithm yekuverenga iyo checksum haina kusimudza chero mibvunzo - CRC. Kune rimwe divi, masvomhu zvivakwa zvinoita kuti zvikwanise kubata mamwe marudzi ezvikanganiso 100%; kune rimwe divi, pane zvisina tsarukano data iyi algorithm inowanzo ratidza mukana wekudhumhana kwete wakakura kupfuura iyo theoretical muganho. Kuitwa kwangu kwemhete buffer muNOR flash. Iyo inogona kunge isiri iyo inokurumidza algorithm, kana nguva dzose ishoma maererano nenhamba yekudhumhana, asi ine hunhu hwakakosha: mumiedzo yandakasangana nayo, pakanga pasina mapatani ayo akakundikana zvakajeka. Kugadzikana ndihwo hutano hukuru munyaya iyi.

Muenzaniso wezvidzidzo zvevolumetric: chikamu 1, chikamu 2 (zvinobatanidza narod.ru, sorry).

Nekudaro, basa rekusarudza cheki harina kupera; CRC imhuri yese yemacheki. Iwe unofanirwa kusarudza pahurefu, uye wozosarudza polynomial.

Kusarudza urefu hwecheki hakusi nyore mubvunzo sezvaunoratidzika pakutanga.

Rega ndikuenzanisire:
Ngativei nemukana wekukanganisa mune imwe neimwe byte Kuitwa kwangu kwemhete buffer muNOR flash uye yakanakira checksum, ngativerengei avhareji yenhamba yezvikanganiso pamirioni rekodhi:

Data, byte
Checksum, byte
Zvikanganiso zvisina kuonekwa
Ложных обнаружений ошибок
Zvose zvenhema

1
0
1000
0
1000

1
1
4
999
1003

1
2
0
1997
1997

1
4
0
3990
3990

10
0
9955
0
9955

10
1
39
990
1029

10
2
0
1979
1979

10
4
0
3954
3954

1000
0
632305
0
632305

1000
1
2470
368
2838

1000
2
10
735
745

1000
4
0
1469
1469

Zvingaita sekuti zvinhu zvese zviri nyore - zvichienderana nehurefu hwe data iri kuchengetedzwa, sarudza kureba kwecheki ine hushoma hwezvisina kunaka positives - uye hunyengeri huri mubhegi.

Nekudaro, dambudziko rinomuka nepfupi checksums: kunyangwe ivo vakanaka pakuona zvikanganiso zvimwechete, vanogona nemukana wakanyanya kugashira data rakasarudzika seyakarurama. Paive patove nenyaya yaHabré yaitsanangura dambudziko muhupenyu chaihwo.

Naizvozvo, kuti ugadzire macheki echeki machisi zvisingaite, unofanirwa kushandisa macheki ane 32 bits kana kureba pakureba. (nohurefu hunopfuura 64 bits, cryptographic hash mabasa anowanzo shandiswa).

Pasinei nenyaya yekuti ndakanyora kare kuti tinoda kuchengetedza nzvimbo nenzira dzese, isu tichiri kushandisa 32-bit checksum (16 bits haina kukwana, mukana wekudhumhana unodarika 0.01%; uye 24 bits, sezvavanoita. titi, havasi pano kana uko) .

Kupokana kunogona kumuka pano: isu takachengetedza byte yega yega pakusarudza compression kuitira kuti tipe 4 bytes kamwechete? Hazvingave nani here kusamanikidza kana kuwedzera cheki? Chokwadi kwete, hapana compression не означает, kuti hatidi kutariswa kwekuvimbika.

Pakusarudza polynomial, isu hatisi kuzodzosera vhiri, asi tora ikozvino yakakurumbira CRC-32C.
Iyi kodhi inoona 6 bit zvikanganiso pamapaketi anosvika makumi maviri nemaviri (zvichida nyaya yakajairika kwatiri), 22 bit kukanganisa pamapaketi anosvika 4 bytes (zvakare nyaya yakajairika kwatiri), 655 kana chero isinganzwisisike nhamba yekukanganisa zvishoma pamapakiti. yehurefu hupi zvahwo hunonzwisisika.

Kana paine munhu anofarira zveruzivo

Wikipedia chinyorwa nezve CRC.

Параметры кода crc-32c pamusoro сайте Купмана - pamwe inotungamira CRC nyanzvi papasi.

В его статье pane imwe kodhi inonakidza, обеспечивающий чуть лучшие параметры для актуальных для нас длин пакетов, но я не посчитал разницу существенной, а себя достаточно компетентным, чтобы выбрать кастомный код вместо стандартного и хорошо исследованного.

Zvakare, sezvo data redu rakamanikidzwa, mubvunzo unomuka: tinofanirwa kuverenga here cheki yedata yakamanikidzwa kana isina kudzvanywa?

Makakatanwa achifarira kuverenga iyo checksum yedata isina kudzvanywa:

  • Isu pakupedzisira tinoda kutarisa kuchengetedzwa kwekuchengetedza data - saka tinoiongorora zvakananga (panguva imwe chete, zvikanganiso zvinogoneka mukushandiswa kwekumanikidza / decompression, kukuvadzwa kunokonzerwa nekuputsika ndangariro, nezvimwe zvichaongororwa);
  • Iyo deflate algorithm muzlib ine yakaringana kuita uye havafanirwe kudaro падать при «кривых» входных данных, более того, зачастую он способен самостоятельно обнаружить ошибки во входном потоке, снизив общую вероятность необнаружения ошибки (провёл тест с инвертированием одиночного бита в короткой записи, zlib обнаружил ошибку примерно в трети случаев).

Nharo dzekupokana nekuverenga iyo checksum yedata isina kudzvanywa:

  • CRC «заточен» именно под немногочисленные битовые ошибки, которые характерны для флеш-памяти (битовая ошибка в сжатом потоке может дать массовое изменение выходного потока, на котором, чисто теоретически, мы можем «поймать» коллизию);
  • Ini handisi kunyatsoda iyo pfungwa yekupfuudza ingangotyoka data kune decompressor, Ndiani anozivakuti achaita sei.

Muchirongwa ichi, ndakafunga kutsauka kubva pane inogamuchirwa tsika yekuchengeta cheki ye data isina kudzvanywa.

Pfupiso: Isu tinoshandisa CRC-32C, isu tinoverenga cheki kubva kune data muchimiro chavakanyorerwa kupenya (mushure mekumanikidza).

Redundancy

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

Tinogona kushandisa mhando dzakasiyana dze redundancy kugadzirisa zvikanganiso.
Hamming makodhi anogona kugadzirisa kamwechete zvikanganiso, Reed-Solomon hunhu makodhi, akawanda makopi edata akasanganiswa necheki, kana encodings seRAID-6 anogona kubatsira kudzoreredza data kunyangwe pakaitika huori hukuru.
Pakutanga, ndakanga ndakazvipira pakushandiswa kwakapararira kwekodha isingakanganisi, asi ndakazoona kuti tinofanira kutanga tave neruzivo rwezvikanganiso zvatinoda kuzvidzivirira kubva, tozosarudza kukodha.

Takambotaura kuti zvikanganiso zvinoda kubatwa nekukurumidza sezvinobvira. Ndepapi patingasangana nezvikanganiso?

  1. Kusapera kurekodha (nekuda kwechimwe chikonzero panguva yekurekodha simba rakadzimwa, iyo Raspberry yakaoma, ...)
    Maiwe, kana paine chikanganiso chakadaro, zvese zvinosara ndezvekuregeredza zvinyorwa zvisiri izvo uye kufunga nezve data rakarasika;
  2. Ошибки записи (по каким-либо причинам в flash-память записалось не то, что записывалось)
    Tinogona kuona nekukurumidza zvikanganiso zvakadaro kana tikaita bvunzo kuverenga nekukurumidza mushure mekurekodha;
  3. Искажение данных в памяти в процессе хранения;
  4. Kukanganisa pakuverenga
    Kuti uigadzirise, kana checksum isingaenderani, zvakakwana kudzokorora kuverenga kakawanda.

Ndiko kuti, zvikanganiso chete zverudzi rwechitatu (huori hunongoerekana hwavapo panguva yekuchengetedza) haigone kugadziriswa pasina kukanganisa-inodzivirira coding. Zvinoita sekuti zvikanganiso zvakadaro hazvisati zvanyanya kuitika.

Pfupiso: было решено отказаться от избыточного кодирования, но, если эксплуатация покажет ошибочность этого решения, то вернуться к рассмотрению вопроса (с уже накопленной статистикой по сбоям, которая позволит выбрать оптимальный вид кодирования).

Прочее

Ehe, manyorerwo echinyorwa haatibvumidze kupembedza chidimbu chega chega mufomati (uye simba rangu rakatopera), saka ndichamboongorora muchidimbu mamwe mapoinzi asina kumbobatwa paari.

  • Zvakasarudzwa kuita mapeji ese "akaenzana"
    То есть не будет каких-то специальных страниц с метаданными, отдельными потоками и т.п., вместо этого единый поток, который переписывает все страницы по очереди.
    Izvi zvinovimbisa kunyange kupfeka pamapeji, hapana imwe pfungwa yekukundikana, uye ini ndinongoifarira;
  • Izvo zvakakosha kupa shanduro yefomati.
    Fomati isina nhamba yevhezheni mumusoro yakaipa!
    Достаточно добавить в заголовок страницы поле с неким Magic Number (сигнатурой), которое будет указывать на используемую версию формата (Ini handifunge kuti mukuita kuchave nevane gumi nevaviri vavo);
  • Shandisa mutsara-urefu wemusoro wezvinyorwa (izvo pane zvakawanda), uchiedza kuita 1 byte kureba kazhinji;
  • Для кодирования длины заголовка и длины обрезаемой части сжатой записи использовать бинарные коды переменной длины.

Yakabatsira zvikuru online jenareta Huffman makodhi. Mumaminetsi mashoma takakwanisa kusarudza macode anodiwa akasiyana marefu.

Tsanangudzo yefomati yekuchengetedza data

Byte order

Minda yakakura kupfuura imwe byte inochengetwa mubig-endian fomati (network byte order), kureva, 0x1234 yakanyorwa se 0x12, 0x34.

Pagination

Вся флеш-память разбита на страницы равного размера.

Saizi yepeji yekusarudzika ndeye 32Kb, asi hapana inopfuura 1/4 yehukuru hwese hwememori chip (ye4MB chip, 128 mapeji anowanikwa).

Peji rega rega rinochengeta data rakazvimiririra kune mamwe (kureva kuti, data pane imwe peji haritauri data pane imwe peji).

Mapeji ese akaverengerwa muhurongwa hwechisikigo (mukukwira kwekero), kutanga nenhamba 0 (peji zero rinotangira pakero 0, peji rekutanga rinotangira pa32Kb, peji rechipiri rinotangira pa64Kb, zvichingodaro.)

Iyo memory chip inoshandiswa se cyclic buffer (ring buffer), ndiko kuti, kutanga kunyora kunoenda kune peji nhamba 0, ipapo nhamba 1, ..., patinozadza peji rekupedzisira, kutenderera kutsva kunotanga uye kurekodha kunoenderera kubva peji zero. .

Mukati mepeji

Kuitwa kwangu kwemhete buffer muNOR flash
Pakutanga kwepeji, 4-byte peji yemusoro inochengetwa, ipapo musoro checksum (CRC-32C), ipapo zvinyorwa zvinochengetwa mu "header, data, checksum" format.

Musoro wepeji (tsvina yegirini padhayagiramu) ine:

  • maviri-byte Mashiripiti Nhamba munda (zvakare chiratidzo cheiyo fomati vhezheni)
    kune yazvino vhezheni yefomati inoverengerwa se 0xed00 ⊕ номер страницы;
  • maviri-byte counter "Peji vhezheni" (ndangariro nyorazve kutenderera nhamba).

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

Каждая запись сжимется с флагом Z_SYNC_FLUSH, при этом в конце сжатого потока оказываются 4 байта 0x00, 0x00, 0xff, 0xff, предварённые, возможно, ещё одним или двумя нулевыми байтами.
Isu tinorasa kutevedzana uku (4, 5 kana 6 bytes kureba) pakunyorera kuflash memory.

Заголовок записи представляет из себя 1, 2 или 3 байта, хранящие:

  • imwe diki (T) inoratidza rudzi rwerekodhi: 0 - mamiriro, 1 - log;
  • поле переменной длины (S) от 1 до 7 бит, определящее длину заголовка и «хвост», который нужно добавить к записи для распаковки;
  • длину записи (L).

Таблица значений S:

S
Kureba kwemusoro, mabhayiti
Yakaraswa pakunyora, 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)

Ndakaedza kuenzanisira, handizive kuti zvakabuda sei:
Kuitwa kwangu kwemhete buffer muNOR flash
Yero pano inoratidza iyo T munda, chena iyo S munda, yegirini L (kureba kweiyo compressed data mumabhaiti), yebhuruu iyo yakamanikidzwa data, tsvuku yekupedzisira mabyte eiyo compressed data isina kunyorwa kuti flash memory.

Nokudaro, tinogona kunyora zvinyorwa zvehurefu hwakanyanya (kusvika ku63 + 5 bytes mufomu yakamanikidzwa) mune imwe byte.

Mushure merekodhi yega yega, CRC-32C checksum inochengetwa, umo inverted value yechecksum yapfuura inoshandiswa seyokutanga kukosha (init).

CRC ine chivakwa che "nguva", iyo inotevera fomula inoshanda (pamwe kana minus bit inversion mukuita): Kuitwa kwangu kwemhete buffer muNOR flash.
Ndokureva kuti, isu tinoverenga iyo CRC yeese apfuura mabheti emusoro uye data pane ino peji.

Kunyatsotevera checksum ndiyo musoro werekodhi rinotevera.

Musoro wakagadzirwa nenzira yekuti yekutanga byte inogara yakasiyana kubva ku0x00 uye 0xff (kana panzvimbo yekutanga yemusoro wemusoro watinosangana nawo 0xff, zvino izvi zvinoreva kuti iyi inzvimbo isina kushandiswa; 0x00 inoratidza kukanganisa).

Примерные алгоритмы

Kuverenga kubva kuFlash Memory

Chero kuverenga kunouya necheki cheki.
Kana iyo checksum isingaenderani, kuverenga kunodzokororwa kakawanda mune tariro yekuverenga data chaiyo.

(izvi zvine musoro, Linux haina cache kuverenga kubva NOR Flash, yakaedzwa)

Запись в флеш-память

Isu tinorekodha data.
Ngativerengei.

Kana iyo data yekuverenga isingaenderane neiyo data yakanyorwa, tinozadza nzvimbo ne zero uye tinoratidza kukanganisa.

Kugadzirira microcircuit itsva yekushanda

Kuti utange, musoro une vhezheni 1 unonyorerwa kune yekutanga (kana kuti zero) peji.
Mushure meizvozvo, mamiriro ekutanga anonyorwa kune ino peji (ine UUID yemuchina uye default marongero).

Ndizvozvo, flash memory yakagadzirira kushandiswa.

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

Paunenge uchirodha, yekutanga 8 bytes yepeji rega rega (musoro + CRC) inoverengwa, mapeji ane isingazivikanwe Mashiripiti Nhamba kana CRC isiriyo inofuratirwa.
Kubva pamapeji "akarurama", mapeji ane shanduro yepamusoro anosarudzwa, uye peji ine nhamba yepamusoro inotorwa kubva kwavari.
Rekodhi rekutanga rinoverengwa, kurongeka kweCRC uye kuvapo kwemureza we "context" kunotariswa. Kana zvese zvakanaka, peji ino inoonekwa seyazvino. Kana zvisina kudaro, tinodzokera kune yapfuura kusvika tawana "live" peji.
uye pane peji yakawanikwa tinoverenga zvese zvinyorwa, izvo zvatinoshandisa ne "context" mureza.
Сохраняем словарь zlib (нужен будет для дозаписи в эту страницу).

Всё, загрузка завершена, контекст восстановлен, можно работать.

Добавление записи в журнал

Isu tinodzvanyirira rekodhi neduramazwi chairo, tichitsanangura Z_SYNC_FLUSH. Tinoona kana rekodhi yakadzvanywa ichikwana papeji iripo.
Kana iyo isingakwane (kana pakanga paine CRC zvikanganiso pane peji), tanga peji nyowani (ona pazasi).
Isu tinonyora pasi rekodhi uye CRC. Kana kukanganisa kukaitika, tanga peji nyowani.

Peji idzva

Isu tinosarudza peji yemahara ine nhamba shoma (tinotarisa peji remahara sepeji ine cheki isiriyo mumusoro kana neshanduro yakaderera pane yazvino). Kana pasina mapeji akadaro, sarudza peji ine nhamba shoma kubva kune ane shanduro yakaenzana neyazvino.
Tinodzima peji yakasarudzwa. Isu tinotarisa zviri mukati ne0xff. Kana chimwe chinhu chisina kumira zvakanaka, tora rinotevera remahara peji, nezvimwe.
Isu tinonyora musoro pane peji rakadzimwa, yekutanga yekupinda ndiyo mamiriro azvino emamiriro ezvinhu, inotevera ndeye isina kunyorwa log yekupinda (kana iripo).

Format kushanda

Sekuona kwangu, yakazoita yakanaka fomati yekuchengeta chero yakawanda kana isinganyanye kudzvanya ruzivo nzizi (pachena mavara, JSON, MessagePack, CBOR, pamwe protobuf) muNOR Flash.

Ehe, iyo fomati "yakagadzirirwa" yeSLC NOR Flash.

Haifanirwe kushandiswa neyepamusoro BER midhiya senge NAND kana MLC NOR (yeuko yakadai inotowanikwa kutengeswa here?.

Uyezve, haifanirwe kushandiswa nemidziyo ine yavo FTL: USB flash, SD, MicroSD, nezvimwe (yekuyeuka kwakadaro ini ndakagadzira fomati ine saizi yepeji ye512 bytes, siginecha pakutanga kwepeji rega rega uye yakasarudzika manhamba erekodhi - dzimwe nguva zvaigoneka kudzoreredza data rese kubva ku "glitched" flash drive nekureruka kuverenga kwakateedzana).

Zvichienderana nemabasa, iyo fomati inogona kushandiswa pasina shanduko pamadhiraivha kubva ku128Kbit (16Kb) kuenda ku1Gbit (128MB). Kana uchida, unogona kuishandisa pane akakura machipisi, asi ungangoda kugadzirisa saizi yepeji (Asi pano mubvunzo wekuita kwehupfumi watomuka; mutengo wehombe-vhoriyamu NOR Flash haukurudzire).

Если кому-то формат показался интересным, и он захочет использовать его в открытом проекте — пишите, постараюсь найти время, причесать код и выложить на github.

mhedziso

Sezvauri kuona, pakupedzisira iyo fomati yakazova nyore uye kunyange kufinha.

Zvakaoma kuratidza kushanduka kwemaonero angu mune imwe nyaya, asi nditendei: pakutanga ndaida kugadzira chimwe chinhu chakaoma, chisingagoneki, chinokwanisa kupona kunyange kuputika kwenyukireya pedyo. Nekudaro, chikonzero (ndinovimba) chichiri kuhwina uye zvishoma nezvishoma zvinonyanya kukosha zvakachinjika kune kureruka uye compactness.

Kungava kuti ndakakanganisa here? Hongu chokwadi. Zvinogona kubuda, semuenzaniso, kuti takatenga batch yemhando yakaderera-microcircuits. Kana kuti nekuda kwechimwe chikonzero michina haizosangana nekuvimbika zvinotarisirwa.

Ndine hurongwa here? Ndinofunga kuti mushure mokuverenga chinyorwa iwe hauna mubvunzo kuti pane chirongwa. Uye kwete kunyange chete.

Pane imwe pfungwa yakakomba, iyo fomati yakagadziridzwa zvese senge sarudzo yekushanda uye se "yeyedzo bharumu".

Parizvino zvese zviri patafura zviri kushanda zvakanaka, chaizvo rimwe zuva mhinduro ichaiswa (примерно) pamazana emidziyo, ngationei zvinoitika mu "kurwa" mashandiro (nerombo rakanaka, ndinovimba iyo fomati inobvumidza iwe kuti uone kutadza nekuvimbika; saka unogona kuunganidza huwandu hwakazara). Mumwedzi mishomanana zvichange zvichibvira kutora mhedziso (а если не повезёт — то и раньше).

Kana, zvichibva pamigumisiro yekushandiswa, matambudziko akakomba anowanikwa uye kuvandudzwa kunodiwa, saka ini ndichanyatsonyora nezvazvo.

Literature

Не хотелось составлять длинный нудный список использованных работ, в конце концов гугл есть у всех.

Pano ndakafunga kusiya rondedzero yezvakawanikwa zvaiita sezvinonyanya kunakidza kwandiri, asi zvishoma nezvishoma vakatama vakananga muzvinyorwa zvechinyorwa, uye chimwe chinhu chakaramba chiri pachinyorwa:

  1. Zvinobatsira infgen kubva kumunyori zlib. Inogona kuratidza zvakajeka zviri mukati deflate/zlib/gzip archives. Kana iwe uchifanira kubata nemukati chimiro che deflate (kana gzip) fomati, ini ndinoikurudzira zvikuru.

Source: www.habr.com

Voeg