{"id":53751,"date":"2019-12-09T00:00:00","date_gmt":"2019-12-08T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/moya-realizatsiya-koltsevogo-bufera-v-nor-flash"},"modified":"2020-02-18T14:01:41","modified_gmt":"2020-02-18T11:01:41","slug":"moya-realizatsiya-koltsevogo-bufera-v-nor-flash","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/moya-realizatsiya-koltsevogo-bufera-v-nor-flash","title":{"rendered":"Az \u00e9n NOR flash gy\u0171r\u0171s puffert megval\u00f3s\u00edt\u00e1sa","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"predystoriya\">H\u00e1tt\u00e9r<\/h1>\n<p><\/p>\n<p>Vannak saj\u00e1t fejleszt\u00e9s\u0171 automata g\u00e9peink. A belsej\u00fckben Raspberry Pi tal\u00e1lhat\u00f3, egy kis kieg\u00e9sz\u00edt\u0151 \u00e1ramk\u00f6rrel. Csatlakoztatva van \u00e9rme- \u00e9s bankjegyelfogad\u00f3, valamint bankk\u00e1rtya termin\u00e1l... Mindent egy saj\u00e1t \u00edr\u00e1s\u00fa program vez\u00e9rel. A m\u0171k\u00f6d\u00e9si t\u00f6rt\u00e9net egy MicroSD-flash-rekordon \u00edr\u00f3dik, amelyet k\u00e9s\u0151bb interneten kereszt\u00fcl (USB-modem seg\u00edts\u00e9g\u00e9vel) a szerverre tov\u00e1bb\u00edtanak, ahol az adatb\u00e1zisba ker\u00fcl. Az \u00e9rt\u00e9kes\u00edt\u00e9si inform\u00e1ci\u00f3k az 1c-be t\u00f6lt\u0151dnek, emellett van egy egyszer\u0171 webbeli fel\u00fclet a monitoroz\u00e1shoz \u00e9s hasonl\u00f3khoz. <\/p>\n<p><\/p>\n<p>Teh\u00e1t a napl\u00f3 l\u00e9tfontoss\u00e1g\u00fa \u2014 a nyilv\u00e1ntart\u00e1shoz (ott az \u00e1rbev\u00e9tel, elad\u00e1sok stb.), a monitoroz\u00e1shoz (k\u00fcl\u00f6nf\u00e9le hib\u00e1k \u00e9s egy\u00e9b v\u00e1ratlan k\u00f6r\u00fclm\u00e9nyek); ez gyakorlatilag az \u00f6sszes inform\u00e1ci\u00f3, amink van err\u0151l az automat\u00e1r\u00f3l. <\/p>\n<p><\/p>\n<h1 id=\"problema\">Probl\u00e9ma<\/h1>\n<p><\/p>\n<p>A flashmem\u00f3ri\u00e1k nagyon megb\u00edzhatatlan eszk\u00f6z\u00f6knek bizonyulnak. Tisztes rendszeress\u00e9ggel romlanak el. Ez le\u00e1ll\u00e1sokhoz vezet, \u00e9s ha valamilyen okb\u00f3l nem tudtuk online \u00e1tadni a napl\u00f3t, adatveszt\u00e9st okoz.<\/p>\n<p><\/p>\n<p><em>Ez m\u00e1r nem az els\u0151 tapasztalatunk a flashmem\u00f3ri\u00e1k haszn\u00e1lat\u00e1val, kor\u00e1bban volt egy m\u00e1sik projekt\u00fcnk t\u00f6bb mint sz\u00e1z eszk\u00f6zzel, ahol a napl\u00f3 USB-flashmem\u00f3ri\u00e1kon t\u00e1rol\u00f3dott, ott is voltak megb\u00edzhat\u00f3s\u00e1gi probl\u00e9m\u00e1k, id\u0151nk\u00e9nt a h\u00f3nap sor\u00e1n tucatnyira n\u0151tt a meghib\u00e1sod\u00e1sok sz\u00e1ma. Pr\u00f3b\u00e1lkoztunk k\u00fcl\u00f6nb\u00f6z\u0151 flashmem\u00f3ri\u00e1kkal, k\u00f6zt\u00fck SLC mem\u00f3ria alap\u00fa m\u00e1rk\u00e1sakkal is; voltak modellek, amelyek megb\u00edzhat\u00f3bbak voltak, de a flashmem\u00f3ri\u00e1k cser\u00e9je nem oldotta meg a probl\u00e9m\u00e1t gy\u00f6keresen.<\/em><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <\/p>\n<p><strong>Figyelem!<\/strong> Hossz\u00fa \u00edr\u00e1s! Ha nem \u00e9rdekel a 'mi\u00e9rt', csak a 'hogyan', akkor mehetsz is tov\u00e1bb. <noindex><a rel=\"nofollow\" href=\"#format\">a v\u00e9g\u00e9re<\/a><\/noindex> cikkek.<\/p>\n<p><\/p>\n<h1 id=\"reshenie\">Megold\u00e1s<\/h1>\n<p><\/p>\n<p>Az els\u0151, ami eszembe jut: lemondani a MicroSD-r\u0151l, p\u00e9ld\u00e1ul SSD-t rakni helyette, \u00e9s arr\u00f3l bootolni. Elm\u00e9letileg lehets\u00e9ges, gondolom, de viszonylag dr\u00e1ga, \u00e9s nem is annyira megb\u00edzhat\u00f3 (USB-SATA adapter ker\u00fcl az \u00fatba; az olcs\u00f3bb SSD-k meghib\u00e1sod\u00e1si statisztik\u00e1ja sem r\u00f3zs\u00e1s).<\/p>\n<p><\/p>\n<p>A USB HDD sem t\u0171nik k\u00fcl\u00f6n\u00f6sebben vonz\u00f3 megold\u00e1snak.<\/p>\n<p><\/p>\n<p>Ez\u00e9rt jutottunk arra a megold\u00e1sra, hogy megtartsuk a bootol\u00e1st MicroSD-r\u0151l, de read-only \u00fczemm\u00f3dban haszn\u00e1lva, \u00e9s a m\u0171k\u00f6d\u00e9si napl\u00f3t (\u00e9s egy\u00e9b, a konkr\u00e9t hardverre jellemz\u0151 inform\u00e1ci\u00f3kat \u2014 sorozatsz\u00e1m, szenzorok kalibr\u00e1l\u00e1sa stb.) m\u00e1shol t\u00e1roljuk. <\/p>\n<p><\/p>\n<p>A read-only f\u00e1jlrendszer t\u00e9m\u00e1ja a Raspberry Pi eset\u00e9ben m\u00e1r alaposan ki lett dolgozva, ezen a cikken nem \u00e1llok meg az implement\u00e1ci\u00f3 r\u00e9szletein\u00e9l. <em>(de ha \u00e9rdekel, lehet, hogy \u00edrok egy mini-cikket err\u0151l a t\u00e9m\u00e1r\u00f3l)<\/em>. Az egyetlen dolog, amit \u00e9rdemes megeml\u00edteni: tanto a szem\u00e9lyes tapasztalataim, mint a m\u00e1r implement\u00e1lt megb\u00edzhat\u00f3s\u00e1gr\u00f3l sz\u00f3l\u00f3 v\u00e9lem\u00e9nyek alapj\u00e1n. Igen, teljesen megszabadulni a meghib\u00e1sod\u00e1sokt\u00f3l lehetetlen, de a gyakoris\u00e1gukat nagym\u00e9rt\u00e9kben cs\u00f6kkenteni lehet. R\u00e1ad\u00e1sul a k\u00e1rty\u00e1k egys\u00e9gesebb\u00e9 v\u00e1lnak, ami jelent\u0151sen megk\u00f6nny\u00edti a karbantart\u00f3 szem\u00e9lyzet sz\u00e1m\u00e1ra a cser\u00e9t.<\/p>\n<p><\/p>\n<h2 id=\"apparatnaya-chast\">Hardver r\u00e9sz<\/h2>\n<p><\/p>\n<p>A mem\u00f3ria t\u00edpusa kiv\u00e1laszt\u00e1sa k\u00f6r\u00fcl nem voltak k\u00fcl\u00f6n\u00f6sebb k\u00e9ts\u00e9gek \u2014 NOR Flash.<br \/>\nArgumentumok: <\/p>\n<p><\/p>\n<ul>\n<li>Egyszer\u0171 csatlakoz\u00e1s (jellemz\u0151en SPI busz, aminek a haszn\u00e1lat\u00e1val m\u00e1r van tapasztalatunk, \u00edgy 'hardveres' probl\u00e9m\u00e1kra nem sz\u00e1m\u00edtunk);<\/li>\n<li>vicces \u00e1r;<\/li>\n<li>szabv\u00e1nyos m\u0171k\u00f6d\u00e9si protokoll (a megval\u00f3s\u00edt\u00e1s m\u00e1r megtal\u00e1lhat\u00f3 a Linux kernel\u00e9ben, ig\u00e9ny eset\u00e9n k\u00fcls\u0151 implement\u00e1ci\u00f3kat is lehet tal\u00e1lni, vagy ak\u00e1r saj\u00e1tot is \u00edrhatunk, mivel minden egyszer\u0171);<\/li>\n<li>megb\u00edzhat\u00f3s\u00e1g \u00e9s \u00e9lettartam:<br \/>\na tipikus adatlapb\u00f3l: az adatok 20 \u00e9vig t\u00e1rol\u00f3dnak, 100000 t\u00f6rl\u00e9si ciklus minden blokkra;<br \/>\nk\u00fcls\u0151 forr\u00e1sokb\u00f3l: rendk\u00edv\u00fcl alacsony BER, \u00e1ll\u00edtj\u00e1k, hogy nincs sz\u00fcks\u00e9g hibajav\u00edt\u00f3 k\u00f3dokra <em>(n\u00e9h\u00e1ny dolgozat az ECC-t vizsg\u00e1lja a NOR-ra, de \u00e1ltal\u00e1ban MLC NOR-ra gondolnak, ilyen is van)<\/em>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Tekints\u00fck \u00e1t a kapacit\u00e1sra \u00e9s a forr\u00e1sra vonatkoz\u00f3 k\u00f6vetelm\u00e9nyeket.<\/p>\n<p><\/p>\n<p>Azt szeretn\u00e9m, ha garant\u00e1ltan meg\u0151rizn\u00e9nk az adatokat n\u00e9h\u00e1ny napig. Erre az\u00e9rt van sz\u00fcks\u00e9g, hogy ha b\u00e1rmilyen probl\u00e9ma mer\u00fclne fel a kommunik\u00e1ci\u00f3val, az \u00e9rt\u00e9kes\u00edt\u00e9si t\u00f6rt\u00e9net ne vesszen el. 5 napra fogunk c\u00e9lozni, ezen id\u0151szak alatt <em>(a h\u00e9tv\u00e9g\u00e9ket \u00e9s \u00fcnnepeket is figyelembe v\u00e9ve)<\/em> megoldhat\u00f3 a probl\u00e9ma.<\/p>\n<p><\/p>\n<p>Jelenleg egy nap alatt k\u00f6r\u00fclbel\u00fcl 100kB napl\u00f3 keletkezik (3-4 ezer bejegyz\u00e9s), azonban fokozatosan ez a sz\u00e1m n\u00f6vekszik \u2014 n\u0151 a r\u00e9szletes\u00e9g, \u00faj esem\u00e9nyek ker\u00fclnek hozz\u00e1. Plusz n\u00e9ha vannak cs\u00facsok (valamilyen \u00e9rz\u00e9kel\u0151 elkezd hamis riaszt\u00e1sokat k\u00fcldeni, p\u00e9ld\u00e1ul). Sz\u00e1moljunk 10 ezer bejegyz\u00e9sre 100 byte-on \u2014 ez napi egy megab\u00e1jt.<\/p>\n<p><\/p>\n<p>\u00cdgy \u00f6sszesen 5MB tiszta (j\u00f3l t\u00f6m\u00f6r\u00edthet\u0151) adat keletkezik. Ehhez m\u00e9g <em>(durva becsl\u00e9s)<\/em> 1MB seg\u00e9dadat.<\/p>\n<p><\/p>\n<p>Teh\u00e1t egy 8MB-os chipre van sz\u00fcks\u00e9g\u00fcnk, ha nem haszn\u00e1lunk t\u00f6m\u00f6r\u00edt\u00e9st, vagy 4MB-ra, ha haszn\u00e1lunk. Teljesen re\u00e1lis sz\u00e1mok ennek a mem\u00f3ria t\u00edpusnak.<\/p>\n<p><\/p>\n<p>Ami a forr\u00e1st illeti: ha azt tervezz\u00fck, hogy a mem\u00f3ri\u00e1t legfeljebb 5 naponk\u00e9nt \u00edrjuk fel\u00fcl, t\u00edz \u00e9v szolg\u00e1lat alatt kevesebb mint ezer \u00fajra\u00edr\u00e1si ciklust kapunk.<br \/>\nEml\u00e9keztetek, a gy\u00e1rt\u00f3 sz\u00e1zezer ciklust \u00edg\u00e9r.<\/p>\n<p>\n<b class=\"spoiler_title\">Kicsit a NOR vs NAND-r\u00f3l<\/b><\/p>\n<p>Ma m\u00e1r term\u00e9szetesen sokkal n\u00e9pszer\u0171bb a NAND mem\u00f3ria, de ehhez a projekthez nem aj\u00e1nlan\u00e1m: a NAND a NOR-ral ellent\u00e9tben mindenk\u00e9ppen hibajav\u00edt\u00f3 k\u00f3dok, hib\u00e1s blokkt\u00e1bl\u00e1k stb. haszn\u00e1lat\u00e1t ig\u00e9nyli, \u00e9s a NAND chipek pintjei \u00e1ltal\u00e1ban sokkal t\u00f6bbek.<\/p>\n<p><\/p>\n<p>A NOR h\u00e1tr\u00e1nyai k\u00f6z\u00e9 sorolhat\u00f3k:<\/p>\n<p><\/p>\n<ul>\n<li>kicsi kapacit\u00e1s (ez\u00e9rt magas \u00e1r megab\u00e1jtonk\u00e9nt);<\/li>\n<li>nem t\u00fal gyors adat\u00e1tvitel (t\u00f6bbnyire a megszokott soros interf\u00e9sz, \u00e1ltal\u00e1ban SPI vagy I2C miatt);<\/li>\n<li>lass\u00fa t\u00f6rl\u00e9s (a blokk m\u00e9ret\u00e9t\u0151l f\u00fcgg\u0151en m\u00e1sodperct\u0151l n\u00e9h\u00e1ny m\u00e1sodpercig terjed).<\/li>\n<\/ul>\n<p><\/p>\n<p>\u00dagy t\u0171nik, hogy sz\u00e1munkra ez nem kritikus, \u00edgy folytatjuk.<\/p>\n<p><\/p>\n<p>Ha a r\u00e9szletek \u00e9rdeklik, a kiv\u00e1lasztott chip a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.adestotech.com\/wp-content\/uploads\/doc3686.pdf\">at25df321a<\/a><\/noindex> <em>(b\u00e1r ez l\u00e9nyegtelen, a piacon rengeteg anal\u00f3g l\u00e9tezik, amelyek az elrendez\u00e9s \u00e9s a parancsrendszer szempontj\u00e1b\u00f3l kompatibilisek; m\u00e9g ha m\u00e1s gy\u00e1rt\u00f3 chipj\u00e9t vagy m\u00e1s kapacit\u00e1s\u00fat is szeretn\u00e9nk haszn\u00e1lni, akkor minden m\u0171k\u00f6dik a k\u00f3d m\u00f3dos\u00edt\u00e1sa n\u00e9lk\u00fcl)<\/em>.<\/p>\n<p><\/p>\n<p>A Linux kernelben be\u00e9p\u00edtett drivert haszn\u00e1lok, a Raspberry Pi-n a device tree overlay t\u00e1mogat\u00e1s\u00e1nak k\u00f6sz\u00f6nhet\u0151en nagyon egyszer\u0171 \u2014 a \/boot\/overlays mapp\u00e1ba kell helyezni a leford\u00edtott overlayt \u00e9s kicsit m\u00f3dos\u00edtani a \/boot\/config.txt-t.<\/p>\n<p>\n<b class=\"spoiler_title\">DTS f\u00e1jl p\u00e9lda<\/b><\/p>\n<p>\u0150szint\u00e9n sz\u00f3lva nem vagyok biztos benne, hogy hib\u00e1tlan, de m\u0171k\u00f6dik.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">\/*\n * Device tree overlay for at25 at spi0.1\n *\/\n\n\/dts-v1\/;\n\/plugin\/;\n\n\/ {\n    compatible = \"brcm,bcm2835\", \"brcm,bcm2836\", \"brcm,bcm2708\", \"brcm,bcm2709\"; \n\n    \/* disable spi-dev for spi0.1 *\/\n    fragment@0 {\n        target = &lt;&amp;spi0&gt;;\n        __overlay__ {\n            status = \"okay\";\n            spidev@1{\n                status = \"disabled\";\n            };\n        };\n    };\n\n    \/* the spi config of the at25 *\/\n    fragment@1 {\n        target = &lt;&amp;spi0&gt;;\n        __overlay__ {\n            #address-cells = &lt;1&gt;;\n            #size-cells = &lt;0&gt;;\n            flash: m25p80@1 {\n                    compatible = \"atmel,at25df321a\";\n                    reg = &lt;1&gt;;\n                    spi-max-frequency = &lt;50000000&gt;;\n\n                    \/* default to false:\n                    m25p,fast-read ;\n                    *\/\n            };\n        };\n    };\n\n    __overrides__ {\n        spimaxfrequency = &lt;&amp;flash&gt;,\"spi-max-frequency:0\";\n        fastread = &lt;&amp;flash&gt;,\"m25p,fast-read?\";\n    };\n};<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">\u00c9s m\u00e9g egy sor a config.txt-ben<\/b><\/p>\n<pre><code class=\"plaintext\">dtoverlay=at25:spimaxfrequency=50000000<\/code><\/pre>\n<p><\/p>\n<p>A chip Raspberry Pi-hez val\u00f3 csatlakoz\u00e1s\u00e1nak le\u00edr\u00e1s\u00e1t most kihagyom. Egyr\u00e9szt nem vagyok szak\u00e9rt\u0151 az elektronik\u00e1ban, m\u00e1sr\u00e9szt ez sz\u00e1momra is ban\u00e1lis: a chipnek \u00f6sszesen 8 l\u00e1ba van, amelyek k\u00f6z\u00fcl a f\u00f6ld, t\u00e1pegys\u00e9g \u00e9s SPI (CS, SI, SO, SCK) sz\u00fcks\u00e9ges; a szintek megegyeznek a Raspberry Pi szintjeivel, nem sz\u00fcks\u00e9ges semmilyen kieg\u00e9sz\u00edt\u0151 kapcsol\u00e1s \u2014 egyszer\u0171en csak \u00f6ssze kell k\u00f6tni a megadott 6 \u00e9rintkez\u0151t.<\/p>\n<p><\/p>\n<h2 id=\"postanovka-zadachi\">L\u00e9pj\u00fcnk \u00e1t a kit\u0171z\u00f6tt feladatra: \u00edrjunk egy XDP mechanizmust SYN cookie-kkal.<\/h2>\n<p><\/p>\n<p>Mint mindig, a feladat fel\u00e1ll\u00edt\u00e1sa t\u00f6bb iter\u00e1ci\u00f3n megy \u00e1t, \u00e9s \u00fagy \u00e9rzem, itt az ideje egy \u00fajabbnak. Teh\u00e1t \u00e1lljunk meg, gy\u0171jts\u00fck \u00f6ssze, ami m\u00e1r k\u00e9sz\u00fclt, \u00e9s tiszt\u00e1zzuk a m\u00e9g \u00e1rny\u00e9kban maradt r\u00e9szleteket.<\/p>\n<p><\/p>\n<p>Teh\u00e1t meg\u00e1llap\u00edtottuk, hogy a napl\u00f3 SPI NOR Flash-ben lesz t\u00e1rolva.<\/p>\n<p>\n<b class=\"spoiler_title\">Mi az a NOR Flash, akinek nem tudja?<\/b><\/p>\n<p>Ez egy nem-energi\u00e1hoz k\u00f6t\u00f6tt mem\u00f3ria, amellyel h\u00e1rom m\u0171veletet lehet v\u00e9gezni:<\/p>\n<p><\/p>\n<ol>\n<li>Olvas\u00e1s:<br \/>\nA legegyszer\u0171bb olvas\u00e1s: megadjuk a c\u00edmet, \u00e9s annyi b\u00e1jtot olvasunk, amennyire sz\u00fcks\u00e9g\u00fcnk van;<\/li>\n<li>\u00cdr\u00e1s:<br \/>\nA NOR flash write appears ordinary but has one feature: you can only change 1 to 0, not the other way around. For example, if we had 0x55 stored in a memory cell, after writing 0x0f to it, it would now hold 0x05. <em>(see the table a bit below)<\/em>;<\/li>\n<li>Erase:<br \/>\nOf course, we also need to perform the reverse operation \u2014 changing 0 to 1, and that's why the erase operation exists. Unlike the first two, it operates not on bytes but on blocks (the minimum erase block in the chosen chip is 4KB). Erase deletes the entire block, and this is the only way to change 0 to 1. Therefore, when working with flash memory, it often requires aligning data structures on the erase block boundary.<br \/>\nWriting to NOR Flash:<\/li>\n<\/ol>\n<p><\/p>\n<p>Binary data<\/p>\n<p><strong>Volt<\/strong><br \/>\n<code>01010101<\/code><\/p>\n<p><strong>Recorded<\/strong><br \/>\n<code>00001111<\/code><\/p>\n<p><strong>Lett<\/strong><br \/>\n<code>00000101<\/code><\/p>\n<p><\/p>\n<p>The journal itself represents a sequence of variable-length records. The typical record length is about 30 bytes (although sometimes records may be several kilobytes long). <em>In this case, we treat them simply as a set of bytes, but, if interested, within the records, CBOR is used.<\/em><\/p>\n<p><\/p>\n<p>A napl\u00f3 mellett sz\u00fcks\u00e9g\u00fcnk van bizonyos 'be\u00e1ll\u00edt\u00f3' inform\u00e1ci\u00f3k t\u00e1rol\u00e1s\u00e1ra, amelyeket r\u00e9szben friss\u00edt\u00fcnk: egy eszk\u00f6z azonos\u00edt\u00f3ja, az \u00e9rz\u00e9kel\u0151k kalibr\u00e1l\u00e1sa, a 'eszk\u00f6z ideiglenesen ki van kapcsolva' jelz\u0151, stb.<br \/>\nThis information consists of key-value records, also stored in CBOR. We don't have much of this information (a maximum of a few kilobytes), and it is updated infrequently.<br \/>\nFrom now on, we will refer to it as context.<\/p>\n<p><\/p>\n<p>As a reminder of where this article started from, it is crucial to ensure data storage reliability and, if possible, uninterrupted operation even in the event of hardware failures\/data corruption.<\/p>\n<p><\/p>\n<p>What sources of problems can we consider?<\/p>\n<p><\/p>\n<ul>\n<li>\u00c1ramkimarad\u00e1s a write\/erase m\u0171veletek sor\u00e1n. Ez a 'nincs ellene fog\u00e1s a r\u00fad ellen' kateg\u00f3ri\u00e1ba tartozik.<br \/>\nInformation from <noindex><a rel=\"nofollow\" href=\"https:\/\/electronics.stackexchange.com\/questions\/225956\/what-would-happen-in-case-of-power-outage-during-nor-flash-erase-or-programming\">vita<\/a><\/noindex> A stackexchange-n: \u00e1ramkimarad\u00e1s eset\u00e9n flash m\u0171veletekn\u00e9l mind az erase (1-re \u00e1ll\u00edt\u00e1s), mind a write (0-ra \u00e1ll\u00edt\u00e1s) meghat\u00e1rozatlan viselked\u00e9st eredm\u00e9nyez: az adatok lehet, hogy meg\u00edr\u00f3dnak, r\u00e9szben meg\u00edr\u00f3dnak (mondjuk, 10 b\u00e1jtot \/ 80 bitet adtunk \u00e1t, de csak 45 bit \u00edr\u00f3dott meg), az sem kiz\u00e1rt, hogy egyes bitek '\u00e1tmeneti' \u00e1llapotban maradnak (az olvas\u00e1s eredm\u00e9nye 0 vagy 1 lehet);<\/li>\n<li>Flash memory errors.<br \/>\nBER, although very low, cannot be zero;<\/li>\n<li>Bus errors<br \/>\nA SPI-n kereszt\u00fcl \u00e1tvitt adatok nincsenek v\u00e9dve, \u00edgy el\u0151fordulhatnak egyedi bit- vagy szinkroniz\u00e1l\u00e1si hib\u00e1k \u2014 bitek elveszt\u00e9se vagy besz\u00far\u00e1sa (ami t\u00f6meges adatelt\u00e9r\u00e9sekhez vezethet);<\/li>\n<li>Egy\u00e9b hib\u00e1k \/ zavarok<br \/>\nK\u00f3dhib\u00e1k, Raspberry 'bugok', f\u00f6ld\u00f6n k\u00edv\u00fcliek beavatkoz\u00e1sa...<\/li>\n<\/ul>\n<p><\/p>\n<p>\u00d6ssze\u00e1ll\u00edtottam azokat a k\u00f6vetelm\u00e9nyeket, amelyeknek, v\u00e9lem\u00e9nyem szerint, sz\u00fcks\u00e9gesek a megb\u00edzhat\u00f3s\u00e1g biztos\u00edt\u00e1s\u00e1hoz:<\/p>\n<p><\/p>\n<ul>\n<li>az adatoknak azonnal a flash mem\u00f3ri\u00e1ba kell ker\u00fclni\u00fck, a k\u00e9sleltetett \u00edr\u00e1st nem veszem figyelembe; - ha hiba l\u00e9p fel, azt a lehet\u0151 leghamarabb \u00e9szlelni \u00e9s kezelni kell; - a rendszernek lehet\u0151s\u00e9g szerint helyre kell \u00e1ll\u00edtania a m\u0171k\u00f6d\u00e9st hib\u00e1k ut\u00e1n.<br \/>\n<em>(p\u00e9lda az \u00e9letb\u0151l, 'hogyan nem szabad, hogy legyen', amivel gondolom, mindannyian tal\u00e1lkoztunk: egy v\u00e1ratlan \u00fajraind\u00edt\u00e1s ut\u00e1n 'megs\u00e9r\u00fclt' a f\u00e1jlrendszer \u00e9s az oper\u00e1ci\u00f3s rendszer nem indul el)<\/em><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"idei-podhody-razmyshleniya\">\u00d6tletek, megk\u00f6zel\u00edt\u00e9sek, gondolatok<\/h2>\n<p><\/p>\n<p>Amikor elkezdtem gondolkodni ezen a feladaton, rengeteg \u00f6tlet futott \u00e1t az agyamon, p\u00e9ld\u00e1ul:<\/p>\n<p><\/p>\n<ul>\n<li>adatok t\u00f6m\u00f6r\u00edt\u00e9se;<\/li>\n<li>okos adatstrukt\u00far\u00e1k haszn\u00e1lata, p\u00e9ld\u00e1ul a rekordok fejl\u00e9c\u00e9nek k\u00fcl\u00f6n t\u00e1rol\u00e1sa a maguk a rekordokt\u00f3l, hogy hiba eset\u00e9n a t\u00f6bbit probl\u00e9mamentesen lehessen olvasni;<\/li>\n<li>bitmez\u0151k haszn\u00e1lata a rekord befejezetts\u00e9g\u00e9nek ellen\u0151rz\u00e9s\u00e9re \u00e1ramkimarad\u00e1s eset\u00e9n;<\/li>\n<li>ellen\u0151rz\u0151 \u00f6sszegek t\u00e1rol\u00e1sa mindenen \u00e9s mindenkoron;<\/li>\n<li>valamilyen zavar\u00e1ll\u00f3 k\u00f3dol\u00e1s alkalmaz\u00e1sa.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ezek k\u00f6z\u00fcl egyes \u00f6tletek megval\u00f3sultak, m\u00edg m\u00e1sokt\u00f3l el\u00e1lltunk. N\u00e9zz\u00fck sorban.<\/p>\n<p><\/p>\n<h3 id=\"szhatie-dannyh\">Adatok t\u00f6m\u00f6r\u00edt\u00e9se<\/h3>\n<p><\/p>\n<p>A napl\u00f3ban r\u00f6gz\u00edtett esem\u00e9nyek meglehet\u0151sen egys\u00e9gesek \u00e9s ism\u00e9tl\u0151d\u0151ek ('5 forintos \u00e9rm\u00e9t dobtunk', 'megnyomtuk a visszaad\u00e1s gombj\u00e1t', ...). Ez\u00e9rt a t\u00f6m\u00f6r\u00edt\u00e9s val\u00f3sz\u00edn\u0171leg el\u00e9g hat\u00e9kony lesz.<\/p>\n<p><\/p>\n<p>A t\u00f6m\u00f6r\u00edt\u00e9s k\u00f6lts\u00e9gei elhanyagolhat\u00f3ak (a processzorunk el\u00e9g er\u0151s, m\u00e9g az els\u0151 Pi-n is volt egy 700 MHz-es mag, a jelenlegi modelleken t\u00f6bb mag is van, ak\u00e1r egy gigahertzes frekvenci\u00e1val), a t\u00e1rol\u00f3val val\u00f3 kommunik\u00e1ci\u00f3 sebess\u00e9ge nem t\u00fal magas (t\u00f6bb megab\u00e1jt m\u00e1sodpercenk\u00e9nt), a rekordok m\u00e9rete kicsi. \u00d6sszess\u00e9g\u00e9ben, ha a t\u00f6m\u00f6r\u00edt\u00e9s hat\u00e1ssal is lesz a teljes\u00edtm\u00e9nyre, az csak pozit\u00edv lesz. <em>(abszol\u00fat nem kritikus, csak megjegyzem)<\/em>. Plusz nek\u00fcnk nem igazi embedded-\u00fcnk van, hanem egy szokv\u00e1nyos Linux \u2013 \u00edgy a megval\u00f3s\u00edt\u00e1snak nem kell sok er\u0151fesz\u00edt\u00e9st ig\u00e9nyelnie (el\u00e9g csak a k\u00f6nyvt\u00e1rat \u00f6sszekapcsolni \u00e9s haszn\u00e1lni n\u00e9h\u00e1ny funkci\u00f3t bel\u0151le).<\/p>\n<p><\/p>\n<p>Egy m\u0171k\u00f6d\u0151 eszk\u00f6z logj\u00e1nak egy r\u00e9sz\u00e9t (1,7 MB, 70 ezer bejegyz\u00e9s) vett\u00fck \u00e9s el\u0151sz\u00f6r ellen\u0151rizt\u00fck a t\u00f6m\u00f6r\u00edthet\u0151s\u00e9get a sz\u00e1m\u00edt\u00f3g\u00e9pen el\u00e9rhet\u0151 gzip, lz4, lzop, bzip2, xz, zstd seg\u00edts\u00e9g\u00e9vel.<\/p>\n<p><\/p>\n<ul>\n<li>A gzip, xz, zstd hasonl\u00f3 eredm\u00e9nyeket mutattak (40 KB).<br \/>\nMeglepett, hogy a divatos xz itt a gzip vagy zstd szintj\u00e9n teljes\u00edtett;<\/li>\n<li>Az lzip alapbe\u00e1ll\u00edt\u00e1sai kicsit gyeng\u00e9bb eredm\u00e9nyt adtak;<\/li>\n<li>Az lz4 \u00e9s lzop nem mutattak t\u00falzottan j\u00f3 eredm\u00e9nyt (150 KB);<\/li>\n<li>A bzip2 meglep\u0151en j\u00f3 eredm\u00e9nyt mutatott (18 KB).<\/li>\n<\/ul>\n<p><\/p>\n<p>Teh\u00e1t az adatok nagyon j\u00f3l t\u00f6m\u00f6r\u00edthet\u0151k.<br \/>\nSz\u00f3val (ha nem tal\u00e1lunk fat\u00e1lis hib\u00e1kat) a t\u00f6m\u00f6r\u00edt\u00e9snek lennie kell! Csak az\u00e9rt, mert t\u00f6bb adat f\u00e9r el ugyanarra a flash meghajt\u00f3ra.<\/p>\n<p><\/p>\n<p>Gondolkodjunk a h\u00e1tr\u00e1nyokr\u00f3l.<\/p>\n<p><\/p>\n<p>Az els\u0151 probl\u00e9ma: m\u00e1r meg\u00e1llapodtunk abban, hogy minden bejegyz\u00e9snek azonnal a flashbe kell ker\u00fclnie. \u00c1ltal\u00e1ban az archiver addig gy\u0171jti az adatokat a bemeneti \u00e1raml\u00e1sb\u00f3l, am\u00edg azt nem d\u00f6ntheti el, hogy ideje \u00edrni a kimenetre. Nek\u00fcnk azonban azonnal meg kell kapnunk a t\u00f6m\u00f6r\u00edtett adatblokkot, \u00e9s el kell menten\u00fcnk az energiat\u00e1rol\u00f3 mem\u00f3ri\u00e1ba.<\/p>\n<p><\/p>\n<p>H\u00e1rom utat l\u00e1tok:<\/p>\n<p><\/p>\n<ol>\n<li>Minden bejegyz\u00e9st sz\u00f3t\u00e1ri t\u00f6m\u00f6r\u00edt\u00e9ssel t\u00f6m\u00f6r\u00edteni a fenti algoritmusok helyett.<br \/>\nTeljesen m\u0171k\u00f6d\u0151k\u00e9pes megold\u00e1s, de nem tetszik. A megfelel\u0151 szint\u0171 t\u00f6m\u00f6r\u00edt\u00e9s biztos\u00edt\u00e1sa \u00e9rdek\u00e9ben a sz\u00f3t\u00e1rnak 'az adott adatokra kell form\u00e1l\u00f3dnia', b\u00e1rmilyen v\u00e1ltoztat\u00e1s katasztrof\u00e1lisan cs\u00f6kkenti a t\u00f6m\u00f6r\u00edt\u00e9si szintet. Igen, a probl\u00e9ma megoldhat\u00f3 egy \u00faj sz\u00f3t\u00e1rverzi\u00f3 l\u00e9trehoz\u00e1s\u00e1val, de ez neh\u00e9zs\u00e9g \u2014 minden sz\u00f3t\u00e1rverzi\u00f3t t\u00e1rolnunk kell; minden bejegyz\u00e9sn\u00e9l meg kell adnunk, hogy melyik sz\u00f3t\u00e1rverzi\u00f3val lett t\u00f6m\u00f6r\u00edtve...<\/li>\n<li>Minden bejegyz\u00e9st 'klasszikus' algoritmusokkal t\u00f6m\u00f6r\u00edteni, de f\u00fcggetlen\u00fcl egym\u00e1st\u00f3l.<br \/>\nA t\u00e1rgyalt t\u00f6m\u00f6r\u00edt\u00e9si algoritmusok nem \u00fagy vannak optimaliz\u00e1lva, hogy ilyen m\u00e9ret\u0171 (t\u00f6bb tucat b\u00e1jt) bejegyz\u00e9sekkel dolgozzanak, a t\u00f6m\u00f6r\u00edt\u00e9si ar\u00e1ny nyilv\u00e1nval\u00f3an 1 alatt lesz (azaz az adatok mennyis\u00e9g\u00e9nek n\u00f6veked\u00e9se a t\u00f6m\u00f6r\u00edt\u00e9s helyett);<\/li>\n<li>Flush-t v\u00e9gezni minden bejegyz\u00e9s ut\u00e1n.<br \/>\nSok t\u00f6m\u00f6r\u00edt\u00e9si k\u00f6nyvt\u00e1r t\u00e1mogatja a Flush-t. Ez egy parancs (vagy egy param\u00e9ter a t\u00f6m\u00f6r\u00edt\u00e9si elj\u00e1r\u00e1shoz), amely megad\u00e1sa ut\u00e1n az archiver olyan t\u00f6m\u00f6r\u00edtett \u00e1ramlatot k\u00e9pez, hogy abb\u00f3l vissza lehessen \u00e1ll\u00edtani <strong>mindent<\/strong> azokat a t\u00f6m\u00f6r\u00edtetlen adatokat, amelyek m\u00e1r megkaptuk. Egy hasonl\u00f3 <code>sync<\/code> f\u00e1jlrendszerekben vagy <code>commit<\/code> sql-ben.<br \/>\nFontos, hogy a k\u00f6vetkez\u0151 t\u00f6m\u00f6r\u00edt\u00e9si m\u0171veletek felhaszn\u00e1lhatj\u00e1k a felhalmozott sz\u00f3t\u00e1rt, \u00e9s a t\u00f6m\u00f6r\u00edt\u00e9si ar\u00e1ny nem fog olyan m\u00e9rt\u00e9kben szenvedni, mint az el\u0151z\u0151 v\u00e1ltozatban.<\/li>\n<\/ol>\n<p><\/p>\n<p>Nyilv\u00e1nval\u00f3, hogy a harmadik lehet\u0151s\u00e9get v\u00e1lasztottam, \u00e1lljunk meg enn\u00e9l r\u00e9szletesebben.<\/p>\n<p><\/p>\n<p>R\u00e1tal\u00e1ltak <noindex><a rel=\"nofollow\" href=\"https:\/\/www.bolet.org\/~pornin\/deflate-flush.html\">egy kiv\u00e1l\u00f3 cikkben<\/a><\/noindex> a FLUSH-r\u00f3l a zlib-ben.<\/p>\n<p><\/p>\n<p>A cikk nyom\u00e1n egy k\u00f3stol\u00f3t k\u00e9sz\u00edtettem, \u00e9s 70 ezer bejegyz\u00e9st vettem egy val\u00f3di eszk\u00f6z napl\u00f3j\u00e1b\u00f3l, 60KB-os oldalm\u00e9rettel. <em>(az oldalm\u00e9retre m\u00e9g visszat\u00e9r\u00fcnk)<\/em> kaptam:<\/p>\n<p><\/p>\n<p>Forr\u00e1sadatok<br \/>\ngzip t\u00f6m\u00f6r\u00edt\u00e9s -9 (FLUSH n\u00e9lk\u00fcl)<br \/>\nzlib Z_PARTIAL_FLUSH-sal<br \/>\nzlib Z_SYNC_FLUSH-sal<\/p>\n<p><strong>T\u00e9rfogat, KB<\/strong><br \/>\n1692<br \/>\n40<br \/>\n352<br \/>\n604<\/p>\n<p><\/p>\n<p>Els\u0151 pillant\u00e1sra a FLUSH \u00e1ltal hozott k\u00f6lts\u00e9g t\u00fal magasnak t\u0171nhet, de val\u00f3j\u00e1ban nem sok v\u00e1laszt\u00e1sunk van - vagy egy\u00e1ltal\u00e1n nem t\u00f6m\u00f6r\u00edt\u00fcnk, vagy hat\u00e9konyan t\u00f6m\u00f6r\u00edt\u00fcnk a FLUSH haszn\u00e1lat\u00e1val. Ne felejts\u00fck el, hogy 70 ezer bejegyz\u00e9sr\u0151l van sz\u00f3, a Z_PARTIAL_FLUSH \u00e1ltal hozott t\u00f6bblet mind\u00f6ssze 4-5 b\u00e1jt bejegyz\u00e9senk\u00e9nt. A t\u00f6m\u00f6r\u00edt\u00e9si ar\u00e1ny pedig majdnem 5:1, ami kiv\u00e1l\u00f3 eredm\u00e9nynek sz\u00e1m\u00edt.<\/p>\n<p>\n<b class=\"spoiler_title\">Meglepet\u00e9s lehet, de a Z_SYNC_FLUSH - hat\u00e9konyabb m\u00f3dja a FLUSH v\u00e9grehajt\u00e1s\u00e1nak.<\/b><\/p>\n<p>Z_SYNC_FLUSH haszn\u00e1latakor minden bejegyz\u00e9s utols\u00f3 4 b\u00e1jtja mindig 0x00, 0x00, 0xff, 0xff. Ha ezeket ismerj\u00fck, akkor nem kell t\u00e1rolnunk \u0151ket, \u00edgy a v\u00e9gs\u0151 m\u00e9ret mind\u00f6ssze 324KB-ra cs\u00f6kken.<\/p>\n<p><\/p>\n<p>A cikkben, amelyre hivatkozom, tal\u00e1lhat\u00f3 egy magyar\u00e1zat:<\/p>\n<p><\/p>\n<blockquote><p>Egy \u00faj 0-\u00e1s t\u00edpus\u00fa blokk \u00fcres tartalommal ker\u00fcl hozz\u00e1ad\u00e1sra.<\/p>\n<p>A 0-\u00e1s t\u00edpus\u00fa blokk \u00fcres tartalommal a k\u00f6vetkez\u0151k alkotj\u00e1k:<\/p>\n<ul>\n<li>a h\u00e1rombites blokk fejl\u00e9c;<\/li>\n<li>0-7 bit, amelyek null\u00e1k, a byte-igaz\u00edt\u00e1s el\u00e9r\u00e9se \u00e9rdek\u00e9ben;<\/li>\n<li>a n\u00e9gyb\u00e1jtos sorozat 00 00 FF FF.<\/li>\n<\/ul>\n<p>\n<\/p><\/blockquote>\n<p>Nem neh\u00e9z \u00e9szrevenni, hogy az utols\u00f3 blokk el\u0151tt ezek a 4 b\u00e1jt el\u0151tt 3-10 null\u00e1s bit tal\u00e1lhat\u00f3. Azonban a gyakorlat azt mutatta, hogy a null\u00e1s bitek val\u00f3j\u00e1ban legal\u00e1bb 10-et tesznek ki.<\/p>\n<p><\/p>\n<p>Kider\u00fclt, hogy az ilyen r\u00f6vid adatblokkok \u00e1ltal\u00e1ban (mindig?) 1-es t\u00edpus\u00fa blokkal k\u00f3dolva (fix blokk), amelynek mindig 7 null\u00e1s bitje van, \u00edgy \u00f6sszess\u00e9g\u00e9ben 10-17 garant\u00e1lt null\u00e1s bitet kapunk (az egy\u00e9b bitek k\u00f6r\u00fclbel\u00fcl 50%-os val\u00f3sz\u00edn\u0171s\u00e9ggel lesznek null\u00e1k).<\/p>\n<p><\/p>\n<p>Teh\u00e1t a tesztadatok alapj\u00e1n 100% -os val\u00f3sz\u00edn\u0171s\u00e9ggel a 0x00, 0x00, 0xff, 0xff el\u0151tt egy null\u00e1s b\u00e1jt \u00e1ll, \u00e9s t\u00f6bb mint egyharmad eset\u00e9n - k\u00e9t null\u00e1s b\u00e1jt. <em>(lehet, hogy az a probl\u00e9ma, hogy bin\u00e1ris CBOR-t haszn\u00e1lok, m\u00edg sz\u00f6veges JSON haszn\u00e1lata eset\u00e9n gyakrabban tal\u00e1lkozhatunk a 2-es t\u00edpus\u00fa blokkokkal - dinamikus blokk, \u00edgy a 0x00, 0x00, 0xff, 0xff el\u0151tt kevesebb null\u00e1s b\u00e1jt lenne)<\/em>.<\/p>\n<p><\/p>\n<p>\u00d6sszess\u00e9g\u00e9ben a megl\u00e9v\u0151 tesztadatok alapj\u00e1n kevesebb mint 250KB t\u00f6m\u00f6r\u00edtett adatot lehet el\u00e9rni.<\/p>\n<p><\/p>\n<p>M\u00e9g mindig lehet sp\u00f3rolni egy kicsit, ha a bitek zsongl\u0151rk\u00f6d\u00e9s\u00e9vel foglalkozunk: jelenleg figyelmen k\u00edv\u00fcl hagyjuk a blokk v\u00e9g\u00e9n l\u00e9v\u0151 n\u00e9h\u00e1ny null\u00e1s bitet, \u00e9s a blokk elej\u00e9n l\u00e9v\u0151 n\u00e9h\u00e1ny bit sem v\u00e1ltozik...<br \/>\nDe itt hoztam egy er\u0151sebb d\u00f6nt\u00e9st, hogy meg\u00e1lljak, k\u00fcl\u00f6nben ilyen \u00fctemben eljutok a saj\u00e1t archiv\u00e1l\u00f3 programom fejleszt\u00e9s\u00e9ig.<\/p>\n<p><\/p>\n<p>\u00d6sszess\u00e9g\u00e9ben a tesztadataimb\u00f3l 3-4 byte-ot kaptam \u00edr\u00e1s k\u00f6zben, a t\u00f6m\u00f6r\u00edt\u00e9si ar\u00e1ny t\u00f6bb mint 6:1 lett. \u0150szint\u00e9n mondom: nem is sz\u00e1m\u00edtottam ilyen eredm\u00e9nyre, v\u00e9lem\u00e9nyem szerint minden, ami jobb mint 2:1 \u2014 m\u00e1r egy olyan eredm\u00e9ny, ami indokolja a t\u00f6m\u00f6r\u00edt\u00e9s haszn\u00e1lat\u00e1t.<\/p>\n<p><\/p>\n<p>Minden remek, de a zlib (deflate) \u2014 m\u00e9gis egy r\u00e9gim\u00f3di, elismert \u00e9s kicsit elavult t\u00f6m\u00f6r\u00edt\u0151 algoritmus. M\u00e1r a t\u00e9ny, hogy a sz\u00f3t\u00e1r a legutols\u00f3 32KB nem t\u00f6m\u00f6r\u00edtett adatb\u00f3l k\u00e9sz\u00fcl, ma m\u00e1r furcs\u00e1nak t\u0171nik (teh\u00e1t ha egy adatblokk nagyon hasonl\u00edt arra, ami 40KB-al ezel\u0151tt volt a bemeneti \u00e1raml\u00e1sban, akkor \u00fajra archiv\u00e1l\u00f3dik, nem hivatkozik a m\u00faltb\u00e9li el\u0151fordul\u00e1sra). A modern archiv\u00e1l\u00f3 programok eset\u00e9ben a sz\u00f3t\u00e1r m\u00e9ret\u00e9t gyakrabban m\u00e9rik megab\u00e1jtokban, nem kilob\u00e1jtokban.<\/p>\n<p><\/p>\n<p>Teh\u00e1t folytatjuk a mini-kutat\u00e1sunkat az archiv\u00e1l\u00f3kr\u00f3l.<\/p>\n<p><\/p>\n<p>A k\u00f6vetkez\u0151k\u00e9nt a bzip2-t pr\u00f3b\u00e1ltuk ki (eml\u00e9keztetn\u00e9k, FLUSH n\u00e9lk\u00fcl fantasztikus t\u00f6m\u00f6r\u00edt\u00e9si ar\u00e1nyt mutatott, majdnem 100:1). Sajnos, FLUSH haszn\u00e1lat\u00e1val nagyon gyeng\u00e9n teljes\u00edtett, a t\u00f6m\u00f6r\u00edtett adatok m\u00e9rete nagyobb lett, mint a nem t\u00f6m\u00f6r\u00edtettek.<\/p>\n<p>\n<b class=\"spoiler_title\">Felt\u00e9telez\u00e9seim a kudarc okair\u00f3l<\/b><\/p>\n<p>A Libbz2 csup\u00e1n egy flush lehet\u0151s\u00e9get k\u00edn\u00e1l, amely \u00fagy t\u0171nik, hogy t\u00f6rli a sz\u00f3t\u00e1rat (anal\u00f3gia a zlib Z_FULL_FLUSH-\u00e9val), itt m\u00e1r nem lehet besz\u00e9lni hat\u00e9kony t\u00f6m\u00f6r\u00edt\u00e9sr\u0151l.<\/p>\n<p><\/p>\n<p>V\u00e9g\u00fcl a zstd-t pr\u00f3b\u00e1ltam ki. A param\u00e9tereit\u0151l f\u00fcgg\u0151en ugyanolyan szinten t\u00f6m\u00f6r\u00edt, mint a gzip, de sokkal gyorsabban, vagy pedig jobban, mint a gzip.<\/p>\n<p><\/p>\n<p>Sajnos a FLUSH eset\u00e9ben sem mutatkozott 't\u00fal j\u00f3nak': a t\u00f6m\u00f6r\u00edtett adatok m\u00e9rete k\u00f6r\u00fclbel\u00fcl 700Kb lett.<\/p>\n<p><\/p>\n<p>\u00c9n <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/zstd\/issues\/900\">k\u00e9rd\u00e9st tettem fel<\/a><\/noindex> a projekt github oldal\u00e1n, ahol v\u00e1laszt kaptam, hogy \u00e9rdemes sz\u00e1m\u00edtani 10 byte szolg\u00e1ltat\u00e1si adat megl\u00e9t\u00e9re minden egyes t\u00f6m\u00f6r\u00edtett adatblokkn\u00e1l, ami k\u00f6zel van a kapott eredm\u00e9nyekhez, a deflate-ot utol\u00e9rni nem fog siker\u00fclni.<\/p>\n<p><\/p>\n<p>Ezen a ponton \u00fagy d\u00f6nt\u00f6ttem, hogy befejezem a k\u00eds\u00e9rletez\u00e9st az archiv\u00e1l\u00f3kkal (eml\u00e9keztetn\u00e9k, az xz, lzip, lzo, lz4 tesztel\u00e9skor FLUSH n\u00e9lk\u00fcl nem teljes\u00edtettek j\u00f3l, \u00e9s nem n\u00e9ztem meg a k\u00fcl\u00f6n\u00f6sen egzotikus t\u00f6m\u00f6r\u00edt\u00e9si algoritmusokat).<\/p>\n<p><\/p>\n<p>Visszat\u00e9r\u00fcnk az archiv\u00e1l\u00e1s probl\u00e9m\u00e1ihoz.<\/p>\n<p><\/p>\n<p>A m\u00e1sodik probl\u00e9ma \u2013 ahogy a sorrendre utalunk, nem pedig a jelent\u00e9sre \u2013 az, hogy a t\u00f6m\u00f6r\u00edtett adatok egy egys\u00e9ges folyamot k\u00e9pviselnek, amelyben folyamatosan utal\u00e1sok tal\u00e1lhat\u00f3k az el\u0151z\u0151 r\u00e9szekre. \u00cdgy, ha a t\u00f6m\u00f6r\u00edtett adatok valamelyik szakasza megs\u00e9r\u00fcl, nemcsak a hozz\u00e1 kapcsol\u00f3d\u00f3 t\u00f6m\u00f6r\u00edtetlen adatok blokkja v\u00e9sz el, hanem az \u00f6sszes k\u00f6vetkez\u0151 is.<\/p>\n<p><\/p>\n<p>K\u00e9t megk\u00f6zel\u00edt\u00e9s l\u00e9tezik a probl\u00e9ma megold\u00e1s\u00e1ra:<\/p>\n<p><\/p>\n<ol>\n<li>A probl\u00e9ma megjelen\u00e9s\u00e9nek megakad\u00e1lyoz\u00e1sa \u2013 redundanci\u00e1t adni a t\u00f6m\u00f6r\u00edtett adatokhoz, ami lehet\u0151v\u00e9 teszi a hib\u00e1k azonos\u00edt\u00e1s\u00e1t \u00e9s jav\u00edt\u00e1s\u00e1t; err\u0151l k\u00e9s\u0151bb besz\u00e9l\u00fcnk;<\/li>\n<li>Minimaliz\u00e1lni a k\u00f6vetkezm\u00e9nyeket, ha a probl\u00e9ma felmer\u00fcl<br \/>\nKor\u00e1bban besz\u00e9lt\u00fcnk r\u00f3la, hogy minden adatblokkot f\u00fcggetlen\u00fcl t\u00f6m\u00f6r\u00edthet\u00fcnk, \u00edgy a probl\u00e9ma mag\u00e1t\u00f3l megold\u00f3dik (egy blokk adatainak s\u00e9r\u00fcl\u00e9se csak ennek a blokknak az adatait \u00e9rinti). Azonban ez sz\u00e9ls\u0151s\u00e9ges eset, amikor a t\u00f6m\u00f6r\u00edt\u00e9s hat\u00e9konys\u00e1ga cs\u00f6kken. Az ellent\u00e9tes sz\u00e9ls\u0151s\u00e9g: a 4MB-os chip\u00fcnket egyetlen arch\u00edvumk\u00e9nt haszn\u00e1lni, ami kiv\u00e1l\u00f3 t\u00f6m\u00f6r\u00edt\u00e9st ad, de katasztrof\u00e1lis k\u00f6vetkezm\u00e9nyekkel j\u00e1r adatveszt\u00e9s eset\u00e9n.<br \/>\n<em>Igen, kompromisszumra van sz\u00fcks\u00e9g a megb\u00edzhat\u00f3s\u00e1g szemsz\u00f6g\u00e9b\u0151l. De eml\u00e9kezn\u00fcnk kell arra, hogy az energiatart\u00f3s mem\u00f3ria adatform\u00e1tum\u00e1t fejlesztj\u00fck, amely rendk\u00edv\u00fcl alacsony BER-ral \u00e9s 20 \u00e9ves t\u00e1rol\u00e1si id\u0151vel rendelkezik.<\/em><\/li>\n<\/ol>\n<p><\/p>\n<p>K\u00eds\u00e9rleteim sor\u00e1n felfedeztem, hogy a t\u00f6m\u00f6r\u00edt\u00e9si szintn\u00e9l l\u00e9nyeges vesztes\u00e9gek a 10Kb-n\u00e1l kisebb t\u00f6m\u00f6r\u00edtett adatok blokkjain\u00e1l kezd\u0151dnek.<br \/>\nKor\u00e1bban eml\u00edtett\u00fck, hogy a haszn\u00e1lt mem\u00f3ria lapoz\u00e1sos szervez\u00e9ssel rendelkezik, nem l\u00e1tom az ok\u00e1t, hogy mi\u00e9rt ne haszn\u00e1lhatn\u00e1nk a 'egy lap - egy t\u00f6m\u00f6r\u00edtett adatblokk' megfeleltet\u00e9st.<\/p>\n<p><\/p>\n<p>Teh\u00e1t a minim\u00e1lis \u00e9sszer\u0171 lapm\u00e9ret 16Kb (a seg\u00e9dinform\u00e1ci\u00f3kra is tartal\u00e9kkal). Azonban ilyen kicsi lapm\u00e9ret jelent\u0151s korl\u00e1toz\u00e1sokat jelent a maxim\u00e1lis rekordm\u00e9retre n\u00e9zve.<\/p>\n<p><\/p>\n<p>B\u00e1r jelenleg nem tervezek egyn\u00e9l nagyobb rekordokat kilob\u00e1jt t\u00f6m\u00f6r\u00edt\u00e9sben, \u00fagy d\u00f6nt\u00f6ttem, hogy 32Kb-os lapokat haszn\u00e1lok (\u00f6sszesen 128 lap a chipre).<\/p>\n<p><\/p>\n<p><strong>\u00d6sszefoglalva:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Az adatokat zlib seg\u00edts\u00e9g\u00e9vel t\u00f6m\u00f6r\u00edtve t\u00e1roljuk (deflate);<\/li>\n<li>Minden rekordhoz Z_SYNC_FLUSH-t \u00e1ll\u00edtunk be;<\/li>\n<li>Minden t\u00f6m\u00f6r\u00edtett rekord v\u00e9g\u00e9r\u0151l lev\u00e1gjuk a v\u00e9gs\u0151 biteket <em>(p\u00e9ld\u00e1ul 0x00, 0x00, 0xff, 0xff)<\/em>; a fejl\u00e9cben megadjuk, h\u00e1ny byte-ot v\u00e1gtunk le;<\/li>\n<li>Az adatokat 32 KB-os lapokban t\u00e1roljuk; a lapokon bel\u00fcl egyetlen t\u00f6m\u00f6r\u00edtett adatfolyam halad; minden lapn\u00e1l \u00fajraind\u00edtjuk a t\u00f6m\u00f6r\u00edt\u00e9st.<\/li>\n<\/ul>\n<p><\/p>\n<p>Miel\u0151tt befejezn\u00e9nk a t\u00f6m\u00f6r\u00edt\u00e9st, \u00e9rdemes megeml\u00edteni, hogy a t\u00f6m\u00f6r\u00edtett adatokb\u00f3l csak n\u00e9h\u00e1ny b\u00e1jtot kapunk \u00edr\u00e1skor, ez\u00e9rt rendk\u00edv\u00fcl fontos, hogy ne n\u00f6velj\u00fck meg a seg\u00e9dadatokat, hiszen minden egyes b\u00e1jt sz\u00e1m\u00edt.<\/p>\n<p><\/p>\n<h3 id=\"hranenie-zagolovkov-dannyh\">Adatfejl\u00e9cek t\u00e1rol\u00e1sa<\/h3>\n<p><\/p>\n<p>Mivel a bejegyz\u00e9seink v\u00e1ltoz\u00f3 hossz\u00fas\u00e1g\u00faak, sz\u00fcks\u00e9g\u00fcnk van arra, hogy valamilyen m\u00f3don meghat\u00e1rozzuk a bejegyz\u00e9sek elhelyezked\u00e9s\u00e9t\/hat\u00e1rait.<\/p>\n<p><\/p>\n<p>H\u00e1rom megk\u00f6zel\u00edt\u00e9st ismerek:<\/p>\n<p><\/p>\n<ol>\n<li>Minden bejegyz\u00e9st egy folyamatos adatfolyamban t\u00e1rolunk, el\u0151sz\u00f6r a bejegyz\u00e9s fejl\u00e9c\u00e9t, amely a hossz\u00fas\u00e1got tartalmazza, majd mag\u00e1t a bejegyz\u00e9st.<br \/>\nEbben a v\u00e1ltozatban mind a fejek, mind az adatok v\u00e1ltoz\u00f3 hossz\u00fas\u00e1g\u00faak lehetnek.<br \/>\nAlapvet\u0151en egy l\u00e1ncolt lista alakul ki, amelyet szinte minden\u00fctt haszn\u00e1lnak;<\/li>\n<li>A fejek \u00e9s maguk a bejegyz\u00e9sek k\u00fcl\u00f6n folyamatokban vannak t\u00e1rolva.<br \/>\n\u00c1lland\u00f3 hossz\u00fas\u00e1g\u00fa fejek haszn\u00e1lat\u00e1val el\u00e9rj\u00fck, hogy az egyetlen fej megs\u00e9r\u00fcl\u00e9se ne befoly\u00e1solja a t\u00f6bbit.<br \/>\nHasonl\u00f3 megk\u00f6zel\u00edt\u00e9st alkalmaznak p\u00e9ld\u00e1ul sz\u00e1mos f\u00e1jlrendszerben;<\/li>\n<li>A bejegyz\u00e9seket egy folyamatos adatfolyamban t\u00e1rolj\u00e1k, a bejegyz\u00e9s hat\u00e1r\u00e1t egy bizonyos jel\u00f6l\u0151 (szimb\u00f3lum\/szimb\u00f3lumok sorozat, amely a blokkok belsej\u00e9ben tilos) hat\u00e1rozza meg. Ha a bejegyz\u00e9sen bel\u00fcl megjelenik egy jel\u00f6l\u0151, akkor azt \u00e1tkonvert\u00e1ljuk egy bizonyos sorozatra (escape elj\u00e1r\u00e1s).<br \/>\nHasonl\u00f3 megk\u00f6zel\u00edt\u00e9st alkalmaznak p\u00e9ld\u00e1ul a PPP protokollban.<\/li>\n<\/ol>\n<p><\/p>\n<p>Illusztr\u00e1lom.<\/p>\n<p><\/p>\n<p>1. lehet\u0151s\u00e9g:<br \/>\n<img decoding=\"async\" alt=\"Az \u00e9n NOR flash gy\u0171r\u0171s puffert megval\u00f3s\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2019\/12\/e5a9676ca21eaca07e64ddf9fcd9f2eb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nItt minden nagyon egyszer\u0171: tudva a bejegyz\u00e9s hossz\u00e1t, kisz\u00e1m\u00edthatjuk a k\u00f6vetkez\u0151 fejl\u00e9c c\u00edm\u00e9t. \u00cdgy mozogva haladunk a fejek k\u00f6z\u00f6tt, am\u00edg el nem \u00e9rj\u00fck a 0xff-tel kit\u00f6lt\u00f6tt ter\u00fcletet (szabad ter\u00fclet) vagy az oldal v\u00e9g\u00e9t.<\/p>\n<p><\/p>\n<p>2. lehet\u0151s\u00e9g:<br \/>\n<img decoding=\"async\" alt=\"Az \u00e9n NOR flash gy\u0171r\u0171s puffert megval\u00f3s\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2019\/12\/4fed4860fb659ab6042be9aeeb5c041a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA v\u00e1ltoz\u00f3 hossz\u00fas\u00e1g\u00fa rekord miatt nem tudjuk el\u0151re megmondani, hogy h\u00e1ny rekordra (\u00e9s \u00edgy h\u00e1ny c\u00edmre) lesz sz\u00fcks\u00e9g\u00fcnk az oldalon. Sz\u00e9t lehet v\u00e1lasztani a c\u00edmeket \u00e9s az adatokat k\u00fcl\u00f6nb\u00f6z\u0151 oldalakra, de sz\u00e1momra szimpatikusabb egy m\u00e1sik megk\u00f6zel\u00edt\u00e9s: a c\u00edmek (\u00e1lland\u00f3 m\u00e9ret\u0171ek) az oldal elej\u00e9n, m\u00edg az adatok (v\u00e1ltoz\u00f3 hossz\u00fas\u00e1g\u00faak) az oldal v\u00e9g\u00e9n helyezkednek el. Amint tal\u00e1lkoznak (nincs elegend\u0151 hely egy \u00faj rekord sz\u00e1m\u00e1ra) - az oldalt megteltnek tekintj\u00fck.<\/p>\n<p><\/p>\n<p>3. lehet\u0151s\u00e9g:<br \/>\n<img decoding=\"async\" alt=\"Az \u00e9n NOR flash gy\u0171r\u0171s puffert megval\u00f3s\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2019\/12\/dfb64009aa7781fcb8a47423ff4160c6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nItt nincs sz\u00fcks\u00e9g arra, hogy a fejl\u00e9cben t\u00e1roljuk az adatok hossz\u00e1t vagy m\u00e1s inform\u00e1ci\u00f3t a helymeghat\u00e1roz\u00e1sr\u00f3l, elegend\u0151 a bejegyz\u00e9sek hat\u00e1rait jelz\u0151 jel\u00f6l\u0151kkel rendelkezni. Azonban az adatokat feldolgozni kell \u00edr\u00e1skor\/olvas\u00e1skor.<br \/>\nJel\u00f6l\u0151k\u00e9nt a 0xff-et haszn\u00e1ln\u00e1m (amellyel az oldal kit\u00f6ltve van az erase ut\u00e1n), \u00edgy a szabad ter\u00fclet biztosan nem lesz adatk\u00e9nt \u00e9rtelmezve.<\/p>\n<p><\/p>\n<p>\u00d6sszehasonl\u00edt\u00f3 t\u00e1bl\u00e1zat:<\/p>\n<p><\/p>\n<p>1. lehet\u0151s\u00e9g<br \/>\n2. lehet\u0151s\u00e9g<br \/>\n3. lehet\u0151s\u00e9g<\/p>\n<p><strong>Hibaellen\u00e1ll\u00e1s<\/strong><br \/>\n\u2014<br \/>\n+<br \/>\n+<\/p>\n<p><strong>Kompatibilit\u00e1s<\/strong><br \/>\n+<br \/>\n\u2014<br \/>\n+<\/p>\n<p><strong>Megval\u00f3s\u00edt\u00e1s bonyolults\u00e1ga<\/strong><br \/>\n*<br \/>\n**<br \/>\n**<\/p>\n<p><\/p>\n<p>Az 1. vari\u00e1nsnak van egy v\u00e9gzetes h\u00e1tr\u00e1nya: ha b\u00e1rmelyik fejl\u00e9c s\u00e9r\u00fcl, akkor az \u00f6sszes tov\u00e1bbi l\u00e1nc t\u00f6nkremegy. A t\u00f6bbi vari\u00e1ns lehet\u0151v\u00e9 teszi, hogy r\u00e9szben helyre\u00e1ll\u00edtsuk az adatokat, m\u00e9g t\u00f6meges s\u00e9r\u00fcl\u00e9sek eset\u00e9n is.<br \/>\nDe itt \u00e9rdemes megeml\u00edteni, hogy \u00fagy d\u00f6nt\u00f6tt\u00fcnk, hogy az adatokat t\u00f6m\u00f6r\u00edtett form\u00e1ban t\u00e1roljuk, \u00edgy is, \u00fagy is elvesz\u00edtj\u00fck az \u00f6sszes adatot az oldalon a 't\u00f6r\u00f6tt' rekord ut\u00e1n, teh\u00e1t m\u00e9g ha a t\u00e1bl\u00e1zatban m\u00ednusz is \u00e1ll, azt nem vessz\u00fck figyelembe.<\/p>\n<p><\/p>\n<p>Kompatibilit\u00e1s:<\/p>\n<p><\/p>\n<ul>\n<li>az els\u0151 vari\u00e1nsn\u00e1l csak a hossz\u00fas\u00e1got kell a fejl\u00e9cben t\u00e1rolnunk, ha v\u00e1ltoz\u00f3 hossz\u00fas\u00e1g\u00fa eg\u00e9sz sz\u00e1mokat haszn\u00e1lunk, akkor a legt\u00f6bb esetben egy b\u00e1jttal is be\u00e9rhetj\u00fck;<\/li>\n<li>a m\u00e1sodik vari\u00e1nsn\u00e1l az indul\u00f3 c\u00edmet \u00e9s a hossz\u00fas\u00e1got kell t\u00e1rolnunk; a bejegyz\u00e9snek \u00e1lland\u00f3 m\u00e9ret\u0171nek kell lennie, amit 4 b\u00e1jtra becs\u00fcl\u00f6k a bejegyz\u00e9sre (k\u00e9t b\u00e1jt a eltol\u00e1sra, \u00e9s k\u00e9t b\u00e1jt a hossz\u00fas\u00e1gra);<\/li>\n<li>a harmadik vari\u00e1nsnak elegend\u0151 egyetlen karakter a bejegyz\u00e9s kezdet\u00e9nek jel\u00f6l\u00e9s\u00e9re, plusz a bejegyz\u00e9s a sz\u00f6k\u0151jelez\u00e9s miatt 1\u20132%-kal megn\u0151. \u00d6sszess\u00e9g\u00e9ben k\u00f6r\u00fclbel\u00fcl az els\u0151 vari\u00e1nssal azonos hat\u00e9konys\u00e1ggal b\u00edr.<\/li>\n<\/ul>\n<p><\/p>\n<p>Kezdetben a m\u00e1sodik vari\u00e1nst alap\u00e9rtelmezettk\u00e9nt tekintettem (s\u0151t, m\u00e9g a megval\u00f3s\u00edt\u00e1st is meg\u00edrtam). Csak akkor mondtam le r\u00f3la, amikor v\u00e9glegosan \u00fagy d\u00f6nt\u00f6ttem, hogy t\u00f6m\u00f6r\u00edt\u00e9st haszn\u00e1lok.<\/p>\n<p><\/p>\n<p><em>Lehet, hogy egyszer m\u00e9gis haszn\u00e1lni fogom ezt a verzi\u00f3t. P\u00e9ld\u00e1ul, ha az adatok t\u00e1rol\u00e1s\u00e1val kell foglalkoznom egy haj\u00f3n, amely a F\u00f6ld \u00e9s a Mars k\u00f6z\u00f6tt k\u00f6zlekedik - teljesen m\u00e1s megb\u00edzhat\u00f3s\u00e1gi k\u00f6vetelm\u00e9nyek, \u0171rsug\u00e1rz\u00e1s, \u2026<\/em><\/p>\n<p><\/p>\n<p>Ami a harmadik vari\u00e1nt illeti: k\u00e9t csillagot adtam neki a megval\u00f3s\u00edt\u00e1s bonyolults\u00e1ga miatt, egyszer\u0171en az\u00e9rt, mert nem szeretem a sz\u00f6k\u0151jelez\u00e9ssel, a hossz\u00fas\u00e1g v\u00e1ltoztat\u00e1s\u00e1val stb. bajl\u00f3dni. Igen, lehet, hogy elfogult vagyok, de nekem kell a k\u00f3dot \u00edrnom \u2013 mi\u00e9rt k\u00e9nyszer\u00edtsem magam olyan dolgokra, amiket nem szeretek.<\/p>\n<p><\/p>\n<p><strong>\u00d6sszefoglalva:<\/strong> A 'c\u00edm hossz\u00fas\u00e1g - v\u00e1ltoz\u00f3 hossz\u00fas\u00e1g\u00fa adatok' l\u00e1ncolatos t\u00e1rol\u00e1si lehet\u0151s\u00e9get v\u00e1lasztjuk a hat\u00e9konys\u00e1g \u00e9s a megval\u00f3s\u00edt\u00e1s egyszer\u0171s\u00e9ge miatt.<\/p>\n<p><\/p>\n<h3 id=\"ispolzovanie-bitovyh-poley-dlya-kontrolya-uspeshnosti-operaciy-zapisi\">A bit field usage for tracking the success of write operations.<\/h3>\n<p><\/p>\n<p>I can't quite remember where I got the idea, but it looks something like this:<br \/>\nFor each record, we allocate several bits to store flags.<br \/>\n<em>As we mentioned earlier, after erase all bits are set to 1, and we can change 1 to 0, but not the other way around.<\/em> Teh\u00e1t a 'jelz\u0151 nem \u00e1ll\u00edtva' eset\u00e9n 1-et haszn\u00e1lunk, a 'jelz\u0151 be\u00e1ll\u00edtva' eset\u00e9n pedig 0-t.<\/p>\n<p><\/p>\n<p>Here's how storing a variable length record in flash might look:<\/p>\n<p><\/p>\n<ol>\n<li>Set the flag 'length recording has started';<\/li>\n<li>Record the length;<\/li>\n<li>Set the flag 'data recording has started';<\/li>\n<li>Record the data;<\/li>\n<li>Set the flag 'recording has ended'.<\/li>\n<\/ol>\n<p><\/p>\n<p>In addition, we'll have a flag 'an error occurred', totaling 4 bit flags.<\/p>\n<p><\/p>\n<p>In this case, we have two stable states '1111' \u2014 recording has not started and '1000' \u2014 recording was successful; in case of an unexpected interruption of the recording process, we will obtain intermediate states, which we can later detect and handle.<\/p>\n<p><\/p>\n<p>The approach is interesting, but it only protects against sudden power loss and similar failures, which is certainly important, but it's far from the only (and not even the main) reason for potential failures.<\/p>\n<p><\/p>\n<p><strong>\u00d6sszefoglalva:<\/strong> Let's move forward in search of a good solution.<\/p>\n<p><\/p>\n<h3 id=\"kontrolnye-summy\">Checksums<\/h3>\n<p><\/p>\n<p>Checksums also allow us to ensure (with sufficient probability) that we are reading exactly what should have been written. And, unlike the bit fields discussed above, they work all the time.<\/p>\n<p><\/p>\n<p>If we consider the list of potential sources of problems that we discussed earlier, checksums can detect an error regardless of its origin <em>(except, perhaps, for malicious aliens \u2014 they can forge a checksum too)<\/em>.<\/p>\n<p><\/p>\n<p>So, if our goal is to check that the data is intact, checksums are an excellent idea.<\/p>\n<p><\/p>\n<p>The choice of checksum algorithm was not questioned \u2014 CRC. On one hand, the mathematical properties allow us to catch certain types of errors 100%, on the other \u2014 with random data, this algorithm usually shows a collision probability not much greater than the theoretical limit. <img decoding=\"async\" alt=\"Az \u00e9n NOR flash gy\u0171r\u0171s puffert megval\u00f3s\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2019\/12\/bf9cca3564db7d9d03d3ce49642d3a71.jpg\" style=\"display:block;margin: 0 auto;\" \/>B\u00e1r ez nem a leggyorsabb algoritmus, \u00e9s nem mindig a legminim\u00e1lisabb a \u00fctk\u00f6z\u00e9sek sz\u00e1m\u00e1t tekintve, de van egy nagyon fontos tulajdons\u00e1ga: az \u00e1ltalam l\u00e1tott tesztek sor\u00e1n nem tal\u00e1lkoztam olyan mint\u00e1zatokkal, ahol nyilv\u00e1nval\u00f3an megbukott volna. A stabilit\u00e1s a legfontosabb jellemz\u0151 ebben az esetben.<\/p>\n<p><\/p>\n<p>Kiterjedt kutat\u00e1s p\u00e9ld\u00e1ja: <noindex><a rel=\"nofollow\" href=\"http:\/\/amsoftware.narod.ru\/algo.html\">1. r\u00e9sz<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/amsoftware.narod.ru\/algo2.html\">2. r\u00e9sz<\/a><\/noindex> <em>(linkek a narod.ru, eln\u00e9z\u00e9st)<\/em>.<\/p>\n<p><\/p>\n<p>A checksum kiv\u00e1laszt\u00e1s\u00e1nak feladata azonban m\u00e9g mindig nem z\u00e1rult le, a CRC egy eg\u00e9sz csal\u00e1d ellen\u0151rz\u0151 \u00f6sszeg. Meg kell hat\u00e1roznunk a hossz\u00fas\u00e1got, majd v\u00e1lasztanunk kell egy polinomot.<\/p>\n<p><\/p>\n<p>A checksum hossz\u00e1nak kiv\u00e1laszt\u00e1sa nem olyan egyszer\u0171 k\u00e9rd\u00e9s, mint amilyennek els\u0151 pillant\u00e1sra t\u0171nik.<\/p>\n<p><\/p>\n<p>P\u00e9ld\u00e1val illusztr\u00e1lom:<br \/>\nLegyen a hib\u00e1k val\u00f3sz\u00edn\u0171s\u00e9ge minden egyes b\u00e1jtban <img decoding=\"async\" alt=\"Az \u00e9n NOR flash gy\u0171r\u0171s puffert megval\u00f3s\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2019\/12\/89a9be2edf2a43cc9115eba37fa02fc8.jpg\" style=\"display:block;margin: 0 auto;\" \/> \u00e9s ide\u00e1lis checksum, sz\u00e1moljuk ki az \u00e1tlagos hib\u00e1k sz\u00e1m\u00e1t egymilli\u00f3 rekordra:<\/p>\n<p><\/p>\n<p>Adatok, b\u00e1jt<br \/>\nEllen\u0151rz\u0151 \u00f6sszeg, b\u00e1jt<br \/>\nFelfedezetlen hib\u00e1k<br \/>\nHamis hibafelismer\u00e9sek<br \/>\n\u00d6sszesen t\u00e9ves riaszt\u00e1sok<\/p>\n<p>1<br \/>\n0<br \/>\n1000<br \/>\n0<br \/>\n1000<\/p>\n<p>1<br \/>\n1<br \/>\n4<br \/>\n999<br \/>\n1003<\/p>\n<p>1<br \/>\n2<br \/>\n\u22480<br \/>\n1997<br \/>\n1997<\/p>\n<p>1<br \/>\n4<br \/>\n\u22480<br \/>\n3990<br \/>\n3990<\/p>\n<p>10<br \/>\n0<br \/>\n9955<br \/>\n0<br \/>\n9955<\/p>\n<p>10<br \/>\n1<br \/>\n39<br \/>\n990<br \/>\n1029<\/p>\n<p>10<br \/>\n2<br \/>\n\u22480<br \/>\n1979<br \/>\n1979<\/p>\n<p>10<br \/>\n4<br \/>\n\u22480<br \/>\n3954<br \/>\n3954<\/p>\n<p>1000<br \/>\n0<br \/>\n632305<br \/>\n0<br \/>\n632305<\/p>\n<p>1000<br \/>\n1<br \/>\n2470<br \/>\n368<br \/>\n2838<\/p>\n<p>1000<br \/>\n2<br \/>\n10<br \/>\n735<br \/>\n745<\/p>\n<p>1000<br \/>\n4<br \/>\n\u22480<br \/>\n1469<br \/>\n1469<\/p>\n<p><\/p>\n<p>Azt gondoln\u00e1nk, hogy minden egyszer\u0171 \u2014 v\u00e1lasszuk a v\u00e9dett adatok hossz\u00fas\u00e1g\u00e1nak megfelel\u0151 checksumot a lehet\u0151 legkevesebb t\u00e9ves riaszt\u00e1s \u00e9rdek\u00e9ben \u2014 \u00e9s k\u00e9sz.<\/p>\n<p><\/p>\n<p>Azonban a r\u00f6vid checksumokkal probl\u00e9m\u00e1k mer\u00fclnek fel: b\u00e1r j\u00f3l \u00e9szlelik az egybites hib\u00e1kat, viszonylag nagy val\u00f3sz\u00edn\u0171s\u00e9ggel t\u00e9vesen hiteles\u00edthetnek teljesen v\u00e9letlenszer\u0171 adatokat. A Habr\u00e1n m\u00e1r volt egy cikk, amely le\u00edrta <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/428746\/\">a val\u00f3s \u00e9let probl\u00e9m\u00e1j\u00e1t<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Ez\u00e9rt annak \u00e9rdek\u00e9ben, hogy a checksum v\u00e9letlenszer\u0171 \u00fctk\u00f6z\u00e9se gyakorlatilag lehetetlenn\u00e9 v\u00e1ljon, 32 bit hossz\u00fas\u00e1g\u00fa \u00e9s azt meghalad\u00f3 checksumokat kell haszn\u00e1lni <em>(a 64 bitn\u00e9l hosszabbakhoz \u00e1ltal\u00e1ban kriptogr\u00e1fiai hash-funkci\u00f3kat alkalmaznak)<\/em>.<\/p>\n<p><\/p>\n<p>Annak ellen\u00e9re, hogy kor\u00e1bban \u00edrtam, hogy mindent meg kell tenn\u00fcnk a helyet megtakar\u00edtva, m\u00e9gis, haszn\u00e1lni fogunk egy 32 bites checksumot (a 16 bit kev\u00e9s, a \u00fctk\u00f6z\u00e9s val\u00f3sz\u00edn\u0171s\u00e9ge t\u00f6bb mint 0,01%; \u00e9s a 24 bit, ahogy mondj\u00e1k, se ide, se oda).<\/p>\n<p><\/p>\n<p>Itt felmer\u00fclhet egy ellen\u00e9rv: val\u00f3ban az\u00e9rt sp\u00f3roltunk meg minden b\u00e1jt alatt, hogy most 4 b\u00e1jt hirtelen \u00e1tadjunk? Nem lenne jobb nem t\u00f6m\u00f6r\u00edteni \u00e9s nem hozz\u00e1adni a checksumot? Term\u00e9szetesen nem, a t\u00f6m\u00f6r\u00edt\u00e9s hi\u00e1nya <em>nem jelenti<\/em>, hogy az integrit\u00e1s ellen\u0151rz\u00e9s\u00e9re nincs sz\u00fcks\u00e9g.<\/p>\n<p><\/p>\n<p>A polinom kiv\u00e1laszt\u00e1s\u00e1n\u00e1l nem kell feltal\u00e1lni a kereket, hanem vessz\u00fck a jelenleg n\u00e9pszer\u0171 CRC-32C-t.<br \/>\nEz a k\u00f3d 6 bites hib\u00e1t \u00e9szlel a 22 b\u00e1jtos csomagokban (tal\u00e1n a leggyakoribb eset sz\u00e1munkra), 4 bites hib\u00e1t a 655 b\u00e1jtos csomagokban (szint\u00e9n gyakori eset sz\u00e1munkra), 2 vagy b\u00e1rmilyen p\u00e1ratlan sz\u00e1m\u00fa bites hib\u00e1t pedig b\u00e1rmilyen \u00e9sszer\u0171 hossz\u00fas\u00e1g\u00fa csomagokban.<\/p>\n<p>\n<b class=\"spoiler_title\">Ha valakit \u00e9rdekelnek a r\u00e9szletek<\/b><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Cyclic_redundancy_check\">Wikip\u00e9dia cikk<\/a><\/noindex> a CRC-r\u0151l.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/users.ece.cmu.edu\/~koopman\/crc\/c32\/0x8f6e37a0_len.txt\">A crc-32c k\u00f3d param\u00e9terei<\/a><\/noindex> Gyorsan eml\u00e9kezz\u00fcnk vissza, hogyan m\u0171k\u00f6dik a modul\u00e1ris aritmetika. Az \u00f3ra m\u00e1r egy ismert koncepci\u00f3. Az \u00f3r\u00e1k haszn\u00e1lata <noindex><a rel=\"nofollow\" href=\"http:\/\/users.ece.cmu.edu\/~koopman\/crc\/notes.html\">a Kupman weboldal\u00e1n<\/a><\/noindex> \u2014 tal\u00e1n a vil\u00e1g legf\u0151bb CRC szak\u00e9rt\u0151je.<\/p>\n<p><\/p>\n<p>A <noindex><a rel=\"nofollow\" href=\"http:\/\/users.ece.cmu.edu\/~koopman\/networks\/dsn02\/dsn02_koopman.pdf\">az \u0151 cikk\u00e9ben<\/a><\/noindex> tartalmaz <noindex><a rel=\"nofollow\" href=\"https:\/\/users.ece.cmu.edu\/~koopman\/crc\/c32\/0xfa567d89_len.txt\">m\u00e9g egy \u00e9rdekes k\u00f3d<\/a><\/noindex>, amely valamivel jobb param\u00e9tereket biztos\u00edt az \u00e1ltalunk aktu\u00e1lis csomaghosszokhoz, de nem tartottam a k\u00fcl\u00f6nbs\u00e9get l\u00e9nyegesnek, \u00e9s magamat el\u00e9g kompetensnek ahhoz, hogy egy egyedi k\u00f3dot v\u00e1lasszak a standard \u00e9s j\u00f3l kutatott helyett.<\/p>\n<p><\/p>\n<p>Tov\u00e1bb\u00e1, mivel az adataink t\u00f6m\u00f6r\u00edtettek, felmer\u00fcl a k\u00e9rd\u00e9s: a t\u00f6m\u00f6r\u00edtett vagy a t\u00f6m\u00f6r\u00edtetlen adatokra sz\u00e1m\u00edtsuk a checksumot?<\/p>\n<p><\/p>\n<p>Az \u00e9rvek a t\u00f6m\u00f6r\u00edtetlen adatok ellen\u0151rz\u0151\u00f6sszeg\u00e9nek sz\u00e1m\u00edt\u00e1sa mellett:<\/p>\n<p><\/p>\n<ul>\n<li>v\u00e9gs\u0151 soron az adatmeg\u0151rz\u00e9s \u00e9ps\u00e9g\u00e9t kell ellen\u0151rizn\u00fcnk \u2014 ezt k\u00f6zvetlen\u00fcl is ellen\u0151rizz\u00fck (ezzel egy\u00fctt ellen\u0151rizve lesznek a t\u00f6m\u00f6r\u00edt\u00e9s\/dek\u00f3dol\u00e1s megval\u00f3s\u00edt\u00e1sainak esetleges hib\u00e1i, a hib\u00e1s mem\u00f3ria okozta k\u00e1rok stb.);<\/li>\n<li>az algoritmus a zlib-ben el\u00e9g \u00e9rett megval\u00f3s\u00edt\u00e1ssal b\u00edr, \u00e9s <em>nem kell<\/em> hib\u00e1s bemeneti adatok eset\u00e9n le\u00e1llhat, s\u0151t, gyakran k\u00e9pes \u00f6n\u00e1ll\u00f3an \u00e9szlelni a hib\u00e1kat a bemeneti \u00e1raml\u00e1sban, cs\u00f6kkentve ezzel a hib\u00e1k \u00e9szlel\u00e9s\u00e9nek \u00e1ltal\u00e1nos val\u00f3sz\u00edn\u0171s\u00e9g\u00e9t (tesztet v\u00e9geztem egyetlen bit invert\u00e1l\u00e1s\u00e1val egy r\u00f6vid rekordban, a zlib k\u00f6r\u00fclbel\u00fcl harmadik esetben \u00e9szlelte a hib\u00e1t).<\/li>\n<\/ul>\n<p><\/p>\n<p>Az \u00e9rvek a t\u00f6m\u00f6r\u00edtetlen adatok ellen\u0151rz\u0151\u00f6sszeg\u00e9nek sz\u00e1m\u00edt\u00e1sa ellen:<\/p>\n<p><\/p>\n<ul>\n<li>A CRC kifejezetten a kev\u00e9s bityhib\u00e1kra van 'kalibr\u00e1lva', amelyek a flash mem\u00f3ri\u00e1ra jellemz\u0151ek (a t\u00f6m\u00f6r\u00edtett \u00e1raml\u00e1sban el\u0151fordul\u00f3 bityhiba t\u00f6meges v\u00e1ltoz\u00e1st okozhat a kimeneti \u00e1raml\u00e1sban, amelyen, elm\u00e9letileg, 'elcs\u00edphetj\u00fck' a \u00fctk\u00f6z\u00e9st);<\/li>\n<li>nem igaz\u00e1n tetszik az \u00f6tlet, hogy a dek\u00f3dol\u00f3nak potenci\u00e1lisan hib\u00e1s adatokat adjak \u00e1t, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.cvedetails.com\/vulnerability-list\/vendor_id-72\/product_id-1820\/GNU-Zlib.html\">ki tudja<\/a><\/noindex>, hogyan fog reag\u00e1lni.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ebben a projektben \u00fagy d\u00f6nt\u00f6ttem, hogy elt\u00e1volodom a hagyom\u00e1nyos gyakorlatokt\u00f3l, miszerint a t\u00f6m\u00f6r\u00edtetlen adatok checksum\u00e1t t\u00e1roln\u00e1nk.<\/p>\n<p><\/p>\n<p><strong>\u00d6sszefoglalva:<\/strong> a CRC-32C-t haszn\u00e1ljuk, a checksumot az adatok azon form\u00e1j\u00e1ra sz\u00e1m\u00edtjuk, ahogyan azokat a flash mem\u00f3ri\u00e1ba r\u00f6gz\u00edtj\u00fck (t\u00f6m\u00f6r\u00edt\u00e9s ut\u00e1n).<\/p>\n<p><\/p>\n<h3 id=\"izbytochnost\">T\u00falzott redundancia<\/h3>\n<p><\/p>\n<p>A redund\u00e1ns k\u00f3dol\u00e1s haszn\u00e1lata term\u00e9szetesen nem z\u00e1rja ki az adatok elveszt\u00e9s\u00e9t, azonban jelent\u0151sen (gyakran t\u00f6bb nagys\u00e1grenddel) cs\u00f6kkentheti az irrepar\u00e1bilis adatveszt\u00e9s val\u00f3sz\u00edn\u0171s\u00e9g\u00e9t.<\/p>\n<p><\/p>\n<p>K\u00fcl\u00f6nb\u00f6z\u0151 t\u00edpus\u00fa redundanci\u00e1kat haszn\u00e1lhatunk a hib\u00e1k jav\u00edt\u00e1s\u00e1ra.<br \/>\nA Hamming-k\u00f3dok egyes bit hib\u00e1it jav\u00edthatj\u00e1k, a Reed-Solomon k\u00f3dok karakterhib\u00e1kat, t\u00f6bb m\u00e1solat adatai egy\u00fctt checksumokkal vagy a RAID-6-hoz hasonl\u00f3 k\u00f3dol\u00e1s seg\u00edthet az adatok helyre\u00e1ll\u00edt\u00e1s\u00e1ban m\u00e9g t\u00f6meges s\u00e9r\u00fcl\u00e9sek eset\u00e9n is.<br \/>\nEredetileg a kiterjedt hibajav\u00edt\u00f3 k\u00f3dol\u00e1s haszn\u00e1lat\u00e1ra k\u00e9sz\u00fcltem, de azt\u00e1n r\u00e1j\u00f6ttem, hogy el\u0151sz\u00f6r tiszt\u00e1ban kell lenn\u00fcnk azzal, hogy milyen hib\u00e1k ellen szeretn\u00e9nk v\u00e9delmet kapni, miel\u0151tt kiv\u00e1lasztan\u00e1nk a k\u00f3dol\u00e1st.<\/p>\n<p><\/p>\n<p>Kor\u00e1bban besz\u00e9lt\u00fcnk arr\u00f3l, hogy a hib\u00e1kat min\u00e9l gyorsabban fel kell ismerni. Mikor tal\u00e1lkozhatunk hib\u00e1kkal?<\/p>\n<p><\/p>\n<ol>\n<li>Befejezetlen rekord (valamilyen okb\u00f3l a fel\u00edr\u00e1s sor\u00e1n \u00e1ramkimarad\u00e1s t\u00f6rt\u00e9nt, a Raspberry lefagyott, \u2026)<br \/>\nSajn\u00e1latos m\u00f3don, ilyen hiba eset\u00e9n csak az \u00e9rv\u00e9nytelen feljegyz\u00e9seket lehet figyelmen k\u00edv\u00fcl hagyni, \u00e9s az adatokat elveszettnek tekinteni;<\/li>\n<li>\u00cdr\u00e1si hib\u00e1k (b\u00e1rmilyen okb\u00f3l a flash mem\u00f3ri\u00e1ba nem az ker\u00fclt be\u00edr\u00e1sra, amit \u00edrtunk)<br \/>\nIlyen hib\u00e1kat azonnal \u00e9szlelhet\u00fcnk, ha az \u00edr\u00e1s ut\u00e1n k\u00f6zvetlen\u00fcl ellen\u0151rz\u0151 olvas\u00e1st v\u00e9gz\u00fcnk;<\/li>\n<li>Adatok torzul\u00e1sa a mem\u00f3ria t\u00e1rol\u00e1sa sor\u00e1n;<\/li>\n<li>Olvas\u00e1si hib\u00e1k<br \/>\nA helyesb\u00edt\u00e9shez elegend\u0151, ha a checksum elt\u00e9r\u00e9se eset\u00e9n t\u00f6bbsz\u00f6r is elv\u00e9gezz\u00fck az olvas\u00e1st.<\/li>\n<\/ol>\n<p><\/p>\n<p>Teh\u00e1t csak a harmadik t\u00edpus\u00fa hib\u00e1k (a t\u00e1rol\u00e1s sor\u00e1n bek\u00f6vetkez\u0151 \u00f6n\u00e1ll\u00f3 adatk\u00e1rosod\u00e1s) nem jav\u00edthat\u00f3k hibajav\u00edt\u00f3 k\u00f3dol\u00e1s n\u00e9lk\u00fcl. \u00dagy t\u0171nik, hogy az ilyen hib\u00e1k rendk\u00edv\u00fcl val\u00f3sz\u00edn\u0171tlenek.<\/p>\n<p><\/p>\n<p><strong>\u00d6sszefoglalva:<\/strong> \u00dagy d\u00f6nt\u00f6ttek, hogy lemondanak a redund\u00e1ns k\u00f3dol\u00e1sr\u00f3l, de ha a haszn\u00e1lat sor\u00e1n kider\u00fcl, hogy ez a d\u00f6nt\u00e9s hib\u00e1s, akkor \u00fajra megfontolj\u00e1k a k\u00e9rd\u00e9st (m\u00e1r \u00f6sszegy\u0171jt\u00f6tt statisztik\u00e1k alapj\u00e1n a hib\u00e1kr\u00f3l, amelyek lehet\u0151v\u00e9 teszik a legoptim\u00e1lisabb k\u00f3dol\u00e1s kiv\u00e1laszt\u00e1s\u00e1t).<\/p>\n<p><\/p>\n<h3 id=\"prochee\">Egy\u00e9b<\/h3>\n<p><\/p>\n<p>Term\u00e9szetesen a cikk form\u00e1tuma nem teszi lehet\u0151v\u00e9, hogy minden bitet megindokoljak a form\u00e1tumban <em>(\u00e9s m\u00e1r nekem is elfogytak az er\u0151im)<\/em>, ez\u00e9rt r\u00f6viden \u00e1t fogok futni n\u00e9h\u00e1ny olyan ponthoz, amelyet eddig nem \u00e9rintettem.<\/p>\n<p><\/p>\n<ul>\n<li>\u00dagy d\u00f6nt\u00f6tt\u00fcnk, hogy minden oldalt 'egyenrang\u00fanak' tekint\u00fcnk<br \/>\nTeh\u00e1t nem lesznek k\u00fcl\u00f6nleges oldalak \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0438 \u0442.\u043f., \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0434\u0438\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438.<br \/>\nEz biztos\u00edtja az oldalak egyenletes kop\u00e1s\u00e1t, az egyetlen le\u00e1ll\u00e1si pont hi\u00e1ny\u00e1t, \u00e9s egyszer\u0171en csak tetszik.<\/li>\n<li>Mindig figyelembe kell venni a form\u00e1tum verzion\u00e1l\u00e1s\u00e1t.<br \/>\nA verzi\u00f3sz\u00e1m n\u00e9lk\u00fcli fejl\u00e9ces form\u00e1tum \u2013 rossz!<br \/>\nEl\u00e9g, ha a c\u00edmhez hozz\u00e1adunk egy mez\u0151t egy \u00fagynevezett Magic Number (al\u00e1\u00edr\u00e1s) form\u00e1j\u00e1ban, amely jelzi a haszn\u00e1lt form\u00e1tum verzi\u00f3j\u00e1t. <em>(nem hiszem, hogy ezekb\u0151l a gyakorlatban ak\u00e1r tucat is lenne)<\/em>;<\/li>\n<li>Haszn\u00e1ljunk v\u00e1ltoz\u00f3 hossz\u00fas\u00e1g\u00fa fejl\u00e9ceket a bejegyz\u00e9sekhez (amelyek nagyon sokan vannak), \u00e9s pr\u00f3b\u00e1ljunk meg a legt\u00f6bb esetben 1 byte hossz\u00fas\u00e1g\u00fav\u00e1 tenni \u0151ket.<\/li>\n<li>A fejl\u00e9cek hossza \u00e9s a lev\u00e1gott r\u00e9sz hossz\u00e1nak k\u00f3dol\u00e1s\u00e1hoz haszn\u00e1ljunk v\u00e1ltoz\u00f3 hossz\u00fas\u00e1g\u00fa bin\u00e1ris k\u00f3dokat.<\/li>\n<\/ul>\n<p><\/p>\n<p>Nagyon seg\u00edtett <noindex><a rel=\"nofollow\" href=\"https:\/\/planetcalc.com\/2481\/\">az online gener\u00e1tor<\/a><\/noindex> Haffman-k\u00f3dokhoz. Sz\u00f3 szerint n\u00e9h\u00e1ny perc alatt siker\u00fclt megtal\u00e1lni a sz\u00fcks\u00e9ges v\u00e1ltoz\u00f3 hossz\u00fas\u00e1g\u00fa k\u00f3dokat.<\/p>\n<p><\/p>\n<h1 id=\"anchorformatanchoropisanie-formata-hraneniya-dannyh\"><noindex><a rel=\"nofollow\" name=\"format\"><\/a><\/noindex>Az adatok t\u00e1rol\u00e1si form\u00e1tum\u00e1nak le\u00edr\u00e1sa<\/h1>\n<p><\/p>\n<h2 id=\"byte-order\">Byte sorrend<\/h2>\n<p><\/p>\n<p>Az egy byte-n\u00e1l nagyobb m\u00e9ret\u0171 mez\u0151k big-endian form\u00e1tumban (h\u00e1l\u00f3zati byte sorrend) t\u00e1rol\u00f3dnak, azaz a 0x1234 \u00fagy van \u00edrva, hogy 0x12, 0x34.<\/p>\n<p><\/p>\n<h2 id=\"delenie-na-stranicy\">Oldalra bont\u00e1s<\/h2>\n<p><\/p>\n<p>Az \u00f6sszes flash mem\u00f3ria egyenl\u0151 m\u00e9ret\u0171 oldalakra van felosztva.<\/p>\n<p><\/p>\n<p>Az alap\u00e9rtelmezett oldalm\u00e9ret 32KByte, de nem haladhatja meg a mem\u00f3ria chip \u00f6sszes m\u00e9ret\u00e9nek 1\/4-\u00e9t (4MB-os chip eset\u00e9n 128 oldal j\u00f6n ki).<\/p>\n<p><\/p>\n<p>Minden oldal f\u00fcggetlen\u00fcl t\u00e1rolja az adatokat a t\u00f6bbit\u0151l (vagyis egy oldal adatai nem hivatkoznak egy m\u00e1sik oldal adataira).<\/p>\n<p><\/p>\n<p>Minden oldalt term\u00e9szetes sorrendben sz\u00e1moznak (c\u00edmsorrendben n\u00f6vekv\u0151 c\u00edmek), kezdve a 0-\u00e1s sz\u00e1mt\u00f3l (a nulla oldal az 0 c\u00edmmel kezd\u0151dik, az els\u0151 32KByte-tal, a m\u00e1sodik pedig 64KByte-tal \u00e9s \u00edgy tov\u00e1bb).<\/p>\n<p><\/p>\n<p>A mem\u00f3riachip haszn\u00e1lata ciklikus pufferk\u00e9nt (ring buffer) t\u00f6rt\u00e9nik, azaz el\u0151sz\u00f6r a 0-\u00e1s sz\u00e1m\u00fa oldalra \u00edrunk, majd az 1-es sz\u00e1m\u00fa oldalra, amikor a legutols\u00f3 oldalt megt\u00f6ltj\u00fck, \u00faj ciklus kezd\u0151dik, \u00e9s az \u00edr\u00e1s a nulladik oldalon folytat\u00f3dik.<\/p>\n<p><\/p>\n<h2 id=\"vnutri-stranicy\">Az oldalon bel\u00fcl<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Az \u00e9n NOR flash gy\u0171r\u0171s puffert megval\u00f3s\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2019\/12\/39b45f83dc46bb2fd7081ed2a0b638c9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAz oldal elej\u00e9n egy 4-b\u00e1jtos fejl\u00e9c tal\u00e1lhat\u00f3, majd a fejl\u00e9c ellen\u0151rz\u0151 \u00f6sszege (CRC-32C), ezt k\u00f6vet\u0151en t\u00e1roljuk a bejegyz\u00e9seket a \"fejl\u00e9c, adatok, ellen\u0151rz\u0151 \u00f6sszeg\" form\u00e1tumban.<\/p>\n<p><\/p>\n<p>Az oldal fejl\u00e9c (a v\u00e1zlaton piszkos z\u00f6ld) a k\u00f6vetkez\u0151kb\u0151l \u00e1ll:<\/p>\n<p><\/p>\n<ul>\n<li>egy 2 byte-os Magic Number mez\u0151b\u0151l (ez a form\u00e1tum verzi\u00f3j\u00e1t jelzi)<br \/>\na form\u00e1tum aktu\u00e1lis verzi\u00f3ja sz\u00e1m\u00e1ra \u00fagy van tekintve, mint <code>0xed00 \u2295 oldalsz\u00e1m<\/code>;<\/li>\n<li>k\u00e9tb\u00e1jtos \"Oldal verzi\u00f3\" sz\u00e1ml\u00e1l\u00f3 (a mem\u00f3ria fel\u00fclv\u00e1lt\u00e1s\u00e1nak ciklussz\u00e1ma).<\/li>\n<\/ul>\n<p><\/p>\n<p>Az oldalon tal\u00e1lhat\u00f3 bejegyz\u00e9sek t\u00f6m\u00f6r\u00edtve vannak t\u00e1rolva (deflate algoritmust haszn\u00e1lva). Minden bejegyz\u00e9s ugyanazon az oldalon egy sz\u00e1lon t\u00f6m\u00f6r\u00fcl (k\u00f6z\u00f6s sz\u00f3t\u00e1rat haszn\u00e1lva), \u00e9s minden \u00faj oldalon a t\u00f6m\u00f6r\u00edt\u00e9s \u00fajrakezd\u0151dik. Ez azt jelenti, hogy b\u00e1rmely bejegyz\u00e9s dekompresszi\u00f3j\u00e1hoz az \u00f6sszes kor\u00e1bbi bejegyz\u00e9s sz\u00fcks\u00e9ges az adott oldalr\u00f3l (csak arr\u00f3l).<\/p>\n<p><\/p>\n<p>Minden bejegyz\u00e9st Z_SYNC_FLUSH flaggel t\u00f6m\u00f6r\u00edt\u00fcnk, \u00edgy a t\u00f6m\u00f6r\u00edtett sz\u00e1l v\u00e9g\u00e9n 4 b\u00e1jt 0x00, 0x00, 0xff, 0xff tal\u00e1lhat\u00f3, amely lehet, hogy egy vagy k\u00e9t 0 b\u00e1jt el\u0151zi meg.<br \/>\nEzt a (4, 5 vagy 6 b\u00e1jt hossz\u00fa) sorozatot elvetj\u00fck a flash mem\u00f3ri\u00e1ba \u00edr\u00e1skor.<\/p>\n<p><\/p>\n<p>A bejegyz\u00e9s fejl\u00e9c 1, 2 vagy 3 b\u00e1jt, amelyek a k\u00f6vetkez\u0151ket t\u00e1rolj\u00e1k:<\/p>\n<p><\/p>\n<ul>\n<li>egy bit (T), amely a bejegyz\u00e9s t\u00edpus\u00e1t jelzi: 0 \u2014 kontextus, 1 \u2014 napl\u00f3;<\/li>\n<li>v\u00e1ltoz\u00f3 hossz\u00fas\u00e1g\u00fa mez\u0151 (S), 1-t\u0151l 7 bitig, amely meghat\u00e1rozza a fejl\u00e9c \u00e9s a \"farok\" hossz\u00e1t, amelyet hozz\u00e1 kell adni a bejegyz\u00e9shez a kib\u0151v\u00edt\u00e9shez;<\/li>\n<li>a bejegyz\u00e9s hossza (L).<\/li>\n<\/ul>\n<p><\/p>\n<p>Az S \u00e9rt\u00e9keinek t\u00e1bl\u00e1zata:<\/p>\n<p><\/p>\n<p>S<br \/>\nA fejl\u00e9c hossza, b\u00e1jt<br \/>\nElvetve \u00edr\u00e1skor, b\u00e1jt<\/p>\n<p><code>0<\/code><br \/>\n1<br \/>\n5 (<code>00 00 00 ff ff<\/code>)<\/p>\n<p><code>10<\/code><br \/>\n1<br \/>\n6 (<code>00 00 00 00 ff ff<\/code>)<\/p>\n<p><code>110<\/code><br \/>\n2<br \/>\n4 (<code>00 00 ff ff<\/code>)<\/p>\n<p><code>1110<\/code><br \/>\n2<br \/>\n5 (<code>00 00 00 ff ff<\/code>)<\/p>\n<p><code>11110<\/code><br \/>\n2<br \/>\n6 (<code>00 00 00 00 ff ff<\/code>)<\/p>\n<p><code>1111100<\/code><br \/>\n3<br \/>\n4 (<code>00 00 ff ff<\/code>)<\/p>\n<p><code>1111101<\/code><br \/>\n3<br \/>\n5 (<code>00 00 00 ff ff<\/code>)<\/p>\n<p><code>1111110<\/code><br \/>\n3<br \/>\n6 (<code>00 00 00 00 ff ff<\/code>)<\/p>\n<p><\/p>\n<p>Megpr\u00f3b\u00e1ltam illusztr\u00e1lni, nem tudom, mennyire lett \u00e9rthet\u0151:<br \/>\n<img decoding=\"async\" alt=\"Az \u00e9n NOR flash gy\u0171r\u0171s puffert megval\u00f3s\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2019\/12\/8c9b739eec5af4429395c32b4ba4044a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nS\u00e1rg\u00e1val itt a T mez\u0151, feh\u00e9rrel az S mez\u0151, z\u00f6lddel az L (a t\u00f6m\u00f6r\u00edtett adatok hossza b\u00e1jtokban), k\u00e9kkel a t\u00f6m\u00f6r\u00edtett adatok, pirossal a t\u00f6m\u00f6r\u00edtett adatok v\u00e9gs\u0151 b\u00e1jtjai tal\u00e1lhat\u00f3k, amelyeket nem \u00edrunk a flash mem\u00f3ri\u00e1ba.<\/p>\n<p><\/p>\n<p>\u00cdgy a legelterjedtebb hossz\u00fas\u00e1g\u00fa bejegyz\u00e9sek (63+5 b\u00e1jt t\u00f6m\u00f6r\u00edtve) egy b\u00e1jton r\u00f6gz\u00edthet\u0151k.<\/p>\n<p><\/p>\n<p>Minden bejegyz\u00e9s ut\u00e1n CRC-32C ellen\u0151rz\u0151 \u00f6sszeg tal\u00e1lhat\u00f3, amelynek kiindul\u00f3 \u00e9rt\u00e9ke (init) a kor\u00e1bbi ellen\u0151rz\u0151 \u00f6sszeg inverz \u00e9rt\u00e9ke.<\/p>\n<p><\/p>\n<p><em>A CRC rendelkezik a \"folytathat\u00f3s\u00e1g\" tulajdons\u00e1g\u00e1val, m\u0171k\u00f6dik (plusz-m\u00ednusz bitford\u00edt\u00e1s a folyamat sor\u00e1n) a k\u00f6vetkez\u0151 k\u00e9plettel: <img decoding=\"async\" alt=\"Az \u00e9n NOR flash gy\u0171r\u0171s puffert megval\u00f3s\u00edt\u00e1sa\" src=\"\/wp-content\/uploads\/2019\/12\/b194d6a3d18ae2f4ae5d4054a93c0ea3.jpg\" style=\"display:block;margin: 0 auto;\" \/>.<br \/>\nTeh\u00e1t val\u00f3j\u00e1ban a fejl\u00e9c \u00e9s az adatok \u00f6sszes kor\u00e1bbi b\u00e1jtj\u00e1nak CRC-j\u00e9t sz\u00e1m\u00edtjuk ki ezen az oldalon.<\/em><\/p>\n<p><\/p>\n<p>K\u00f6zvetlen\u00fcl az ellen\u0151rz\u0151 \u00f6sszeg ut\u00e1n tal\u00e1lhat\u00f3 a k\u00f6vetkez\u0151 bejegyz\u00e9s fejl\u00e9c.<\/p>\n<p><\/p>\n<p>A fejl\u00e9c \u00fagy van megkonstru\u00e1lva, hogy az els\u0151 b\u00e1jtja mindig elt\u00e9rjen a 0x00-t\u00f3l \u00e9s 0xff-t\u0151l (ha az els\u0151 fejl\u00e9c b\u00e1jt helyett 0xff-t tal\u00e1lunk, az azt jelenti, hogy ez egy m\u00e9g nem haszn\u00e1lt ter\u00fclet; a 0x00 pedig hib\u00e1t jelez).<\/p>\n<p><\/p>\n<h2 id=\"primernye-algoritmy\">P\u00e9lda algoritmusok<\/h2>\n<p><\/p>\n<h3 id=\"chtenie-iz-flesh-pamyati\">Olvas\u00e1s a flash mem\u00f3ri\u00e1b\u00f3l<\/h3>\n<p><\/p>\n<p>B\u00e1rmely olvas\u00e1s ellen\u0151rz\u0151 \u00f6sszeg ellen\u0151rz\u00e9s\u00e9vel t\u00f6rt\u00e9nik.<br \/>\nHa a hashelt \u00f6sszeg nem egyezik, az olvas\u00e1st t\u00f6bbsz\u00f6r megism\u00e9telj\u00fck abb\u00f3l a rem\u00e9nyb\u0151l, hogy v\u00e9g\u00fcl a helyes adatokat olvassuk ki.<\/p>\n<p><\/p>\n<p><em>(ez \u00e9rthet\u0151, a Linux nem cache-eli a NOR Flash-b\u00f3l val\u00f3 olvas\u00e1st, tesztelve)<\/em><\/p>\n<p><\/p>\n<h3 id=\"zapis-v-flesh-pamyat\">\u00cdr\u00e1s flash mem\u00f3ri\u00e1ba<\/h3>\n<p><\/p>\n<p>Adatokat \u00edrunk.<br \/>\nOlvassuk azokat.<\/p>\n<p><\/p>\n<p>Ha az olvasott adatok nem egyeznek a r\u00f6gz\u00edtettekkel, kit\u00f6ltj\u00fck a ter\u00fcletet null\u00e1kkal, \u00e9s hib\u00e1t jelez\u00fcnk.<\/p>\n<p><\/p>\n<h3 id=\"podgotovka-novoy-mikroshemy-k-rabote\">\u00daj chip el\u0151k\u00e9sz\u00edt\u00e9se a m\u0171k\u00f6d\u00e9shez<\/h3>\n<p><\/p>\n<p>Az inicializ\u00e1l\u00e1shoz az els\u0151 (pontosabban nulladik) oldalra egy 1-es verzi\u00f3val rendelkez\u0151 fejl\u00e9cet \u00edrunk.<br \/>\nEzt k\u00f6vet\u0151en erre az oldalra r\u00f6gz\u00edtj\u00fck az alap\u00e9rtelmezett be\u00e1ll\u00edt\u00e1sokat tartalmaz\u00f3 kezdeti kontextust (tartalmazza az automata UUID-j\u00e9t). <\/p>\n<p><\/p>\n<p>K\u00e9sz, a flash mem\u00f3ria k\u00e9szen \u00e1ll a m\u0171k\u00f6d\u00e9sre.<\/p>\n<p><\/p>\n<h3 id=\"zagruzka-avtomata\">Automata bet\u00f6lt\u00e9se<\/h3>\n<p><\/p>\n<p>Bet\u00f6lt\u00e9skor minden oldal els\u0151 8 bytej\u00e1t (fejl\u00e9c + CRC) olvassuk ki, az ismeretlen Magic Number-t vagy hib\u00e1s CRC-t tartalmaz\u00f3 oldalakat figyelmen k\u00edv\u00fcl hagyjuk.<br \/>\nA \"helyes\" oldalak k\u00f6z\u00fcl a legmagasabb verzi\u00f3val rendelkez\u0151 oldalakat v\u00e1lasztjuk, \u00e9s ezek k\u00f6z\u00fcl a legnagyobb sorsz\u00e1m\u00fa oldalt vessz\u00fck.<br \/>\nAz els\u0151 bejegyz\u00e9st olvassuk, ellen\u0151rizz\u00fck a CRC helyess\u00e9g\u00e9t, \u00e9s a \"kontekxtus\" z\u00e1szl\u00f3 jelenl\u00e9t\u00e9t. Ha minden rendben van \u2014 ez az oldal aktu\u00e1lisnak sz\u00e1m\u00edt. Ha nem \u2014 visszat\u00e9r\u00fcnk az el\u0151z\u0151h\u00f6z, am\u00edg meg nem tal\u00e1ljuk az \"\u00e9l\u0151\" oldalt.<br \/>\nAz megtal\u00e1lt oldalon olvassuk el az \u00f6sszes bejegyz\u00e9st, azokat, amelyekn\u00e9l a \"kontekxtus\" z\u00e1szl\u00f3 van, alkalmazzuk.<br \/>\nMeg\u0151rizz\u00fck a zlib sz\u00f3t\u00e1rat (sz\u00fcks\u00e9g lesz r\u00e1 az oldalhoz val\u00f3 k\u00e9s\u0151bbi \u00edr\u00e1shoz).<\/p>\n<p><\/p>\n<p>K\u00e9sz, a bet\u00f6lt\u00e9s befejez\u0151d\u00f6tt, a kontextus vissza\u00e1llt, lehet dolgozni.<\/p>\n<p><\/p>\n<h3 id=\"dobavlenie-zapisi-v-zhurnal\">Bejegyz\u00e9s hozz\u00e1ad\u00e1sa a napl\u00f3hoz<\/h3>\n<p><\/p>\n<p>A bejegyz\u00e9st a megfelel\u0151 sz\u00f3t\u00e1rral t\u00f6m\u00f6r\u00edtj\u00fck, megadva a Z_SYNC_FLUSH-t. Megn\u00e9zz\u00fck, hogy a t\u00f6m\u00f6r\u00edtett bejegyz\u00e9s elf\u00e9r-e az aktu\u00e1lis oldalon.<br \/>\nHa nem f\u00e9r el (vagy az oldalon CRC hib\u00e1k voltak) - \u00faj oldalt kezd\u00fcnk (l\u00e1sd lent).<br \/>\nR\u00f6gz\u00edtj\u00fck a bejegyz\u00e9st \u00e9s a CRC-t. Ha hiba t\u00f6rt\u00e9nt - \u00faj oldalt kezd\u00fcnk.<\/p>\n<p><\/p>\n<h3 id=\"novaya-stranica\">\u00daj oldal<\/h3>\n<p><\/p>\n<p>Kiv\u00e1lasztunk egy szabad oldalt a lehet\u0151 legkisebb sz\u00e1mmal (szabadnak tekintj\u00fck az oldalt, amelynek a fejl\u00e9c\u00e9ben helytelen a CRC, vagy a verzi\u00f3ja kevesebb a jelenlegin\u00e9l). Ha ilyen oldal nincs, akkor a jelenlegi verzi\u00f3val rendelkez\u0151 oldalak k\u00f6z\u00fcl v\u00e1lasztanunk kell a legalacsonyabb sz\u00e1m\u00fat.<br \/>\nA kiv\u00e1lasztott oldalt t\u00f6r\u00f6lj\u00fck. Ellen\u0151rizz\u00fck a tartalm\u00e1t 0xff-el. Ha valami nem stimmel, a k\u00f6vetkez\u0151 szabad oldalt vessz\u00fck, stb.<br \/>\nA t\u00f6r\u00f6lt oldalra r\u00f6gz\u00edtj\u00fck a fejl\u00e9cet, els\u0151 bejegyz\u00e9sk\u00e9nt a kontextus aktu\u00e1lis \u00e1llapot\u00e1t, a k\u00f6vetkez\u0151t - a napl\u00f3ban nem r\u00f6gz\u00edtett bejegyz\u00e9st (ha van).<\/p>\n<p><\/p>\n<h1 id=\"primenimost-formata\">A form\u00e1tum alkalmazhat\u00f3s\u00e1ga<\/h1>\n<p><\/p>\n<p>Szerintem ez egy j\u00f3 form\u00e1tum b\u00e1rmilyen, a s\u0171r\u00edt\u00e9sre alkalmas inform\u00e1ci\u00f3s \u00e1raml\u00e1s (egyszer\u0171 sz\u00f6veg, JSON, MessagePack, CBOR, esetleg protobuf) t\u00e1rol\u00e1s\u00e1ra NOR Flash-en.<\/p>\n<p><\/p>\n<p>Term\u00e9szetesen a form\u00e1tum \"kifejezetten\" SLC NOR Flash-ra lett optimaliz\u00e1lva.<\/p>\n<p><\/p>\n<p>Ezt nem \u00e9rdemes haszn\u00e1lni olyan t\u00e1rol\u00f3kkal, amiknek magas a BER-e, p\u00e9ld\u00e1ul NAND vagy MLC NOR. <em>(van egy\u00e1ltal\u00e1n ilyen mem\u00f3ria forgalomban? Csak a korrekci\u00f3s k\u00f3dokr\u00f3l sz\u00f3l\u00f3 munk\u00e1kban l\u00e1ttam r\u00e1 utal\u00e1sokat)<\/em>.<\/p>\n<p><\/p>\n<p>F\u0151leg, hogy ezt nem \u00e9rdemes olyan eszk\u00f6z\u00f6kkel haszn\u00e1lni, amelyek saj\u00e1t FTL-lel rendelkeznek: USB flash, SD, MicroSD, stb. <em>(ehhez a mem\u00f3ri\u00e1hoz 512 b\u00e1jtos oldalm\u00e9rettel, az egyes oldalak elej\u00e9n al\u00e1\u00edr\u00e1ssal \u00e9s egyedi sorsz\u00e1mokkal k\u00e9sz\u00fclt form\u00e1tumot k\u00e9sz\u00edtettem \u2014 n\u00e9ha a \"megakadt\" flash-r\u0151l egyszer\u0171 soros olvas\u00e1ssal tudtam az \u00f6sszes adatot helyre\u00e1ll\u00edtani)<\/em>.<\/p>\n<p><\/p>\n<p>A feladatokt\u00f3l f\u00fcgg\u0151en a form\u00e1tum m\u00f3dos\u00edt\u00e1s n\u00e9lk\u00fcl haszn\u00e1lhat\u00f3 128Kbit (16Kbyte) \u00e9s 1Gbit (128Mbyte) k\u00f6z\u00f6tti flash egys\u00e9geken. Ig\u00e9ny szerint nagyobb kapacit\u00e1s\u00fa chipeken is haszn\u00e1lhat\u00f3, de val\u00f3sz\u00edn\u0171leg a lapm\u00e9retet ki kell m\u00f3dos\u00edtani. <em>(De itt m\u00e1r felmer\u00fcl a gazdas\u00e1gi szempontok k\u00e9rd\u00e9se, a nagy kapacit\u00e1s\u00fa NOR Flash \u00e1ra nem \u00f6rvendeztet meg.)<\/em>.<\/p>\n<p><\/p>\n<p>Ha valakinek \u00e9rdekesnek t\u0171nik a form\u00e1tum, \u00e9s szeretn\u00e9 haszn\u00e1lni egy ny\u00edlt projektben \u2014 \u00edrjon, megpr\u00f3b\u00e1lom tal\u00e1lni az id\u0151t, hogy rendbe tegyem a k\u00f3dot \u00e9s felt\u00f6ltsem a githubra.<\/p>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Z\u00e1r\u00e1s<\/h1>\n<p><\/p>\n<p>Ahogy l\u00e1tjuk, a form\u00e1tum v\u00e9g\u00fcl egyszer\u0171nek bizonyult. <em>\u00e9s m\u00e9g unalmasnak is.<\/em>.<\/p>\n<p><\/p>\n<p>A cikkben neh\u00e9z visszat\u00fckr\u00f6zni a n\u00e9zeteim evol\u00faci\u00f3j\u00e1t, de higgye el: kezdetben olyan valamit akartam l\u00e9trehozni, ami bonyolult, elpuszt\u00edthatatlan \u00e9s k\u00e9pes lenne t\u00fal\u00e9lni egy k\u00f6zeli nukle\u00e1ris robban\u00e1st. Azonban a j\u00f3zan \u00e9sz (rem\u00e9lem) v\u00e9g\u00fcl gy\u0151z\u00f6tt, \u00e9s fokozatosan az egyszer\u0171s\u00e9g \u00e9s a kompaktoss\u00e1g fel\u00e9 tol\u00f3dtak el a priorit\u00e1sok.<\/p>\n<p><\/p>\n<p>El\u0151fordulhat, hogy t\u00e9vedtem? Igen, term\u00e9szetesen. Lehet, hogy p\u00e9ld\u00e1ul rossz min\u0151s\u00e9g\u0171 chipeket v\u00e1s\u00e1roltunk. Vagy valamilyen m\u00e1s okb\u00f3l az eszk\u00f6z nem fogja teljes\u00edteni a megb\u00edzhat\u00f3s\u00e1ggal kapcsolatos elv\u00e1r\u00e1sokat.<\/p>\n<p><\/p>\n<p>Van-e terve erre az esetre? A cikk elolvas\u00e1sa ut\u00e1n gondolom, hogy nem k\u00e9telkedik abban, hogy van tervem. S\u0151t, nem is egy.<\/p>\n<p><\/p>\n<p>Ha egy kicsit komolyabban veszj\u00fck, a form\u00e1tum egyszerre lett kifejlesztve munkav\u00e1ltozatk\u00e9nt \u00e9s mint \"tesztel\u00e9si lehet\u0151s\u00e9g\".<\/p>\n<p><\/p>\n<p>Jelenleg minden j\u00f3l m\u0171k\u00f6dik az asztalon, \u00e9s p\u00e1r napon bel\u00fcl a megold\u00e1s ki lesz terjesztve. <em>(kb.)<\/em> Sz\u00e1z eszk\u00f6z\u00f6n fogjuk megfigyelni, hogy mi fog t\u00f6rt\u00e9nni \"harci\" haszn\u00e1latban (b\u00edzom benne, hogy a form\u00e1tum megb\u00edzhat\u00f3an k\u00e9pes \u00e9szlelni a hib\u00e1kat; \u00edgy teljes statisztik\u00e1t tudunk majd \u00f6ssze\u00e1ll\u00edtani). N\u00e9h\u00e1ny h\u00f3nap m\u00falva k\u00f6vetkeztet\u00e9seket vonhatunk le. <em>(ha pedig nem lesz szerencs\u00e9nk \u2013 akkor ak\u00e1r hamarabb is)<\/em>.<\/p>\n<p><\/p>\n<p>Ha a haszn\u00e1lat sor\u00e1n komoly probl\u00e9m\u00e1kat tapasztalok, \u00e9s sz\u00fcks\u00e9gesek az ut\u00f3lagos m\u00f3dos\u00edt\u00e1sok, akkor err\u0151l mindenk\u00e9ppen \u00edrok.<\/p>\n<p><\/p>\n<h1 id=\"literatura\">Irodalom<\/h1>\n<p><\/p>\n<p>Nem akartam hossz\u00fa, unalmas list\u00e1t k\u00e9sz\u00edteni a haszn\u00e1lt anyagokr\u00f3l, v\u00e9g\u00fcl is mindenki sz\u00e1m\u00e1ra el\u00e9rhet\u0151 a Google.<\/p>\n<p><\/p>\n<p>Itt \u00fagy d\u00f6nt\u00f6ttem, hogy \u00f6sszegy\u0171jt\u00f6m azokat a felfedez\u00e9seket, amelyek k\u00fcl\u00f6n\u00f6sen \u00e9rdekesnek t\u0171ntek sz\u00e1momra, azonban fokozatosan \u00e1tkeltek mag\u00e1ba a cikkbe, \u00e9s a list\u00e1ban csak egy pont maradt:<\/p>\n<p><\/p>\n<ol>\n<li>Eszk\u00f6z <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/madler\/infgen\/\">infgen<\/a><\/noindex> a zlib szerz\u0151j\u00e9t\u0151l. \u00c9rthet\u0151en k\u00e9pes megjelen\u00edteni a deflate\/zlib\/gzip arch\u00edvumok tartalm\u00e1t. Ha neked is meg kell \u00e9rtened a deflate (vagy gzip) form\u00e1tum bels\u0151 fel\u00e9p\u00edt\u00e9s\u00e9t \u2013 melegen aj\u00e1nlom.<\/li>\n<\/ol>\n<p>Forr\u00e1s: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/479044\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f \u0415\u0441\u0442\u044c \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0412\u043d\u0443\u0442\u0440\u0438 Raspberry Pi \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0432\u044f\u0437\u043a\u0438 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0435. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043c\u043e\u043d\u0435\u0442\u043e\u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a, \u043a\u0443\u043f\u044e\u0440\u043e\u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a, \u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0438\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u2026 \u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0441\u0435\u043c \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430. \u0412\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u043d\u0430 \u0444\u043b\u0435\u0448\u043a\u0435 (MicroSD), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e USB-\u043c\u043e\u0434\u0435\u043c\u0430) \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u0442\u0430\u043c \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0411\u0414. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u0440\u043e\u0434\u0430\u0436\u0430\u0445 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0432 1\u0441, \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-53751","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f \u0415\u0441\u0442\u044c \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0412\u043d\u0443\u0442\u0440\u0438 Raspberry Pi \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0432\u044f\u0437\u043a\u0438 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0435.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/moya-realizatsiya-koltsevogo-bufera-v-nor-flash\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041c\u043e\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 NOR flash | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f \u0415\u0441\u0442\u044c \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0412\u043d\u0443\u0442\u0440\u0438 Raspberry Pi \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0432\u044f\u0437\u043a\u0438 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0435.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/moya-realizatsiya-koltsevogo-bufera-v-nor-flash\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-12-08T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:01:41+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47A gy\u0171r\u0171s pufferem megval\u00f3s\u00edt\u00e1sa NOR flash-ben | ProHoster","description":"El\u0151zm\u00e9ny Saj\u00e1t fejleszt\u00e9s\u0171 automat\u00e1k vannak. Bel\u00fcl Raspberry Pi \u00e9s n\u00e9h\u00e1ny kieg\u00e9sz\u00edt\u0151 \u00e1ramk\u00f6r egy k\u00fcl\u00f6n lapon.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/moya-realizatsiya-koltsevogo-bufera-v-nor-flash","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041c\u043e\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 NOR flash | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f \u0415\u0441\u0442\u044c \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0412\u043d\u0443\u0442\u0440\u0438 Raspberry Pi \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0432\u044f\u0437\u043a\u0438 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0435.","og:url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/moya-realizatsiya-koltsevogo-bufera-v-nor-flash","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-12-08T21:00:00+00:00","article:modified_time":"2020-02-18T11:01:41+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"53751","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 08:36:23","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:18:30","updated":"2026-01-24 08:36:23","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/53751","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=53751"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/53751\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=53751"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=53751"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=53751"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}