Memory Technology Device - MTD Katmanı
MTD katmanı, donanım spesifik raw flash aygıt sürücüleri ile bunları kullanacak üst seviyeli katmanlar arasında bir soyutlama yapılabilmesini sağlar.
raw flash tabanlı ortamlarda kullanılır.
MTD katmanı tarafından algılanan aygıtlar, /proc/mtd
dosyasından görüntülenebilir:
MTD Karakter Aygıtı Desteği
mtdchar sürücüsü sistemde algılanan her bir MTD bölümüne (partition) karşılık, karakter tabanlı erişimi simüle edecek bir karakter aygıtı oluşturur.
Major numarası 90 (5A) şeklindedir. İsimlendirmesi /dev/mtdXX
şeklinde yapılır.
Read-Only erişimler için tek sayılı minor numaraları, read-write erişim için çift sayılı minor numaraları kullanılır.
raw flash üzerinde yapılacak işlemler ve silme operasyonları için ek ioctl çağrıları içerir.
Genellikle mtd-utils paketinden çıkan uygulamalar tarafından kullanılır.
MTD Blok Aygıtı Desteği
mtdblock sürücüsü sistemde algılanan her bir MTD bölümüne (partition) karşılık, blok tabanlı erişimi simüle edecek bir blok aygıtı oluşturur.
Major numarası 31 (1F) şeklindedir. İsimlendirmesi /dev/mtdblockXX
şeklinde yapılır.
Minor numarası, MTD bölümünün numarasını gösterir.
Blok tabanlı okuma-yazma operasyonlarını destekler. Ancak bozuk blok yönetimi, yazma operasyonlarının farklı bloklara dağıtılması (wear-levelling) gibi destekleri bulunmamaktadır.
MTD Partitioning (Bölümlendirme)
MTD aygıtları, bir gereklilik olmamakla birlikte, çoğu durumda bölümlendirme yapılarak kullanılırlar.
Bu şekilde MTD aygıtının farklı alanlarını, farklı özelliklerde (read-write, read-only vb.) ve amaçlarda kullanmak kolaylaşır.
Blok tabanlı aygıtlarda mevcut olan bölümlendirme tablosu (partition table) yapısı, MTD aygıtlarında yer almaz.
Bu nedenle bölümlendirme tablosunun nasıl olduğunun harici bir yerde saklanması gerekir. Bu harici yer, kernel kodunun içerisinde hard-coded biçiminde veya kernel açılış parametreleri sayesinde her açılışta parametrelerin okunması suretiyle gerçeklenir.
Redboot gibi bazı boot yükleyici uygulamaları, sabit disk gibi aygıtlara benzer şekilde bölümlendirme tablosunu MTD aygıtının belirli bir yerinde tutma alternatif yöntemiyle de çalışabilmektedirler. Bu senaryoda kernel tarafından ilgili bölümlendirme kurallarının okunup anlaşılabilmesi için, kernel derleme sürecinde Redboot Partition Table Parsing seçeneğinin aktifleştirilmesi gereklidir.
MTD Partitioning
Hardcode Yöntemi
Doğrudan ilgili MTD sürücüsü içerisinde yapılır. Örnek olara arch/arm/mach-omap2/board-omap3beagle.c
içerisine bakalım:
Bu modelde çalışan çekirdek yeniden derlenmeden, bölümlendirme tablosunu değiştirmek mümkün olmaz. Kulağa hoş gelmiyor olsa da pek çok sistem bu şekilde çalışmaktadır. Gömülü sistemlerin dizaynı yapıldıktan sonra sahadaki kullanımında sonradan bölümlendirme tablosunun yeniden yapılandırılması ihtiyacı genellikle oluşmaz. Böyle bir ihtiyacın oluşması durumu, muhtemel bir tasarım süreci problemine işaret eder.
Kernel Parametresiyle Bölümlendirme
Kernel açılış parametresi olarak aşağıdaki formatta değer girilmek suretiyle bölümlendirme tablosunu tanımlamak mümkündür:
Bu örnekte;
4 MB Kernel için read-only,
32 MB kök dosya sistemi için
rootfs
adında read-only,100 MB
data
adında genel bir yazılabilir bölümVe flash'ın geri kalan kısmının tamamından oluşan
archive
adında bir bölüm daha oluşturulmuştur.
Kernel'ın ilgili flash çipini hangi anahtar kelime üzerinden tanıdığını önceden öğrenmek veya açılış loglarından takip etmek gerekir. Bu örnekte anahtar kelime davinci_nand
şeklindedir. Sistemde birden fazla NAND flash çipi de bulunabilir. Bu şekilde hangi sürücü üzerinden hangi çipe erişmek istediğimizi de belirtmiş oluyoruz. Aynı sürücüde birden fazla çip olduğunda, instance numarası da kullanılır.
MTD Bölümünün Silinmesi
Bir MTD bölümünün tamamının veya belirli sayıdaki blokunun silinmesi için mtd-utils paketinden çıkan flash_erase
uygulaması kullanılır:
Offset değeri olarak 0
ve block count değeri olarak 0
girilmesi durumunda, tüm bölüm silinir.
Bloklar daha önceden kilitlenmiş durumda ise, -u
parametresi ile veya flash_unlock
uygulaması ile kilit kaldırılır.
Örnek kullanım:
MTD Bölümüne Yazma
Bir MTD bölümüne yazma (dosyasistemi imajını) işlemi için mtd-utils paketinden çıkan flashcp
ve nandwrite
uygulamaları kullanılır.
nandwrite uygulaması NAND flash tipinde, flashcp uygulaması NOR flash tipinde kullanılır.
nandwrite uygulaması biraz daha yetenekli oluğ, padding vb. gibi daha fazla seçenek sunmaktadır.
Örnek kullanım:
MTD Aygıt Simülasyonu
Geliştirme ortamınızdaki bilgisayarda NAND flash bulunmayacağı için sürekli bir cihaz üzerinde çalışmanın mümkün olmadığı senaryolarda, nandsim
modülü üzerinden NAND flash ortamını simüle etmeniz mümkündür.
NAND simulator (nandsim) NAND flash aygıtını RAM veya bir dosya üzerinde simüle eder. nandsim
modülünü yüklerken simülasyonun durumunu etkileyecek pek çok modül parametresi bulunmaktadır. Başlıca modül parametreleri aşağıdaki gibidir:
first_id_byte
: NAND flash üzerinden okunacak ilk byte'ın ne olacağını gösterir (read ID
komutuna dönen cevap,manufacturer ID
değeri olarak yorumlanacaktır). Kernel kaynak kodu içerisindekiinclude/linux/mtd/nand.h
dosyasında NAND üretici kodları tanımlıdır.second_id_byte
: NAND flash üzerinden okunacak ikinci byte'ın ne olacağını gösterir (read ID
komutuna dönen cevap,chip ID
değeri olarak yorumlanacaktır).drivers/mtd/nand/nand_ids.c
dosyasında chip ID değerleri yer almaktadır. Örnek olarak0x78
chip ID değeri, 128MiB 1,8V 8-bit NAND iken,0xC5
2GiB 3,3V 16-bit NAND çipini gösterir.
Bunların haricinde nandsim
modülünün 20 kadar daha parametresi bulunmaktadır. Parametrelerin listesini modinfo
komutuyla alabilirsiniz:
Şimdi Fujitsu üreticisi için (0x04), 128 MiB'lık NAND flash (0x78) çipini simüle edelim:
Sonrasında dmesg
komutuyla kernel buffer alanının son kısmına bakalım:
Artık kernel açısından normal bir MTD aygıtımız oluşmuş oldu. MTD aygıtları üzerindeki tüm işlemleri burada yapabiliriz (Jffs2, Ubi, Ubifs çalışmaları, flash_erase
, nandwrite
vb.)
Last updated
Was this helpful?