Mi imuse ti a oruka saarin ni NOR filasi

prehistory

Awọn ẹrọ titaja wa ti apẹrẹ tiwa. Inu awọn Rasipibẹri Pi ati diẹ ninu awọn onirin lori lọtọ ọkọ. Olugba owo, olugba owo, ebute ile-ifowo kan ti wa ni asopọ ... Ohun gbogbo ni iṣakoso nipasẹ eto ti ara ẹni. Gbogbo itan iṣẹ ni a kọ si log kan lori kọnputa filasi (MicroSD), eyiti o tan kaakiri nipasẹ Intanẹẹti (lilo modẹmu USB) si olupin naa, nibiti o ti fipamọ sinu ibi ipamọ data. Alaye tita ti kojọpọ sinu 1c, oju opo wẹẹbu ti o rọrun tun wa fun ibojuwo, ati bẹbẹ lọ.

Iyẹn ni, iwe-akọọlẹ jẹ pataki - fun iṣiro (awọn owo-wiwọle, tita, ati bẹbẹ lọ), ibojuwo (gbogbo iru awọn ikuna ati awọn ipo agbara majeure miiran); Eyi, ọkan le sọ, ni gbogbo alaye ti a ni nipa ẹrọ yii.

Isoro

Awọn awakọ filasi fihan ara wọn lati jẹ awọn ẹrọ ti ko ni igbẹkẹle pupọ. Wọn kuna pẹlu deede ilara. Eyi nyorisi akoko idaduro ẹrọ mejeeji ati (ti o ba jẹ pe fun idi kan akọọlẹ ko le gbe lori ayelujara) si pipadanu data.

Eyi kii ṣe iriri akọkọ ti lilo awọn awakọ filasi, ṣaaju eyi iṣẹ akanṣe miiran wa pẹlu awọn ẹrọ diẹ sii ju ọgọrun lọ, nibiti iwe irohin ti wa ni ipamọ lori awọn awakọ filasi USB, awọn iṣoro tun wa pẹlu igbẹkẹle, ni awọn akoko nọmba awọn ti o kuna ninu osu kan wà ni dosinni. A gbiyanju awọn awakọ filasi oriṣiriṣi, pẹlu awọn iyasọtọ pẹlu iranti SLC, ati diẹ ninu awọn awoṣe jẹ igbẹkẹle diẹ sii ju awọn miiran lọ, ṣugbọn rirọpo awọn awakọ filasi ko yanju iṣoro naa ni ipilẹṣẹ.

Išọra Ka gigun! Ti o ko ba nifẹ si “idi”, ṣugbọn ni “bawo ni” nikan, o le lọ taara Ni ipari ìwé.

Ipinnu

Ohun akọkọ ti o wa si ọkan ni: fi MicroSD silẹ, fi sori ẹrọ, fun apẹẹrẹ, SSD kan, ati bata lati ọdọ rẹ. Oṣeeṣe ṣee ṣe, boya, ṣugbọn gbowolori gbowolori, ati pe ko ṣe igbẹkẹle (a ṣafikun ohun ti nmu badọgba USB-SATA; Awọn iṣiro ikuna fun awọn SSD isuna ko tun jẹ iwuri).

USB HDD tun ko dabi ojutu ti o wuyi pataki.

Nitorinaa, a wa si aṣayan yii: lọ kuro ni booting lati MicroSD, ṣugbọn lo wọn ni ipo kika-nikan, ati tọju akọọlẹ iṣẹ (ati alaye miiran ti o yatọ si nkan kan pato ti ohun elo - nọmba ni tẹlentẹle, awọn iwọn sensọ, bbl) ni ibomiiran. .

Koko-ọrọ ti FS kika-nikan fun awọn raspberries ti tẹlẹ ti kẹkọọ inu ati ita, Emi kii yoo gbe lori awọn alaye imuse ninu nkan yii. (ṣugbọn ti iwulo ba wa, boya Emi yoo kọ nkan kekere kan lori koko yii). Ojuami nikan ti Emi yoo fẹ lati ṣe akiyesi ni pe mejeeji lati iriri ti ara ẹni ati lati awọn atunyẹwo ti awọn ti o ti ṣe imuse rẹ tẹlẹ, ere wa ni igbẹkẹle. Bẹẹni, ko ṣee ṣe lati yọkuro patapata ti awọn fifọ, ṣugbọn idinku idinku igbohunsafẹfẹ wọn ni pataki jẹ ṣeeṣe ṣeeṣe. Ati pe awọn kaadi naa ti di isokan, eyiti o jẹ ki rirọpo rọrun pupọ fun oṣiṣẹ iṣẹ.

Apakan hardware

Ko si iyemeji pato nipa yiyan iru iranti - NOR Flash.
Awọn ariyanjiyan:

  • asopọ ti o rọrun (julọ nigbagbogbo ọkọ akero SPI, eyiti o ti ni iriri tẹlẹ, nitorinaa ko si awọn iṣoro ohun elo ti a rii tẹlẹ);
  • yeye owo;
  • Ilana iṣiṣẹ boṣewa (imuse ti wa tẹlẹ ninu kernel) Linux, tí o bá fẹ́, o lè mú ẹni-kẹta kan, tí ó tún wà níbẹ̀, tàbí kí o tilẹ̀ kọ tirẹ̀, ó dáa pé ohun gbogbo rọrùn);
  • igbẹkẹle ati awọn orisun:
    lati iwe data aṣoju kan: data ti wa ni ipamọ fun ọdun 20, 100000 awọn akoko imukuro fun bulọọki kọọkan;
    lati awọn orisun ẹnikẹta: BER kekere pupọ, ko si iwulo fun awọn koodu atunṣe aṣiṣe (diẹ ninu awọn iṣẹ ro ECC fun NOR, ṣugbọn nigbagbogbo wọn tun tumọ si MLC NOR; eyi tun ṣẹlẹ).

Jẹ ki a ṣe iṣiro awọn ibeere fun iwọn didun ati awọn orisun.

Emi yoo fẹ ki data naa jẹ ẹri lati wa ni fipamọ fun ọpọlọpọ awọn ọjọ. Eyi jẹ pataki ki ni ọran ti eyikeyi awọn iṣoro pẹlu ibaraẹnisọrọ, itan-itan tita ko padanu. A yoo dojukọ awọn ọjọ 5, lakoko asiko yii (paapaa ni akiyesi awọn ipari ose ati awọn isinmi) a le yanju iṣoro naa.

Lọwọlọwọ a gba nipa 100kb ti awọn akọọlẹ fun ọjọ kan (awọn titẹ sii 3-4 ẹgbẹrun), ṣugbọn diẹ sii nọmba yii n dagba - alaye naa n pọ si, awọn iṣẹlẹ tuntun ti wa ni afikun. Pẹlupẹlu, nigbami awọn nwaye wa (diẹ ninu awọn sensọ bẹrẹ spamming pẹlu awọn idaniloju eke, fun apẹẹrẹ). A yoo ṣe iṣiro fun 10 ẹgbẹrun igbasilẹ 100 awọn baiti kọọkan - megabyte fun ọjọ kan.

Ni apapọ, 5MB ti data mimọ (fisinuirindigbindigbin daradara) wa jade. Diẹ sii si wọn (iṣiro ti o ni inira) 1MB ti data iṣẹ.

Iyẹn ni, a nilo ërún 8MB ti a ko ba lo funmorawon, tabi 4MB ti a ba lo. Awọn nọmba ojulowo pupọ fun iru iranti yii.

Bi fun orisun: ti a ba gbero pe gbogbo iranti yoo tun kọ diẹ sii ju ẹẹkan lọ ni gbogbo ọjọ 5, lẹhinna ju ọdun 10 ti iṣẹ a gba o kere ju ẹgbẹrun awọn iyipo atunkọ.
Jẹ ki n leti pe olupese ṣe ileri ẹgbẹrun ọgọrun.

Diẹ diẹ nipa NOR vs NAND

Loni, nitorinaa, iranti NAND jẹ olokiki pupọ diẹ sii, ṣugbọn Emi kii yoo lo fun iṣẹ akanṣe yii: NAND, ko dabi NOR, dandan nilo lilo awọn koodu atunṣe aṣiṣe, tabili ti awọn bulọọki buburu, ati bẹbẹ lọ, ati tun awọn ẹsẹ ti Awọn eerun NAND nigbagbogbo pupọ diẹ sii.

Awọn aila-nfani ti NOR pẹlu:

  • iwọn kekere (ati, gẹgẹbi, idiyele giga fun megabyte);
  • iyara ibaraẹnisọrọ kekere (paapaa nitori otitọ pe a lo wiwo ni tẹlentẹle, nigbagbogbo SPI tabi I2C);
  • o lọra nu (da lori awọn Àkọsílẹ iwọn, o gba lati kan ida kan ti a ti keji si orisirisi awọn aaya).

