# NOR, NAND, eMMC ve Flash Tabanlı Depolama

Flash tabanlı depolama ortamları uzun yıllardır kullanılıyor. Mekanik disklere oranla hareket eden parçaların olmaması hem gürültü oranını düşürmekte hem de daha verimli bir çalışma imkanı sağlamaktadır. Ayrıca hareket halindeki mobil sistemler için çok daha dayanıklı bir kullanım sağlamaktadır. Hareket eden mekanik bileşenler olmadığı için rastgele erişim performansı da yüksek olmaktadır. Tüm bu saydığımız avantajlara ek olarak, mekanik bir diske oranla güç tüketimi çok daha düşük olmaktadır.

Elbette yukarıda sayılan tüm avantajlarına rağmen, flash tabanlı depolama aygıtlarının önemli handikapları da bulunmaktadır.

Flash tabanlı bir aygıt üzerinde, aynı bloğa herhangi bir şey yazmak için, tüm blok içeriğinin silinmesi gerekmektedir. Ancak her bir blok için yazma ömrü sınırlıdır. Ürünlere göre değişkenlik göstermekle birlikte genelde üreticiler blok başına 100.000 - 1.000.000 arasında değişen silme işlemi adedine kadar garanti verebilmektedir.

Blok başına silme ömrü kısıtı nedeniyle, flash tabanlı depolama aygıtı kullanılırken, aynı blok üzerinde işlem yapmak yerine donanım veya yazılım katmanında bu işlemlerin yönetilmesi ve sistemdeki tüm blokların eşit sayıda kullanılması sağlanmaya çalışılır. Depolama aygıtının ömrünü uzatmaya yönelik bu yönteme **wear leveling** adı verilmektedir.

## NOR Flash

NOR Flash tipi depolama aygıtına işlemci tarafından doğrudan rastgele erişim yapılabilmekte ve okunan kodlar doğrudan çalıştırılabilmektedir (XIP - eXecute-In-Place). Geleneksel yöntemlerin aksine, NOR Flash'tan okunan bir makine kodunun çalıştırılmadan önce RAM'e kopyalanmasına gerek yoktur.

Bu özellik NOR flash tipini özellikle _bootloader_, _BIOS_ gibi uygulamalar için daha iyi bir seçenek haline getirmektedir.

Okuma performansı iyi olmasına rağmen, yazma performansı NAND flash tipine göre düşüktür. Bu problem NOR flash'ları genel bir depolama birimi olarak kullanma noktasında dezavantajlı konuma getirmektedir. Ayrıca zaman içerisinde NAND flash kapasitelerinin artması ve fiyatlarının düşmesi, NOR flash kullanımını önemli oranda düşürmüş ve kullanımı belirli alanlarla sınırlanmıştır.

## NAND Flash

NAND Flash depolama aygıtı son yıllarda geniş bir kullanım alanı bulmuş, birim maliyeti düşmüş ve kapasitesi artmıştır. Ancak NOR Flash tipinden farklı olarak, CPU tarafından doğrudan erişilip kod çalıştırılamaz. NAND controller üzerinden erişilip içerisinde yer alan kodlar RAM'e aktarıldıktan sonra işlemci tarafından işletilebilir.