O dabi pe ko si ohun ti o ṣe pataki fun wa, nitorina a tẹsiwaju.

Ti awọn alaye ba nifẹ, microcircuit ti yan oju25df321a (sibẹsibẹ, eyi ko ṣe pataki, ọpọlọpọ awọn analogues wa lori ọja ti o ni ibamu ni pinout ati eto aṣẹ; paapaa ti a ba fẹ fi microcircuit sori ẹrọ lati ọdọ olupese ti o yatọ ati / tabi iwọn ti o yatọ, ohun gbogbo yoo ṣiṣẹ laisi iyipada koodu).

Mo lo èyí tí a kọ́ sínú ekuro náà Linux Awakọ, lori Raspberry, ọpẹ si atilẹyin igi ideri ẹrọ, ohun gbogbo rọrun pupọ - o nilo lati fi overlay ti a ṣajọpọ sinu /boot/overlays ki o si yipada /boot/config.txt diẹ.

Apẹẹrẹ dts faili

Lati so ooto, Emi ko ni idaniloju pe o ti kọ laisi awọn aṣiṣe, ṣugbọn o ṣiṣẹ.

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

Ati ila miiran ni config.txt

dtoverlay=at25:spimaxfrequency=50000000

Emi yoo yọkuro apejuwe ti sisopọ chirún si Rasipibẹri Pi. Ni apa kan, Emi kii ṣe amoye ni ẹrọ itanna, ni apa keji, ohun gbogbo nibi jẹ banal paapaa fun mi: microcircuit ni awọn ẹsẹ 8 nikan, eyiti a nilo ilẹ, agbara, SPI (CS, SI, SO, SCK ); Awọn ipele jẹ kanna bi ti Rasipibẹri Pi, ko si afikun onirin ti a beere - kan so awọn pinni 6 ti a tọka si.

Igbekalẹ iṣoro naa

Gẹgẹbi igbagbogbo, alaye iṣoro naa lọ nipasẹ ọpọlọpọ awọn iterations, ati pe o dabi si mi pe o to akoko fun atẹle naa. Nitorinaa jẹ ki a da duro, ṣajọpọ ohun ti a ti kọ tẹlẹ, ki a ṣe alaye awọn alaye ti o ku ninu ojiji.

Nitorinaa, a ti pinnu pe akọọlẹ naa yoo wa ni ipamọ ni SPI NOR Flash.

Kini TABI Flash fun awọn ti ko mọ?

Eyi jẹ iranti ti kii ṣe iyipada pẹlu eyiti o le ṣe awọn iṣẹ mẹta:

  1. Kika:
    Awọn wọpọ kika: a atagba adirẹsi ati ki o ka bi ọpọlọpọ awọn baiti bi a nilo;
  2. Igbasilẹ:
    Kikọ si NOR filasi dabi ẹni deede, ṣugbọn o ni iyatọ kan: o le yipada 1 si 0 nikan, ṣugbọn kii ṣe idakeji. Fun apẹẹrẹ, ti a ba ni 0x55 ninu sẹẹli iranti, lẹhinna lẹhin kikọ 0x0f si rẹ, 0x05 yoo wa ni ipamọ tẹlẹ nibẹ. (wo tabili ni isalẹ);
  3. Paarẹ:
    Nitoribẹẹ, a nilo lati ni anfani lati ṣe iṣiṣẹ idakeji - yipada 0 si 1, eyi ni deede ohun ti iṣẹ nu jẹ fun. Ko awọn akọkọ meji, o ṣiṣẹ ko pẹlu awọn baiti, ṣugbọn pẹlu awọn bulọọki (awọn kere nu Àkọsílẹ ninu awọn ti o yan ërún 4kb). Paarẹ ba gbogbo bulọọki run ati pe o jẹ ọna kan ṣoṣo lati yi 0 si 1. Nitorinaa, nigbati o ba n ṣiṣẹ pẹlu iranti filasi, o nigbagbogbo ni lati ṣe deede awọn ẹya data si aala idena nu.
    Gbigbasilẹ ni NOR Filaṣi:

data alakomeji

Jẹ
01010101

Ti gbasilẹ
00001111

Ti di
00000101

Awọn log ara duro a ọkọọkan ti awọn igbasilẹ ti ayípadà ipari. Awọn aṣoju ipari ti igbasilẹ jẹ nipa 30 awọn baiti (biotilejepe awọn igbasilẹ ti o jẹ awọn kilobytes pupọ ni ipari nigbakan waye). Ni idi eyi, a ṣiṣẹ pẹlu wọn nirọrun bi ṣeto awọn baiti, ṣugbọn, ti o ba nifẹ, CBOR lo ninu awọn igbasilẹ.

Ni afikun si akọọlẹ naa, a nilo lati fipamọ diẹ ninu alaye “eto”, imudojuiwọn mejeeji kii ṣe: ID ẹrọ kan, awọn iwọn sensọ, asia “ẹrọ jẹ alaabo fun igba diẹ”, ati bẹbẹ lọ.
Alaye yii jẹ ṣeto awọn igbasilẹ iye-bọtini, ti o tun fipamọ sinu CBOR A ko ni alaye pupọ (awọn kilobytes diẹ ni pupọ julọ), ati pe o ti ni imudojuiwọn nigbagbogbo.
Ninu ohun ti o tẹle a yoo pe ni ayika.

Ti a ba ranti ibiti nkan yii ti bẹrẹ, o ṣe pataki pupọ lati rii daju ibi ipamọ data ti o gbẹkẹle ati, ti o ba ṣeeṣe, iṣiṣẹ tẹsiwaju paapaa ni iṣẹlẹ ti awọn ikuna ohun elo / ibajẹ data.

Awọn orisun ti awọn iṣoro wo ni a le gbero?

  • Pa agbara nigba kikọ / nu awọn iṣẹ. Eyi wa lati ẹya ti "ko si ẹtan lodi si crowbar."
    Alaye lati awọn ijiroro lori stackexchange: nigbati agbara ba wa ni pipa nigba ti ṣiṣẹ pẹlu filasi, mejeeji nu (ṣeto 1) ki o si kọ (ṣeto si 0) ja si aisọye ihuwasi: data le ti wa ni kọ, die-die kọ (sọ, a gbe 10 baiti / 80 die-die. , sugbon ko sibẹsibẹ nikan 45 die-die le wa ni kọ), o jẹ tun ṣee ṣe wipe diẹ ninu awọn ti awọn die-die yoo wa ni ohun "agbedemeji" ipinle (kika le gbe awọn mejeeji 0 ati 1);
  • Awọn aṣiṣe ninu iranti filasi funrararẹ.
    BER, botilẹjẹpe o kere pupọ, ko le dọgba si odo;
  • Awọn aṣiṣe akero
    Awọn data ti a firanṣẹ nipasẹ SPI ko ni aabo ni eyikeyi ọna;
  • Miiran aṣiṣe / glitches
    Awọn aṣiṣe ninu koodu, Rasipibẹri glitches, kikọlu ajeji...

Mo ti ṣe agbekalẹ awọn ibeere, imuse eyiti, ninu ero mi, jẹ pataki lati rii daju igbẹkẹle:

  • awọn igbasilẹ gbọdọ lọ sinu iranti filasi lẹsẹkẹsẹ, awọn kikọ ti o ni idaduro ko ṣe akiyesi;
    (apẹẹrẹ kan lati igbesi aye “bii ko yẹ ki o jẹ”, eyiti Mo ro pe gbogbo eniyan ti pade: lẹhin atunbere pajawiri, eto faili “baje” ati pe ẹrọ ṣiṣe ko ni bata)

Awọn imọran, awọn ọna, awọn iṣaro

Nigbati mo bẹrẹ si ronu nipa iṣoro yii, ọpọlọpọ awọn imọran tan nipasẹ ori mi, fun apẹẹrẹ:

  • lo funmorawon data;
  • lo awọn ẹya data onilàkaye, fun apẹẹrẹ, titoju awọn akọle igbasilẹ lọtọ lati awọn igbasilẹ funrararẹ, nitorinaa ti aṣiṣe ba wa ni eyikeyi igbasilẹ, o le ka iyoku laisi awọn iṣoro eyikeyi;
  • lo awọn aaye bit lati ṣakoso ipari gbigbasilẹ nigbati agbara ba wa ni pipa;
  • itaja checksums fun ohun gbogbo;
  • lo diẹ ninu awọn iru ti ariwo-sooro ifaminsi.

Diẹ ninu awọn ero wọnyi ni a lo, diẹ ninu awọn ti pinnu lati kọ silẹ. Jẹ ki a lọ ni ibere.

Data funmorawon

Awọn iṣẹlẹ funrara wọn ti a gba silẹ ninu iwe akọọlẹ jẹ iru ati atunwi (“jabọ owo ruble 5 kan”, “ti tẹ bọtini fun fifun iyipada”, ...). Nitorina, funmorawon yẹ ki o wa ni oyimbo munadoko.

Funmorawon loke ko ṣe pataki (isise wa lagbara pupọ, paapaa Pi akọkọ ni mojuto kan pẹlu igbohunsafẹfẹ ti 700 MHz, awọn awoṣe lọwọlọwọ ni ọpọlọpọ awọn ohun kohun pẹlu igbohunsafẹfẹ ti gigahertz kan), oṣuwọn paṣipaarọ pẹlu ibi ipamọ jẹ kekere (ọpọlọpọ megabytes fun keji), iwọn awọn igbasilẹ jẹ kekere. Ni gbogbogbo, ti titẹkuro ba ni ipa lori iṣẹ ṣiṣe, yoo jẹ rere nikan. (aibikita rara, o kan sọ)Pẹlupẹlu, a ko ni ọkan ti a fi sinu gidi, ṣugbọn eyi ti o wa deede. Linux — nítorí náà, ìmúṣẹ náà kò gbọdọ̀ gba ìsapá púpọ̀ (ó tó láti so ìkàwé pọ̀ kí o sì lo àwọn iṣẹ́ díẹ̀ láti inú rẹ̀).

A ya nkan ti log lati ẹrọ iṣẹ kan (1.7 MB, awọn titẹ sii 70 ẹgbẹrun) ati ṣayẹwo akọkọ fun compressibility nipa lilo gzip, lz4, lzop, bzip2, xz, zstd wa lori kọnputa naa.

  • gzip, xz, zstd fihan iru awọn esi (40Kb).
    O yà mi lẹnu pe xz asiko ti o fihan ararẹ nibi ni ipele gzip tabi zstd;
  • lzip pẹlu awọn eto aiyipada fun awọn abajade ti o buru diẹ;
  • lz4 ati lzop fihan awọn esi ti ko dara pupọ (150Kb);
  • bzip2 ṣe afihan abajade ti o dara iyalẹnu kan (18Kb).

Nitorinaa, data ti wa ni fisinuirindigbindigbin daradara.
Nitorinaa (ti a ko ba rii awọn abawọn apaniyan) yoo wa funmorawon! Nikan nitori pe data diẹ sii le baamu lori kọnputa filasi kanna.

Jẹ ki a ronu nipa awọn alailanfani.

Iṣoro akọkọ: a ti gba tẹlẹ pe gbogbo igbasilẹ gbọdọ lọ lẹsẹkẹsẹ si filasi. Ni deede, olupamọ n gba data lati inu ṣiṣan titẹ sii titi ti o fi pinnu pe o to akoko lati kọ ni ipari ose. A nilo lẹsẹkẹsẹ gba bulọọki fisinuirindigbindigbin ti data ki o tọju rẹ sinu iranti ti kii ṣe iyipada.

Mo ri awọn ọna mẹta:

  1. Kọ igbasilẹ kọọkan ni lilo funmorawon iwe-itumọ dipo awọn algoridimu ti a jiroro loke.
    O jẹ aṣayan iṣẹ patapata, ṣugbọn Emi ko fẹran rẹ. Lati rii daju diẹ sii tabi kere si ipele ti funmorawon, iwe-itumọ gbọdọ jẹ “ṣe deede” si data kan pato; Bẹẹni, iṣoro naa le ṣee yanju nipasẹ ṣiṣẹda ẹya tuntun ti iwe-itumọ, ṣugbọn eyi jẹ orififo - a yoo nilo lati tọju gbogbo awọn ẹya ti iwe-itumọ; ninu titẹ sii kọọkan a yoo nilo lati tọka pẹlu iru ẹya ti iwe-itumọ ti o jẹ fisinuirindigbindigbin…
  2. Kọ igbasilẹ kọọkan ni lilo awọn algoridimu “kilasika”, ṣugbọn ni ominira ti awọn miiran.
    Awọn algoridimu funmorawon ti o wa labẹ ero ko ṣe apẹrẹ lati ṣiṣẹ pẹlu awọn igbasilẹ ti iwọn yii (awọn mewa ti awọn baiti), ipin funmorawon yoo han gbangba kere ju 1 (iyẹn ni, jijẹ iwọn data dipo fisinuirindigbindigbin);
  3. Ṣe FLUSH lẹhin igbasilẹ kọọkan.
    Ọpọlọpọ awọn ile ikawe funmorawon ni atilẹyin fun FLUSH. Eyi jẹ aṣẹ kan (tabi paramita kan si ilana funmorawon), nigbati o ba gba eyiti oluṣakoso ṣe agbekalẹ ṣiṣan fisinuirindigbindigbin ki o le ṣee lo lati mu pada. gbogbo uncompressed data ti o ti gba tẹlẹ. Iru ohun afọwọṣe sync ni awọn ọna šiše faili tabi commit ni sql.
    Ohun ti o ṣe pataki ni pe awọn iṣẹ titẹle atẹle yoo ni anfani lati lo iwe-itumọ ti akojo ati ipin funmorawon kii yoo jiya pupọ bi ninu ẹya ti tẹlẹ.

Mo ro pe o han gbangba pe Mo yan aṣayan kẹta, jẹ ki a wo ni awọn alaye diẹ sii.

ri nla article nipa FLUSH ni zlib.

Mo ṣe idanwo orokun kan ti o da lori nkan naa, mu 70 ẹgbẹrun awọn titẹ sii log lati ẹrọ gidi kan, pẹlu iwọn oju-iwe ti 60Kb (a yoo pada si iwọn oju-iwe nigbamii) gba:

Orisun orisun
Funmorawon gzip -9 (ko si FLUSH)
zlib pẹlu Z_PARTIAL_FLUSH
zlib pẹlu Z_SYNC_FLUSH

Iwọn didun, KB
1692
40
352
604

Ni wiwo akọkọ, idiyele ti FLUSH ṣe ga pupọ, ṣugbọn ni otitọ a ni yiyan kekere - boya kii ṣe funmorawon rara, tabi lati funmorawon (ati ni imunadoko) pẹlu FLUSH. A ko gbọdọ gbagbe pe a ni awọn igbasilẹ 70 ẹgbẹrun, apọju ti a ṣe nipasẹ Z_PARTIAL_FLUSH jẹ 4-5 awọn baiti fun igbasilẹ kan. Ati ipin funmorawon yipada lati fẹrẹ to 5: 1, eyiti o jẹ abajade to dara julọ.

O le jẹ iyalẹnu, ṣugbọn Z_SYNC_FLUSH jẹ ọna ti o munadoko diẹ sii lati ṣe FLUSH

Nigbati o ba nlo Z_SYNC_FLUSH, awọn baiti 4 ti o kẹhin ti titẹ sii kọọkan yoo ma jẹ 0x00, 0x00, 0xff, 0xff. Ati pe ti a ba mọ wọn, lẹhinna a ko ni lati tọju wọn, nitorina iwọn ipari jẹ 324Kb nikan.

Nkan ti Mo sopọ mọ ni alaye kan:

Iru bulọọki 0 tuntun pẹlu awọn akoonu ṣofo ti wa ni afikun.

Iru bulọọki 0 pẹlu awọn akoonu ofo ni:

  • akọsori Àkọsílẹ mẹta-bit;
  • 0 to 7 die-die dogba si odo, lati se aseyori baiti titete;
  • awọn mẹrin-baiti ọkọọkan 00 00 FF FF.

Bii o ti le rii ni irọrun, ni bulọọki ti o kẹhin ṣaaju awọn baiti mẹrin wọnyi wa lati awọn iwọn 4 si 3 odo. Sibẹsibẹ, iṣe ti fihan pe o kere ju 10 awọn iwọn odo.

O wa ni jade pe iru awọn bulọọki kukuru ti data jẹ igbagbogbo (nigbagbogbo?) Ti ṣe koodu nipa lilo bulọọki ti iru 1 (bulọọgi ti o wa titi), eyiti o jẹ dandan pari pẹlu awọn iwọn odo 7, fifun lapapọ 10-17 ẹri awọn iwọn odo (ati iyokù yoo jẹ odo pẹlu iṣeeṣe ti nipa 50%).

Nitorinaa, lori data idanwo, ni 100% awọn ọran, baiti odo kan wa ṣaaju 0x00, 0x00, 0xff, 0xff, ati ni diẹ sii ju idamẹta awọn ọran nibẹ ni awọn baiti odo meji. (boya otitọ ni pe Mo lo CBOR alakomeji, ati nigba lilo ọrọ JSON, awọn bulọọki ti iru 2 - bulọọki agbara yoo jẹ wọpọ diẹ sii, ni atele, awọn bulọọki laisi awọn baiti odo afikun ṣaaju 0x00, 0x00, 0xff, 0xff yoo pade).

Ni apapọ, lilo data idanwo ti o wa, o ṣee ṣe lati baamu si kere ju 250Kb ti data fisinuirindigbindigbin.