NAND Flash'ın bir diğer problemi, üretim sürecinden belirli bir oranda bozuk blokla (badblocks) çıkıyor olmasıdır. Üreticiler, **%1**'e kadar olan bozuk blok oranını kabul edilebilir bulmakta ve yaptıkları testlerde bulunan bozuk blokları, ilgili bloğun **OOB** (Out-Of-Band) alanına **MBBM** (Manufacturer's Bad Block Marker) özel işareti ile yazmaktadır.

Fabrika çıkışı işaretlenmiş bozuk blokların yanı sıra, kullanım sırasında da yeni bozuk bloklar oluşacaktır. Bunların algılanması ve benzer şekilde bir daha kullanılmaması için işaretlenmesi gereklidir.

Yukarıdaki maddeler ışığında, NAND Flash tabanlı bir depolama aygıtını verimli kullanabilmek için, donanım üzerinde veya kernel seviyesindeki yazılımla NAND Flash üzerinde yapılacak işlemlerin yönetilmesi gerekmektedir.

Günümüzde 2 tür NAND Flash depolama aygıtı bulunmaktadır. Birinci tür, içerdiği **F**lash **T**ranslation **L**ayer sayesinde üst katmanda standart bir blok aygıtı gibi görünürken, ikinci tür **raw flash** aygıtları olarak adlandırılır ve işletim sistemi çekirdeği tarafından Controller'a erişilebilir ve bozuk blok yönetimi işletim sisteminin kontrolünde gerçekleştirilebilir.

### Flash Translation Layer

![usb flash](https://1126443698-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M1orLm1zMlSb0HDReh3%2F-M1orOHt9F4aVRW97O8l%2F-M1orXn5HcwlOPwjUGXp%2Fusb-drive.jpg?generation=1583582463765714\&alt=media)

İlk zamanlarda çıkan PCMCIA flash kartları, **raw flash** türünde idi. Bu nedenle üzerinde blok tabanlı bir dosya sistemi çalıştırabilmek için (fat, ext3 vb.) yazılımsal bir FTL sürüsüne ihtiyaç vardı.

Sonrasında bu işlemler donanım üzerindeki bir _controller_ aracılığıyla _firmware_ içerisinde yapılmaya başlandı.

Günümüzde USB Flash Bellek, SSD, eMMC gibi sistemler, firmware tarafından sunulan _FTL_ katmanı sayesinde ek bir sürücüye ihtiyaç duyulmaksızın, normal bir disk gibi kullanılabilmektedir. Donanımın firmware'i işlemleri bizim için yaptığından dolayı üst katmanda herhangi blok tabanlı dosya sistemi kullanılabilmektedir.

SSD ve büyük oranda eMMC'yi kenarda tutarak, diğer FTL tabanlı depolama ortamlarını gömülü Linux projelerinde, endüstriyel işlerde kullanmak iyi bir fikir olmayabilir. Bunu biraz daha açacak olursak:

* Üreticiler FTL işlevini gerçekleştiren firmware kodunu kapalı tuttuklarından, flash tabanlı bir ortam kullanmaktan gelen kısıtları (silme ömrü, wear-levelling vb.) bu firmware içerisinde ne derece _iyi_ bir şekilde halletmiş olduklarını bilme şansımız kalmaz.
* FTL tabanlı ortamların çoğu, üzerinde _FAT_ gibi basit bir dosya sisteminin çalıştırıldığı, güç kesintilerinde veri kaybına tahammülü olan, son kullanıcıya yönelik ürünler olarak tasarlanmaktadır. Endüstriyel bir kullanıma yönelik tasarlanmamışlardır.
* FTL controller, dosya sisteminde ne olup bittiğini tam olarak bilemeyeceğinden, örnek olarak silinmiş dosyalara ait kullanılmayan bloklar için de işlem yapmaya devam ederken, **raw flash** üzerinde çalışan dosya sistemleri, daha iyi bir yönetim yapabilir.

Bu olumsuzluklara rağmen, kaliteli bir firmware ve hızlı bir controller ile, yüksek başarım sağlanabilir. SSD ve eMMC aygıtlarının hedef kitlesi nedeniyle üretim kaliteleri ortalama olarak çok daha iyi olduğundan daha iyi performans elde edilebilmektedir. Bununla birlikte controller tarafında kapalı kod ile yapılan işlemler, sürecin toplamdaki kalitesi noktasında bir şüphe noktası oluşturmaktadır.

### Raw NAND Flash

Raw NAND Flash aygıtları için Linux kernel seviyesinde tam bir kontrol sağlanabilmektedir.

Farklı çip üreticileri bulunduğundan kullanılan raw-flash çipi donanımından bağımsız olarak genel bir kontrol arayüzü ve katmanı sağlayabilmek adına, Linux kernel içerisinde **Memory Technology Device** katmanı geliştirilmiştir. Bu sayede raw-flash çip üreticileri alt katmanda donanımlarıyla MTD katmanının bağlantısını sağladığında, ilgili çip için kernel yazılımsal controller vazifesi görebilmektedir.

## eMMC ve Gelecekteki Durum

eMMC aygıtları, NAND Flash depolama aygıtının board üzerinde gömülü (embedded) olup MMC arayüzü ile kernel içerisinde standart bir blok aygıtı gibi çalışmaktadır.

Son 2 yılda giderek artan hızda kullanım alanı bulmuş olup, kapasite, verimlilik, birim maliyet gibi alanlarda raw NAND flash aygıtlarına göre avantajlı hale gelmiş, üretim hacmi artmış ve sürekli fiyatları düşmektedir. Buna bağlı olarak çok yakın bir gelecekte raw NAND flash tabanlı aygıtları piyasada görememeye veya çok yüksek fiyatlardan bulmaya başlarsak şaşılmaması gerekir. **2014** sonu itibariyle piyasaki bir çok board, depolama birimi olarak raw NAND flash yerine, eMMC veya MMC ile gelmektedir.