O le ṣafipamọ diẹ diẹ sii nipa ṣiṣe juggling bit: fun bayi a foju foju wa niwaju awọn iwọn odo diẹ ni opin bulọọki, awọn diẹ diẹ ni ibẹrẹ bulọki tun ko yipada…
Ṣugbọn nigbana ni mo ṣe ipinnu ti o lagbara lati da duro, bibẹẹkọ ni oṣuwọn yii Mo le pari ni idagbasoke akọọlẹ ti ara mi.

Lapapọ, lati inu data idanwo mi Mo gba awọn baiti 3-4 fun kikọ, ipin funmorawon ti jade lati jẹ diẹ sii ju 6:1. Emi yoo jẹ ooto: Emi ko nireti iru abajade bẹ ni ero mi, ohunkohun ti o dara ju 2: 1 jẹ abajade ti o ṣe idalare lilo titẹkuro.

Ohun gbogbo dara, ṣugbọn zlib (deflate) tun jẹ archaic, ti o tọ si ati diẹ ti igba atijọ funmorawon algorithm. Otitọ lasan pe 32Kb ti o kẹhin ti ṣiṣan data ti a ko fi silẹ ni a lo bi iwe-itumọ dabi ajeji loni (iyẹn ni, ti diẹ ninu awọn bulọọki data ba jọra si ohun ti o wa ninu ṣiṣan titẹ sii 40Kb sẹyin, lẹhinna yoo bẹrẹ lati wa ni ipamọ lẹẹkansi, ati pe kii yoo tọka si iṣẹlẹ iṣaaju). Ni awọn ile-ipamọ ode oni asiko, iwọn iwe-itumọ nigbagbogbo jẹ iwọn megabytes ju kilobytes lọ.

Nitorinaa a tẹsiwaju ikẹkọ kekere wa ti awọn ile-ipamọ.

Nigbamii ti a ṣe idanwo bzip2 (ranti, laisi FLUSH o ṣe afihan ipin funmorawon ikọja ti o fẹrẹ to 100: 1). Laanu, o ṣe aiṣedeede pupọ pẹlu FLUSH;

Awọn ero mi nipa awọn idi fun ikuna

Libbz2 nfunni ni aṣayan ṣiṣan kan nikan, eyiti o dabi pe o ko iwe-itumọ (afọwọṣe si Z_FULL_FLUSH ni zlib) ko si ọrọ eyikeyi funmorawon lẹhin eyi.

Ati pe eyi ti o kẹhin lati ṣe idanwo ni zstd. Da lori awọn paramita, o compress boya ni ipele gzip, ṣugbọn yiyara pupọ, tabi dara julọ ju gzip lọ.

Alas, pẹlu FLUSH ko ṣiṣẹ daradara: iwọn ti data fisinuirindigbindigbin jẹ nipa 700Kb.

Я beere ibeere kan lori oju-iwe github ti iṣẹ akanṣe naa, Mo gba idahun pe o yẹ ki o ka to awọn baiti 10 ti data iṣẹ fun bulọọki kọọkan ti data fisinuirindigbindigbin, eyiti o sunmọ awọn abajade ti o gba;

Mo pinnu lati da duro ni aaye yii ninu awọn idanwo mi pẹlu awọn ile-ipamọ (jẹ ki n leti pe xz, lzip, lzo, lz4 ko fi ara wọn han paapaa ni ipele idanwo laisi FLUSH, ati pe Emi ko gbero awọn algoridimu funmorawon diẹ sii).

Jẹ ki a pada si awọn iṣoro fifipamọ.

Awọn keji (bi wọn ti sọ ni ibere, kii ṣe ni iye) iṣoro ni pe data ti a fisinujẹ jẹ ṣiṣan kan, ninu eyiti awọn itọkasi nigbagbogbo wa si awọn apakan ti tẹlẹ. Nitorinaa, ti apakan kan ti data fisinuirindigbindigbin ti bajẹ, a padanu kii ṣe bulọọki ti o somọ ti data ti a ko fi sii, ṣugbọn tun gbogbo awọn atẹle.

Ọna kan wa lati yanju iṣoro yii:

  1. Ṣe idiwọ iṣoro naa lati ṣẹlẹ - ṣafikun apọju si data fisinuirindigbindigbin, eyiti yoo gba ọ laaye lati ṣe idanimọ ati ṣatunṣe awọn aṣiṣe; a yoo sọrọ nipa eyi nigbamii;
  2. Din awọn abajade ti iṣoro ba waye
    A ti sọ tẹlẹ pe o le rọpọ bulọọki data kọọkan ni ominira, ati pe iṣoro naa yoo parẹ funrararẹ (ibajẹ data ti bulọọki kan yoo ja si isonu data nikan fun bulọọki yii). Sibẹsibẹ, eyi jẹ ọran ti o ga julọ ninu eyiti funmorawon data yoo jẹ ailagbara. Iwọn idakeji: lo gbogbo 4MB ti chirún wa bi iwe-ipamọ ẹyọkan, eyiti yoo fun wa ni titẹkuro ti o dara julọ, ṣugbọn awọn abajade ajalu ni ọran ibajẹ data.
    Bẹẹni, a nilo adehun ni awọn ofin ti igbẹkẹle. Ṣugbọn a gbọdọ ranti pe a n ṣe idagbasoke ọna kika ibi ipamọ data fun iranti ti kii ṣe iyipada pẹlu BER kekere pupọ ati akoko ibi ipamọ data ti a kede ti ọdun 20.

Lakoko awọn adanwo, Mo ṣe awari pe diẹ sii tabi kere si awọn adanu akiyesi ni ipele titẹkuro bẹrẹ lori awọn bulọọki ti data fisinuirindigbindigbin ti o kere ju 10 KB ni iwọn.
O ti mẹnuba tẹlẹ pe iranti ti a lo ni oju-iwe;

Iyẹn ni, iwọn oju-iwe ti o ni oye to kere julọ jẹ 16Kb (pẹlu ifiṣura fun alaye iṣẹ). Sibẹsibẹ, iru iwọn oju-iwe kekere kan fa awọn ihamọ pataki lori iwọn igbasilẹ ti o pọju.

Botilẹjẹpe Emi ko ti nireti awọn igbasilẹ ti o tobi ju kilobytes diẹ ni fọọmu fisinuirindigbindigbin, Mo pinnu lati lo awọn oju-iwe 32Kb (fun apapọ awọn oju-iwe 128 fun ërún).

Olootu:

  • A tọju data fisinuirindigbindigbin lilo zlib (deflate);
  • Fun titẹ sii kọọkan a ṣeto Z_SYNC_FLUSH;
  • Fun igbasilẹ fisinuirindigbindigbin kọọkan, a ge awọn baiti itọpa (fun apẹẹrẹ 0x00, 0x00, 0xff, 0xff); ninu akọsori a fihan iye awọn baiti ti a ge kuro;
  • A tọju data ni awọn oju-iwe 32Kb; ṣiṣan kan wa ti data fisinuirindigbindigbin inu oju-iwe naa; Lori oju-iwe kọọkan a tun bẹrẹ funmorawon lẹẹkansi.

Ati pe, ṣaaju ki o to pari pẹlu titẹkuro, Emi yoo fẹ lati fa akiyesi rẹ si otitọ pe a ni awọn baiti diẹ ti data fisinuirindigbindigbin fun igbasilẹ, nitorinaa o ṣe pataki pupọ julọ lati ma ṣe fa alaye iṣẹ naa, gbogbo baiti ka nibi.

Titoju Data afori

Niwọn igba ti a ni awọn igbasilẹ ti ipari oniyipada, a nilo lati pinnu bakan ipo / awọn aala ti awọn igbasilẹ.

Mo mọ awọn ọna mẹta:

  1. Gbogbo awọn igbasilẹ ti wa ni ipamọ ni ṣiṣan lemọlemọfún, akọkọ akọsori igbasilẹ kan wa ti o ni gigun, ati lẹhinna igbasilẹ funrararẹ.
    Ni irisi yii, awọn akọsori mejeeji ati data le jẹ ti gigun iyipada.
    Ni pataki, a gba atokọ ti o sopọ mọ ẹyọkan ti a lo ni gbogbo igba;
  2. Awọn akọle ati awọn igbasilẹ funrararẹ wa ni ipamọ ni awọn ṣiṣan lọtọ.
    Nipa lilo awọn akọle ti gigun igbagbogbo, a rii daju pe ibajẹ si akọsori kan ko ni ipa lori awọn miiran.
    Iru ọna kanna ni a lo, fun apẹẹrẹ, ni ọpọlọpọ awọn ọna ṣiṣe faili;
  3. Awọn igbasilẹ ti wa ni ipamọ ni ṣiṣan lemọlemọfún, aala igbasilẹ jẹ ipinnu nipasẹ ami ami kan (ohun kikọ kan / ọkọọkan awọn ohun kikọ ti o jẹ eewọ laarin awọn bulọọki data). Ti aami kan ba wa ninu igbasilẹ, lẹhinna a rọpo rẹ pẹlu diẹ ninu awọn ilana (sa kuro).
    Iru ọna kanna ni a lo, fun apẹẹrẹ, ninu ilana PPP.

Emi yoo ṣe apejuwe.

Aṣayan 1:
Mi imuse ti a oruka saarin ni NOR filasi
Ohun gbogbo rọrun pupọ nibi: mọ ipari ti igbasilẹ, a le ṣe iṣiro adirẹsi ti akọle atẹle. Nitorinaa a gbe nipasẹ awọn akọle titi ti a fi ba pade agbegbe ti o kun pẹlu 0xff (agbegbe ọfẹ) tabi opin oju-iwe naa.

Aṣayan 2:
Mi imuse ti a oruka saarin ni NOR filasi
Nitori ipari igbasilẹ iyipada, a ko le sọ tẹlẹ iye awọn igbasilẹ (ati nitorina awọn akọle) a yoo nilo fun oju-iwe kan. O le tan awọn akọsori ati data funrararẹ kọja awọn oju-iwe oriṣiriṣi, ṣugbọn Mo fẹran ọna ti o yatọ: a gbe mejeeji awọn akọle ati data si oju-iwe kan, ṣugbọn awọn akọle (ti iwọn igbagbogbo) wa lati ibẹrẹ oju-iwe naa, ati data (ti ayípadà ipari) ba wa ni lati opin. Ni kete ti wọn “pade” (ko si aaye ọfẹ ti o to fun titẹsi tuntun), a ro pe oju-iwe yii ti pari.

Aṣayan 3:
Mi imuse ti a oruka saarin ni NOR filasi
Ko si ye lati tọju gigun tabi alaye miiran nipa ipo ti data ninu akọsori; Sibẹsibẹ, data ni lati ni ilọsiwaju nigba kikọ / kika.
Emi yoo lo 0xff bi ami ami (eyiti o kun oju-iwe lẹhin ti o ti parẹ), nitorinaa agbegbe ọfẹ yoo dajudaju ko ṣe itọju bi data.

Tabili afiwe:

Aṣayan 1
Aṣayan 2
Aṣayan 3

Ifarada aṣiṣe
-
+
+

Compactness
+
-
+

Idiju imuse
*
**
**

Aṣayan 1 ni abawọn apaniyan: ti eyikeyi ninu awọn akọle ba bajẹ, gbogbo pq ti o tẹle ti run. Awọn aṣayan ti o ku gba ọ laaye lati gba data diẹ pada paapaa ni iṣẹlẹ ti ibajẹ nla.
Ṣugbọn nibi o yẹ lati ranti pe a pinnu lati tọju data naa ni fọọmu fisinuirindigbindigbin, ati nitorinaa a padanu gbogbo data lori oju-iwe lẹhin igbasilẹ “fifọ”, nitorinaa botilẹjẹpe iyokuro ninu tabili, a ko ṣe. ya o sinu iroyin.

Iwapọ:

  • ni aṣayan akọkọ, a nilo lati tọju ipari nikan ni akọsori;
  • ni aṣayan keji a nilo lati tọju adirẹsi ibẹrẹ ati ipari; igbasilẹ gbọdọ jẹ iwọn igbagbogbo, Mo ṣe iṣiro 4 awọn baiti fun igbasilẹ (awọn baiti meji fun aiṣedeede, ati awọn baiti meji fun ipari);
  • aṣayan kẹta nikan nilo ohun kikọ kan lati tọka ibẹrẹ ti gbigbasilẹ, pẹlu gbigbasilẹ funrararẹ yoo pọ si nipasẹ 1-2% nitori idabobo. Ni gbogbogbo, isunmọ ni ibamu pẹlu aṣayan akọkọ.

Ni ibẹrẹ, Mo ṣe akiyesi aṣayan keji bi akọkọ (ati paapaa kọ imuse). Mo fi silẹ nikan nigbati mo pinnu nikẹhin lati lo funmorawon.

Boya ni ọjọ kan Emi yoo tun lo iru aṣayan kan. Fun apẹẹrẹ, ti MO ba ni lati ṣe pẹlu ibi ipamọ data fun ọkọ oju omi ti n rin laarin Earth ati Mars, awọn ibeere ti o yatọ patapata yoo wa fun igbẹkẹle, itankalẹ agba aye, ...

Bi fun aṣayan kẹta: Mo fun ni awọn irawọ meji fun iṣoro imuse nirọrun nitori Emi ko fẹran idotin ni ayika pẹlu idabobo, yiyipada gigun ninu ilana, ati bẹbẹ lọ. Bẹẹni, boya Mo ṣe ojuṣaaju, ṣugbọn Emi yoo ni lati kọ koodu naa - kilode ti ipa ararẹ lati ṣe nkan ti o ko fẹran.

Olootu: A yan aṣayan ipamọ ni irisi awọn ẹwọn “akọsori pẹlu ipari - data ti gigun iyipada” nitori ṣiṣe ati irọrun imuse.

Lilo Awọn aaye Bit lati Atẹle Aṣeyọri ti Awọn iṣẹ kikọ

Emi ko ranti ni bayi ibiti Mo ni imọran, ṣugbọn o dabi nkan bi eyi:
Fun titẹ sii kọọkan, a pin awọn ipin pupọ lati tọju awọn asia.
Gẹgẹbi a ti sọ tẹlẹ, lẹhin ti o ti parẹ gbogbo awọn ege ti kun pẹlu 1s, ati pe a le yipada 1 si 0, ṣugbọn kii ṣe idakeji. Nitorinaa fun “a ko ṣeto asia” a lo 1, fun “ti ṣeto asia” a lo 0.

Eyi ni ohun ti fifi igbasilẹ gigun-iyipada sinu filaṣi le dabi:

  1. Ṣeto asia “igbasilẹ gigun ti bẹrẹ”;
  2. Ṣe igbasilẹ gigun;
  3. Ṣeto asia “igbasilẹ data ti bẹrẹ”;
  4. A ṣe igbasilẹ data;
  5. Ṣeto asia “igbasilẹ ti pari”.

Ni afikun, a yoo ni asia “aṣiṣe waye”, fun apapọ awọn asia 4 bit.

Ni ọran yii, a ni awọn ipinlẹ iduroṣinṣin meji “1111” - gbigbasilẹ ko ti bẹrẹ ati “1000” - gbigbasilẹ jẹ aṣeyọri; ninu iṣẹlẹ ti idilọwọ airotẹlẹ ti ilana igbasilẹ, a yoo gba awọn ipinlẹ agbedemeji, eyiti a le rii ati ilana.

Ọna naa jẹ iyanilenu, ṣugbọn o ṣe aabo nikan lodi si awọn ijade agbara lojiji ati awọn ikuna ti o jọra, eyiti, dajudaju, jẹ pataki, ṣugbọn eyi jina si nikan (tabi paapaa akọkọ) idi fun awọn ikuna ti o ṣeeṣe.

Olootu: Jẹ ki a lọ siwaju ni wiwa ojutu ti o dara.

Awọn ayẹwo

Awọn ayẹwo ayẹwo tun jẹ ki o ṣee ṣe lati rii daju (pẹlu iṣeeṣe ti o tọ) pe a n ka ni pato ohun ti o yẹ ki a ti kọ. Ati pe, ko dabi awọn aaye bit ti a sọrọ loke, wọn ṣiṣẹ nigbagbogbo.

Ti a ba gbero atokọ ti awọn orisun agbara ti awọn iṣoro ti a sọrọ loke, lẹhinna checksum le ṣe idanimọ aṣiṣe kan laibikita ipilẹṣẹ rẹ. (ayafi, boya, fun awọn ajeji irira - wọn le ṣe iwe-owo ayẹwo paapaa).

Nitorinaa ti ibi-afẹde wa ni lati rii daju pe data wa ni mimule, awọn ayẹwo ayẹwo jẹ imọran nla kan.

Yiyan algorithm fun ṣiṣe iṣiro checksum ko gbe awọn ibeere eyikeyi dide - CRC. Ni apa kan, awọn ohun-ini mathematiki jẹ ki o ṣee ṣe lati mu awọn iru aṣiṣe kan 100%; Mi imuse ti a oruka saarin ni NOR filasi. O le ma jẹ algorithm ti o yara ju, tabi kii ṣe nigbagbogbo ni o kere julọ ni awọn ofin ti nọmba awọn ijamba, ṣugbọn o ni didara ti o ṣe pataki julọ: ninu awọn idanwo ti mo pade, ko si awọn ilana ti o ti kuna kedere. Iduroṣinṣin jẹ didara akọkọ ninu ọran yii.

Apẹẹrẹ ti iwadi iwọn didun: apakan 1, apakan 2 (awọn ọna asopọ si narod.ru, binu).

Sibẹsibẹ, iṣẹ-ṣiṣe ti yiyan checksum ko pari; O nilo lati pinnu lori ipari, ati lẹhinna yan iloyepo kan.

Yiyan ipari checksum kii ṣe ibeere ti o rọrun bi o ṣe dabi ni wiwo akọkọ.

Jẹ ki n ṣe apejuwe:
Jẹ ki a ni awọn iṣeeṣe ti ohun ašiše ni kọọkan baiti Mi imuse ti a oruka saarin ni NOR filasi ati iwe ayẹwo pipe, jẹ ki a ṣe iṣiro apapọ nọmba awọn aṣiṣe fun awọn igbasilẹ miliọnu:

Data, baiti
Checksum, baiti
Awọn aṣiṣe ti a ko rii
Awọn wiwa aṣiṣe eke
Lapapọ awọn idaniloju iro

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

Yoo dabi pe ohun gbogbo rọrun - da lori ipari ti data ti o ni aabo, yan ipari ti checksum pẹlu o kere ju awọn idaniloju ti ko tọ - ati ẹtan wa ninu apo naa.

Bibẹẹkọ, iṣoro kan dide pẹlu awọn sọwedowo kukuru: botilẹjẹpe wọn dara ni wiwa awọn aṣiṣe bit ẹyọkan, wọn le pẹlu iṣeeṣe giga ti o ga julọ gba data laileto patapata bi o tọ. Nkan kan ti wa tẹlẹ lori Habré ti n ṣapejuwe isoro ni aye gidi.

Nitorinaa, lati ṣe ibaamu checksum laileto ti ko ṣee ṣe, o nilo lati lo awọn sọwedowo ti o jẹ awọn bit 32 tabi gun ni gigun. (fun awọn gigun ti o tobi ju awọn bit 64 lọ, awọn iṣẹ hash cryptographic nigbagbogbo lo).

Bi o ti jẹ pe Mo kọ tẹlẹ pe a nilo lati ṣafipamọ aaye ni gbogbo ọna, a yoo tun lo 32-bit checksum (awọn iwọn 16 ko to, iṣeeṣe ti ijamba jẹ diẹ sii ju 0.01%; ati awọn die-die 24, bi wọn ṣe jẹ. sọ pe, ko si nibi tabi nibẹ) .

Ohun atako le dide nibi: a ti fipamọ gbogbo baiti nigba ti yan funmorawon ni ibere lati bayi fun 4 baiti ni ẹẹkan? Ṣe kii yoo dara lati ma fun pọ tabi ṣafikun checksum kan? Dajudaju kii ṣe, ko si funmorawon ko tumọ si, ti a ko nilo iyege yiyewo.

Nigbati o ba yan ilopọ pupọ, a kii yoo tun kẹkẹ pada, ṣugbọn mu CRC-32C ti o gbajumọ ni bayi.
Yi koodu iwari 6 bit aṣiṣe lori awọn apo-iwe to 22 baiti (boya awọn wọpọ nla fun wa), 4 bit aṣiṣe lori awọn apo-iwe to 655 baiti (tun kan to wopo nla fun wa), 2 tabi eyikeyi odd nọmba ti bit aṣiṣe lori awọn apo-iwe. ti eyikeyi reasonable ipari.

Ti ẹnikẹni ba nife ninu awọn alaye

Wikipedia article nipa CRC.

CRC-32c koodu paramita on Koopman aaye ayelujara - boya asiwaju CRC alamọja lori aye.

В rẹ article ni miiran awon koodu, eyiti o pese awọn aye to dara diẹ diẹ fun awọn ipari apo ti o ṣe pataki si wa, ṣugbọn Emi ko ṣe akiyesi iyatọ pataki, ati pe Mo ni oye to lati yan koodu aṣa dipo boṣewa ati ọkan ti a ṣe iwadii daradara.

Paapaa, niwọn igba ti data wa ti wa ni fisinuirindigbindigbin, ibeere naa waye: Ṣe o yẹ ki a ṣe iṣiro sọwedowo ti fisinuirindigbindigbin tabi data ti a ko fisinu?

Awọn ariyanjiyan ni ojurere ti iṣiro iṣiro ti data ti a ko fikun:

  • Nikẹhin a nilo lati ṣayẹwo aabo ti ibi ipamọ data - nitorinaa a ṣayẹwo taara (ni akoko kanna, awọn aṣiṣe ti o ṣeeṣe ni imuse ti funmorawon / decompression, ibajẹ ti o ṣẹlẹ nipasẹ iranti fifọ, ati bẹbẹ lọ yoo ṣayẹwo);
  • Algoridimu deflate ni zlib ni imuse ti o dagba ati pe ko yẹ ṣubu pẹlu data igbewọle “iṣiro” pẹlupẹlu, nigbagbogbo ni anfani lati ṣe awari awọn aṣiṣe ni ominira ninu ṣiṣanwọle, dinku iṣeeṣe gbogbogbo ti aiṣedeede kan (ti ṣe idanwo kan pẹlu yiyipada bit kan ni igbasilẹ kukuru, zlib rii aṣiṣe kan. ni iwọn idamẹta ti awọn ọran).

Awọn ariyanjiyan lodi si ṣiṣe iṣiro iye owo ti data ti a ko fikun:

  • CRC jẹ “ti a ṣe deede” ni pataki fun awọn aṣiṣe bit diẹ ti o jẹ ihuwasi ti iranti filasi (aṣiṣe diẹ ninu ṣiṣan fisinuirindigbindigbin le fa iyipada nla ninu ṣiṣan ṣiṣan, lori eyiti, ni imọ-jinlẹ, a le “mu” ijamba);
  • Emi ko fẹran gaan imọran ti gbigbe data ti o le bajẹ si decompressor, Talo mọbó ṣe máa ṣe.

Ninu iṣẹ akanṣe yii, Mo pinnu lati yapa kuro ninu iṣe ti a gba ni gbogbogbo ti fifipamọ sọwedowo kan ti data aiṣiro.

Olootu: A lo CRC-32C, a ṣe iṣiro awọn checksum lati awọn data ninu awọn fọọmu ti a ti kọ wọn si filasi (lẹhin funmorawon).

Apọju

Lilo ifaminsi laiṣe kii ṣe, nitorinaa, imukuro pipadanu data, sibẹsibẹ, o le ni pataki (nigbagbogbo nipasẹ ọpọlọpọ awọn aṣẹ ti titobi) dinku iṣeeṣe ti pipadanu data ti ko ṣee ṣe.

A le lo awọn oriṣi ti apọju lati ṣatunṣe awọn aṣiṣe.
Awọn koodu Hamming le ṣe atunṣe awọn aṣiṣe bit ẹyọkan, awọn koodu kikọ Reed-Solomon, ọpọlọpọ awọn idaako ti data ni idapo pẹlu awọn sọwedowo, tabi awọn koodu bi RAID-6 le ṣe iranlọwọ fun gbigba data pada paapaa ni iṣẹlẹ ti ibajẹ nla.
Ni ibẹrẹ, Mo ṣe adehun si lilo kaakiri ti ifaminsi-sooro aṣiṣe, ṣugbọn lẹhinna Mo rii pe a nilo akọkọ lati ni imọran kini awọn aṣiṣe ti a fẹ lati daabobo ara wa, lẹhinna yan ifaminsi.

A sọ tẹlẹ pe awọn aṣiṣe nilo lati mu ni yarayara bi o ti ṣee. Ni awọn aaye wo ni a le pade awọn aṣiṣe?

  1. Gbigbasilẹ ti ko pari (fun awọn idi kan ni akoko gbigbasilẹ agbara ti wa ni pipa, Rasipibẹri didi, ...)
    Alas, ni iṣẹlẹ ti iru aṣiṣe bẹ, gbogbo ohun ti o ku ni lati foju foju kọ awọn igbasilẹ ti ko tọ ati gbero data ti o sọnu;
  2. Kọ awọn aṣiṣe (fun idi kan, ohun ti a kọ si iranti filasi kii ṣe ohun ti a kọ)
    A le rii iru awọn aṣiṣe lẹsẹkẹsẹ ti a ba ṣe idanwo kika lẹsẹkẹsẹ lẹhin igbasilẹ;
  3. Idarudapọ data ni iranti nigba ipamọ;
  4. Awọn aṣiṣe kika
    Lati ṣe atunṣe, ti checksum ko ba baramu, o to lati tun kika naa ni igba pupọ.

Iyẹn ni, awọn aṣiṣe nikan ti iru kẹta (ibajẹ lẹẹkọkan ti data lakoko ibi ipamọ) ko le ṣe atunṣe laisi ifaminsi sooro aṣiṣe. O dabi pe iru awọn aṣiṣe tun jẹ eyiti ko ṣeeṣe pupọ.

Olootu: O pinnu lati kọ ifaminsi laiṣe, ṣugbọn ti iṣiṣẹ ba fihan aṣiṣe ti ipinnu yii, lẹhinna pada si ero ti ọran naa (pẹlu awọn iṣiro ti o ṣajọpọ tẹlẹ lori awọn ikuna, eyiti yoo gba yiyan iru ifaminsi to dara julọ).

Miiran

Nitoribẹẹ, ọna kika nkan naa ko gba wa laaye lati ṣe idalare gbogbo bit ni ọna kika (ati pe agbara mi ti pari tẹlẹ), nitorina Emi yoo ṣe ṣoki lori diẹ ninu awọn aaye ti a ko kan tẹlẹ.

  • O ti pinnu lati jẹ ki gbogbo awọn oju-iwe “dogba”
    Iyẹn ni, ko si awọn oju-iwe pataki pẹlu metadata, awọn okun lọtọ, ati bẹbẹ lọ, ṣugbọn dipo okun kan ti o tun gbogbo awọn oju-iwe ṣe ni titan.
    Eyi ṣe idaniloju paapaa wọ lori awọn oju-iwe, ko si aaye kan ti ikuna, ati pe Mo fẹran rẹ;
  • O jẹ dandan lati pese ti ikede ti ọna kika.
    Ọna kika laisi nọmba ikede ninu akọsori jẹ ibi!
    O to lati ṣafikun aaye kan pẹlu Nọmba Idan kan (ibuwọlu) si akọsori oju-iwe, eyiti yoo tọka ẹya ti ọna kika ti a lo. (Emi ko ro pe ni iṣe paapaa mejila ninu wọn yoo wa);
  • Lo akọsori gigun-iyipada fun awọn igbasilẹ (ti eyiti o wa pupọ), gbiyanju lati jẹ ki o jẹ 1 baiti gigun ni ọpọlọpọ awọn ọran;
  • Lati ṣe koodu gigun ti akọsori ati ipari ti apakan gige ti igbasilẹ fisinuirindigbindigbin, lo awọn koodu alakomeji gigun-iyipada.

Ṣe iranlọwọ pupọ online monomono Awọn koodu Huffman. Ni iṣẹju diẹ a ni anfani lati yan awọn koodu ipari gigun ti a beere.

Apejuwe ti data ipamọ kika

Ilana baiti

Awọn aaye ti o tobi ju baiti kan lọ ti wa ni ipamọ ni ọna kika nla-endian (aṣẹ baiti nẹtiwọki), iyẹn ni, 0x1234 ti kọ bi 0x12, 0x34.

Oju-iwe

Gbogbo iranti filasi ti pin si awọn oju-iwe ti iwọn dogba.

Iwọn oju-iwe aiyipada jẹ 32Kb, ṣugbọn ko ju 1/4 ti iwọn lapapọ ti ërún iranti (fun ërún 4MB kan, awọn oju-iwe 128 ti gba).

Oju-iwe kọọkan tọju data ni ominira ti awọn miiran (iyẹn ni, data lori oju-iwe kan ko ṣe itọkasi data lori oju-iwe miiran).

Gbogbo awọn oju-iwe ti wa ni nọmba ni ọna ti ara (ni ọna ti awọn adirẹsi ti nlọ), bẹrẹ pẹlu nọmba 0 (odo oju-iwe bẹrẹ ni adirẹsi 0, oju-iwe akọkọ bẹrẹ ni 32Kb, oju-iwe keji bẹrẹ ni 64Kb, ati bẹbẹ lọ)

Chip iranti ni a lo bi ifipamọ gigun kẹkẹ (ipinnu oruka), iyẹn ni, kikọ akọkọ lọ si nọmba oju-iwe 0, lẹhinna nọmba 1, ..., nigba ti a kun oju-iwe ti o kẹhin, ọmọ tuntun kan bẹrẹ ati gbigbasilẹ tẹsiwaju lati oju-iwe odo. .

Ninu oju-iwe naa

Mi imuse ti a oruka saarin ni NOR filasi
Ni ibẹrẹ oju-iwe naa, akọle oju-iwe 4-byte ti wa ni ipamọ, lẹhinna akọsori checksum (CRC-32C), lẹhinna awọn igbasilẹ ti wa ni ipamọ ni ọna kika "akọsori, data, checksum".

Akọle oju-iwe naa (awọ ewe idọti ninu aworan atọka) ni:

  • aaye Nọmba Magic meji-baiti (tun jẹ ami ti ẹya kika)
    fun awọn ti isiyi ti ikede ti awọn kika ti o ti wa ni iṣiro bi 0xed00 ⊕ номер страницы;
  • meji-baiti counter "Page version" (iranti rewrite ọmọ nọmba).

Awọn titẹ sii lori oju-iwe ti wa ni ipamọ ni fọọmu fisinuirindigbindigbin (algoridimu deflate ti lo). Gbogbo awọn igbasilẹ ti o wa ni oju-iwe kan ti wa ni fisinuirindigbindigbin ni okun kan (a lo iwe-itumọ ti o wọpọ), ati lori oju-iwe tuntun kọọkan tun bẹrẹ funmorawon. Iyẹn ni, lati decompress eyikeyi igbasilẹ, gbogbo awọn igbasilẹ ti tẹlẹ lati oju-iwe yii (ati eyi nikan) ni a nilo.

Igbasilẹ kọọkan yoo jẹ fisinuirindigbindigbin pẹlu asia Z_SYNC_FLUSH, ati ni opin ṣiṣan fisinuirindigbindigbin yoo jẹ awọn baiti mẹrin 4x0, 00x0, 00xff, 0xff, o ṣee ṣe ṣaju ọkan tabi meji awọn baiti odo diẹ sii.
A sọ ọkọọkan yii silẹ (4, 5 tabi 6 awọn baiti gigun) nigba kikọ si iranti filasi.

Akọsori igbasilẹ jẹ 1, 2 tabi 3 awọn baiti titoju:

  • ọkan die-die (T) nfihan iru igbasilẹ: 0 - context, 1 - log;
  • aaye ipari ti o ni iyipada (S) lati 1 si 7 die-die, ti n ṣalaye ipari ti akọsori ati "iru" ti o gbọdọ fi kun si igbasilẹ fun idinku;
  • ipari igbasilẹ (L).

Tabili iye S:

S
Akọsori ipari, awọn baiti
Danu lori kikọ, baiti

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)

Mo gbiyanju lati ṣapejuwe, Emi ko mọ bi o ṣe han kedere:
Mi imuse ti a oruka saarin ni NOR filasi
Yellow nibi tọkasi awọn T aaye, funfun S aaye, alawọ ewe L (awọn ipari ti awọn fisinuirindigbindigbin data ni awọn baiti), blue awọn fisinuirindigbindigbin data, pupa ik awọn baiti ti awọn fisinuirindigbindigbin data ti o ti wa ni ko kọ si filasi iranti.

Nitorinaa, a le kọ awọn akọle igbasilẹ ti gigun ti o wọpọ julọ (to awọn baiti 63 + 5 ni fọọmu fisinuirindigbindigbin) ni baiti kan.

Lẹhin igbasilẹ kọọkan, CRC-32C checksum ti wa ni ipamọ, ninu eyiti iye iyipada ti sọwedowo iṣaaju ti lo bi iye ibẹrẹ (init).

CRC ni ohun-ini ti “akoko”, agbekalẹ atẹle naa n ṣiṣẹ (pẹlu tabi iyokuro ipadasẹhin diẹ ninu ilana): Mi imuse ti a oruka saarin ni NOR filasi.
Iyẹn ni, ni otitọ, a ṣe iṣiro CRC ti gbogbo awọn baiti ti tẹlẹ ti awọn akọle ati data lori oju-iwe yii.

Taara ni atẹle checksum jẹ akọsori igbasilẹ atẹle.

A ṣe apẹrẹ akọsori ni ọna ti baiti akọkọ rẹ nigbagbogbo yatọ si 0x00 ati 0xff (ti o ba jẹ pe dipo baiti akọkọ ti akọsori a ba pade 0xff, lẹhinna eyi tumọ si pe eyi jẹ agbegbe ti ko lo; 0x00 ṣe ifihan aṣiṣe).

Apeere Algorithms

Kika lati Flash Memory

Eyikeyi kika wa pẹlu ayẹwo ayẹwo.
Ti o ba ti checksum ko baramu, awọn kika ti wa ni tun ni igba pupọ ni ireti ti kika awọn ti o tọ data.

(ìyẹn ló yéni, Linux Kò ṣe àfikún àwọn ìwé kíkà láti NOR Flash, a ti fìdí rẹ̀ múlẹ̀)

Kọ lati filasi iranti

A ṣe igbasilẹ data naa.
Jẹ ki a ka wọn.

Ti data kika ko baamu data ti a kọ, a kun agbegbe pẹlu awọn odo ati ifihan aṣiṣe.

Ngbaradi microcircuit tuntun fun iṣẹ ṣiṣe

Fun ibẹrẹ, akọsori kan pẹlu ẹya 1 ni a kọ si oju-iwe akọkọ (tabi dipo odo).
Lẹhin iyẹn, ọrọ akọkọ ti kọ si oju-iwe yii (ni ninu UUID ti ẹrọ ati awọn eto aiyipada).

Iyẹn ni, iranti filasi ti ṣetan fun lilo.

Ikojọpọ ẹrọ

Nigbati o ba n ṣe ikojọpọ, awọn baiti 8 akọkọ ti oju-iwe kọọkan (akọsori + CRC) ni a ka, awọn oju-iwe pẹlu Nọmba idán aimọ tabi CRC ti ko tọ ni a kọbikita.
Lati awọn oju-iwe “tọ”, awọn oju-iwe pẹlu ẹya ti o pọju ni a yan, ati pe oju-iwe pẹlu nọmba ti o ga julọ ni a gba lati ọdọ wọn.
Igbasilẹ akọkọ ti wa ni kika, atunse ti CRC ati wiwa ti asia “ọrọ” ni a ṣayẹwo. Ti ohun gbogbo ba dara, oju-iwe yii ni a ka si lọwọlọwọ. Ti kii ba ṣe bẹ, a yi pada si ọkan ti tẹlẹ titi ti a yoo fi rii oju-iwe “ifiweranṣẹ”.
ati lori oju-iwe ti a rii a ka gbogbo awọn igbasilẹ, awọn ti a lo pẹlu asia “ọrọ”.
Ṣafipamọ iwe-itumọ zlib (yoo nilo fun fifi kun si oju-iwe yii).

Iyẹn ni, igbasilẹ naa ti pari, ọrọ-ọrọ ti tun pada, o le ṣiṣẹ.

Fifi Akosile Akọsilẹ

A rọ igbasilẹ naa pẹlu iwe-itumọ ti o tọ, ti n ṣalaye Z_SYNC_FLUSH A rii boya igbasilẹ fisinuirindigbindigbin ni ibamu si oju-iwe lọwọlọwọ.
Ti ko ba baamu (tabi awọn aṣiṣe CRC wa lori oju-iwe naa), bẹrẹ oju-iwe tuntun kan (wo isalẹ).
A kọ igbasilẹ ati CRC. Ti aṣiṣe ba waye, bẹrẹ oju-iwe tuntun kan.

Oju-iwe tuntun

A yan oju-iwe ọfẹ kan pẹlu nọmba to kere julọ (a ro oju-iwe ọfẹ lati jẹ oju-iwe kan pẹlu iwe ayẹwo ti ko tọ ninu akọsori tabi pẹlu ẹya ti o kere ju ti lọwọlọwọ lọ). Ti ko ba si iru awọn oju-iwe bẹ, yan oju-iwe pẹlu nọmba to kere julọ lati ọdọ awọn ti o ni ẹya ti o dọgba si ti lọwọlọwọ.
A nu oju-iwe ti o yan. A ṣayẹwo awọn akoonu pẹlu 0xff. Ti nkan kan ba jẹ aṣiṣe, mu oju-iwe ọfẹ ti o tẹle, ati bẹbẹ lọ.
A kọ akọsori kan lori oju-iwe ti o paarẹ, titẹsi akọkọ jẹ ipo lọwọlọwọ ti ọrọ-ọrọ, atẹle ni titẹ sii ti a ko kọ (ti o ba wa).

Ohun elo kika

Ni ero mi, o yipada lati jẹ ọna kika to dara fun titoju eyikeyi diẹ sii tabi kere si awọn ṣiṣan alaye compressible (ọrọ pẹlẹbẹ, JSON, MessagePack, CBOR, o ṣee ṣe protobuf) ni NOR Flash.

Nitoribẹẹ, ọna kika naa jẹ “apẹrẹ” fun SLC NOR Flash.

Ko yẹ ki o lo pẹlu media BER giga gẹgẹbi NAND tabi MLC NOR (Ṣe iru iranti paapaa wa fun tita? Mo ti rii nikan ti mẹnuba ninu awọn iṣẹ lori awọn koodu atunṣe).

Pẹlupẹlu, ko yẹ ki o lo pẹlu awọn ẹrọ ti o ni FTL tiwọn: filasi USB, SD, MicroSD, ati bẹbẹ lọ (fun iru iranti Mo ṣẹda ọna kika pẹlu iwọn oju-iwe ti awọn baiti 512, ibuwọlu ni ibẹrẹ oju-iwe kọọkan ati awọn nọmba igbasilẹ alailẹgbẹ - nigbakan o ṣee ṣe lati gba gbogbo data pada lati kọnputa filasi “glitched” nipasẹ kika lẹsẹsẹ rọrun).

Ti o da lori awọn iṣẹ ṣiṣe, ọna kika le ṣee lo laisi awọn ayipada lori awọn awakọ filasi lati 128Kbit (16Kb) si 1Gbit (128MB). Ti o ba fẹ, o le lo lori awọn eerun nla, ṣugbọn o ṣee ṣe lati ṣatunṣe iwọn oju-iwe naa (Ṣugbọn nibi ibeere ti iṣeeṣe eto-aje ti dide tẹlẹ; idiyele fun iwọn-nla NOR Flash kii ṣe iwuri).

Ti ẹnikan ba rii ọna kika ti o nifẹ ati pe o fẹ lati lo ninu iṣẹ akanṣe kan, kọ, Emi yoo gbiyanju lati wa akoko naa, didan koodu naa ki o firanṣẹ lori github.

ipari

Bi o ti le ri, ni ipari ọna kika ti jade lati rọrun ati paapa alaidun.

O soro lati ṣe afihan itankalẹ ti oju-ọna mi ninu nkan kan, ṣugbọn gbagbọ mi: ni ibẹrẹ Mo fẹ lati ṣẹda nkan ti o fafa, ailagbara, ti o lagbara lati ye paapaa bugbamu iparun ni isunmọtosi. Bibẹẹkọ, idi (Mo nireti) tun bori ati awọn ayo diėdiė yipada si ọna ayedero ati iwapọ.

Ṣe o le jẹ pe mo ṣe aṣiṣe? Beeni. O le yipada daradara, fun apẹẹrẹ, pe a ra ipele kan ti awọn microcircuits didara kekere. Tabi fun idi miiran ohun elo kii yoo pade awọn ireti igbẹkẹle.

Ṣe Mo ni eto fun eyi? Mo ro pe lẹhin kika nkan naa o ko ni iyemeji pe ero kan wa. Ati pe kii ṣe nikan.

Lori akọsilẹ to ṣe pataki diẹ sii, ọna kika ti ni idagbasoke mejeeji bi aṣayan iṣẹ ati bi “alafẹfẹ idanwo”.

Ni akoko ohun gbogbo ti o wa lori tabili n ṣiṣẹ daradara, gangan ni ọjọ miiran ojutu yoo wa ni ransogun (isunmọ) lori awọn ọgọọgọrun awọn ẹrọ, jẹ ki a wo ohun ti o ṣẹlẹ ni iṣẹ “ija” (da, Mo nireti pe ọna kika jẹ ki o rii awọn ikuna ni igbẹkẹle; nitorinaa o le gba awọn iṣiro kikun). Ni awọn oṣu diẹ o yoo ṣee ṣe lati fa awọn ipinnu (ati pe ti o ko ba ni orire, paapaa tẹlẹ).

Ti, da lori awọn abajade ti lilo, awọn iṣoro to ṣe pataki ti wa ni awari ati awọn ilọsiwaju nilo, lẹhinna Emi yoo dajudaju kọ nipa rẹ.

Iwe iwe

Emi ko fẹ lati ṣe atokọ gigun ti awọn iṣẹ ti a lo, gbogbo eniyan ni Google.

Nibi Mo pinnu lati fi atokọ ti awọn awari ti o dabi ẹni pe o nifẹ si mi ni pataki, ṣugbọn diẹdiẹ wọn lọ taara si ọrọ ti nkan naa, ati pe ohun kan wa lori atokọ naa:

  1. IwUlO infgen lati onkowe zlib. Le ṣe afihan awọn akoonu ti deflate/zlib/gzip pamosi ni kedere. Ti o ba ni lati koju pẹlu ọna inu ti ọna kika deflate (tabi gzip), Mo ṣeduro rẹ gaan.

orisun: www.habr.com

Ra alejo gbigba igbẹkẹle fun awọn aaye pẹlu aabo DDoS, awọn olupin VPS VDS 🔥 Ra gbigbalejo oju opo wẹẹbu ti o gbẹkẹle pẹlu aabo DDoS, awọn olupin VPS VDS | ProHoster