ARM Mimarisi İçin Linux Tabanlı İşletim Sistemi Tasarımı

 

 

Bugünkü yazımızda ARM mimarisine sahip işlemciler üzerinde koşturabileceğimiz linux tabalı işletim sistemimizi tasarlayacak ve beagle board-rev c4 üzerinde çalıştıracağız. Bu işlemleri buildroot adlı program yardımıyla yapacağız.

 

Buildroot Nedir?

Buildroot, gömülü işletim sistemi tasarlanması için geliştirilmiş cross-compile destekleyen bir programdır. Örnek vermek gerekirse x86 mimarisine sahip makinamız ile buildroot yardımıyla ARM mimarisi üzerinde çalışacak bir işletim sistemi tasarlayabiliriz.  Buildroot üzerinde işletim sistemi için gerekli kütüphaneler, make file dosyaları ve patch ler bulunur ve bunları seçmemize olanak sağlar. Bu sayede çok az yer kaplayan sadece amacımıza uygun çalışan gömülü işletim sistemleri tasarlayabiliriz. Bize otomatik olarak hazır sistem sunabildiği gibi gerekli yerlerde manual ayarlar yapmamıza da olanak sağlamaktadır.

Buildroot ile sadece ARM değil bir çok mimari ile çalışma olanağı mevcut. Hatta çok küçük imaj dosyaları oluşturulabileceği gibi büyük sistemler tasarlanması da mümkün. Amacınıza uygun işletim sistemi tasarımına olanak sağlar demek burada en doğrusu olacaktır. Piyasada buildroot tek değildir. Bu tarz programlar gömülü işletim sistemleri alanında çok kullanılan programlardır. Aslında beagle board için tercih edilen sistem openembedded tır. Genellikle o kullanılır. Fakat biz bugün buildroot ile imaj oluşturacağız.

Başlamadan Önce

Eğer bu konularda bilginiz yoksa ve sadece bu yazıyı okuyorsanız bilgilerinizin çoğu havada kalacaktır. Bu yazıda önceki yazılarımızdaki tecrübelerimizden faydalanarak ve onları kullanarak işlemler yapacağız. O yüzden başlamadan önce bilinmesi gerekenler kısmı oluşturmak istedim.

Öncelikle cross-compile olayının ne olduğunu tam olarak anlamamız gerekiyor. Ve gerekli cross compile programını indirmemiz gerekiyor.  O yüzden ilk önceliğimiz cross-compile yazısını okumanız olacaktır. (http://tuna-ayan.com/arm-tabanli-sistemler-icin-cross-compile-operasyonu/)

Diğer bir önceliğimiz oluşturulacak olan imaj dosyalarının ne anlamlara geldiği olacaktır. Arka planda bu işlemlerin nasıl çalıştığını ne işimize yarayacağını öğrenmemiz gerekiyor. MMC kart üzerine bu sistemi nasıl atacağımızı bunları yapabilmek için hangi programlara ihtiyacımız olacağını bilmemiz gerekiyor. Bu konuda yaptığımız bir diğer çalışmayıokumanızda fayda var.

Son olarak kendi işletim sistemimizi tasarlamadan önce mutlaka daha önceden beagle board üzerine bir işletim sistemi kurmuş olmanızı tavsiye ediyorum. Belki bu yazı için çok büyük bir önemi yok ama orada kazandığımız tecrübeler ile bu platformda daha yaratıcı davranabiliyoruz. Çünkü platformu biz oluşturacağız ve daha önceden yapılmış olanlardan esinlenecek olmamız çok doğal.

Angstrom yüklenmesihttp://tuna-ayan.com/beagleboard-icin-angstrom-imaji-olusturma/

Ubuntu yüklenmesihttp://tuna-ayan.com/beagle-board-uzerinde-ubuntu-kurulumu/

Birde bana en çok gelen sorulardan bir tanesi acaba beagleboard-xm üzerinde çalışır mı? oluyor. Evet çalışır tek farkı config dosyalarıdır. Bu dosyalarda kernel içerisinde arch->arm->config yolundan default olarak alınabileceği gibi internette bir çok gurunun config dosyaları da bulunabilir. Internette bu konuda kaynak yeterince fazla.

Gerekli Paketler

Öncelikle sistemimize buildroot programını indireceğiz. Sitesinden programı indirebiliriz. Sürümden sürüme içeriği farklılıklar gösterebilir. Bu yazıda anlatacağımız sürüm  2011.11 sürümü olacaktır. Bilgisayarımıza indikten sonra /home/<kullanıcı adı> kısmına dosyayı çıkartıyoruz. Ve bu aşamada şimdilik bu kısmı bırakıyoruz.

Daha sonra buildroot derleyebilmek için gerekli paketleri indirmemiz gerekiyor. yine konsoldan bu paketleri indiriyoruz.

[codesyntax lang=”c”]

sudo apt-get install libncurses5-dev bison g++ flex gettext
texinfo patch git-core libtool autoconf subversion

[/codesyntax]

Yazmayı unuttuğum paketler olabilir. Fakat büyük bir sorun oluşturmayacaktır çünkü konsol bu eksikliklerden dolayı hata verdiğinde nelerin eksik olduğunu ve hangi paketi yüklememiz gerektiğini de söylüyor. O paketleri yükledikten sonra kaldığınız yerden devam edebilirsiniz.

Uygulama

Konsoldan buildroot dosyasını çıkarttığımız dizine geliyoruz ve make menuconfig komutunu giriyoruz. Bu komutla birlikte buildroot için ayar penceresi açılacaktır.

Ayar penceremiz default olarak x86 sistemler için tasarlanmak üzere açılacaktır. Şimdi tek tek ayarlamalarımızı yapıyoruz.

Target Architecture:

Burada Hedef mimariyi seçmemizi istiyor. Arm seçeneğini işaretliyoruz.

Target Architecture Variant:

Bu kısımda hedef cihazın kendi içindeki yapılarını seçmemiz isteniyor. Burada biz generic arm olarak bırakacağız.

 

ToolChain:

Bu kısımda değiştirmemiz gereken bir kaç yer var. Öncelikle toolchain type kısmından External toolchain seçeneğini seçiyoruz. Burada arm için cross-compile derleyicimizi sisteme göstermemiz gerekiyor. Ardından derleyicimizi seçiyoruz. Altında derleyiciyi internetten indirip indirmeyeceğini söyleyen bir kutucuk çıkacaktır. Orada ise n harfi ile kutucuktaki onayı kaldırıyoruz. ‘n’ harfi ile onay kaldırıp ‘y’ harfi ile kutuları onaylayacağız. Ardından bir alt satırda bizden derleyicimizin yolunu göstermemiz gerekiyor. Cross-compile yazısında anlattığımız şekilde derleyici yolumuzu ekliyoruz. Bu işlemleri bitirdiğimizde aşağıdaki ekran görüntüsüne sahip oluyoruz.

System Configuration:

Bu kısımda genellikle host ile nasıl bir bağlantı kurulacağı üzerinde duruluyor. Kendimiz bir host ismi verebiliriz. Yine aynı şekilde işletim sistemimizin adını belirtecek şekilde banner ismi verebiliriz. Hangi baud ayarında ve hangi protokol üzerinden haberleşme yapacağını da seçebiliyoruz. Burada önemli olan bir kısım ise protokol kısmıdır. Eğer linux 2.6.38 üzeri bir kernel kullanacaksak ttyO kullanmamız gerekiyor. Ama biz linux 2.6.35 kullanacağız ve bu kısımı ttyS2 olarak değiştiriyruz.

Package Selection for the target

Bu kısımda işletim sistemimizde kurulu gelmesini istediğimiz paketleri seçiyoruz. Tamamen çalışmalarımıza ve hayal gücümüze bağlı olarak, linux hayatımızda kullandığımız paketlere göre şekillenen bir yer. Bazen kullanacağımız uygulamalar göre şekillendirmek daha doğru oluyor o yüzden bu uygulama için çok fazla seçeneğimiz olmayacak. Bir kaç özellik ekleyeceğiz.

[X] Show packages that are also provided by busybox
[X] Customize

Farklı klavye seçeneklerini destekleyebilmesi için yüklememiz gereken paket:

Hardware handling –>
[X] kbd

Daha sonra vim text editor kullanabiliriz:

Text editors and viewers —>

[X] vim

Bu uygulama için bu kadar. Bundan sonraki uygulamalarımızda GUI desteği de sağlayacağımız için ekleyecek paketlerimiz artacaktır. Bu bölümü karıştırmanızda fayda var.

 

Kernel:

Bu kısımda kullanacağımız kerneli seçmemiz gerekiyor. 2.6.35 ile çalışmayı tercih ettiğimiz için bunu kullanıyoruz burada. Daha sonra beagle board için bir config dosyası belirtmemiz gerekiyor. kernel üzerinde default olarak bulunan omap3_beagle_defconfig yolunu tanıtıyoruz. -xm kullanıcıları burada kendi cihazları için tanıtmak zorundalar. Yine ilerki konularda yapacağımız üzere kendi config dosyamızı da tanıtmamız mümkün. Son olarak kernel imaj formatı seçmemiz gerekiyor. Bildiğimiz üzere uImage bizim için gerekli dosya ve onu seçiyoruz. Diğer imaj türlerine yine ileride değineceğiz.

Böylelikle işlemlerimizi bitirmiş oluyoruz. Kaydedip çıkıyoruz. ve konsola make komutunu yazıyoruz. Bu işlemler sırasında bilgisayarınızın internete bağlı olması gerekiyor. Ve kota sorununuz olmaması gerekiyor. Çünkü bu paketleri internet üzerindeki repository lerden çekiyor. Tabiki her kurulumda bunu yapmıyor. Sadece ilk yüklemelerde bu kurulumları yapıyor. bir daha buildroot imaj oluşturmak istemeniz durumunda eğer yüklü ise indirmeden derleme işlemine başlıyor. İşlem bittiğinde aşağıdaki ekran görüntüsünü almış olmanız gerekmektedir. İmaj dosyası output->images yolundan bulunabilir.

Karşılaşılan Sorunlar Ve Çözümleri

Bu bölümde kurulum sırasında karşılaştığımız sorunlardan bahsedeceğiz. Öncelikle ikinci bir imaj kurmak istiyorsak bütün buildroot klasörünü silip yeniden dizine çıkartmamıza gerek yok.(ben çok yaptım:) ) Onun yerine output yolu içerisindeki build klasörünü silmemiz yeterli. Böylelikle daha önceden indirmiş olduğu paketleri tekrar indirmek zorunda kalmıyoruz.

 

Diğer karşılaşılan hatalardan bir tanesi ise host ile rs232 üzerinden bağlantı kuramamak oldu. Sonuçta beagle board ile rs232 üzerinde haberleşip kendi seri portumuzda işlem yapmak istiyorduk. İlk başta denemelerde

Starting network...

yazısından sonra işlem yapmayı bırakıyordu cihaz. Bunun sebebinin ne olduğunu internetten bulduk.

Yukarıda hangi porttan çalışacağını gösteren bölgeyi tabiki başta ttyS0 olarak almıştık ve yukarıdaki hatayı verdi. İlk başta rs-usb dönüştürücü kullanıyoruz o zaman burasının ttyUSB0 olması gerekir gibi bir mantık kurduk ve yine aynı hatayı aldık. Daha sonra içini boş bırakalım gibi bir mantık kurduk fakat yine hüsran:) Tabi bir buildroot imaj oluşturmanın 30dk sürdüğünü düşünürsek her seferinde sadece bu ayarı değiştirip deneme yapmak sinirleri de yıpratıyor. Ardından bu ayarın hangi dosyayı etkilediğini bulduk.  rootfs içerisinde etc->inittab yolundan bulmak mümkün. Sadece o satırı değiştirip kaydedersek de sorunumuz çözülüyor(15sn).

[codesyntax lang=”c” title=”ininttab”]

# /etc/inittab
#
# Copyright (C) 2001 Erik Andersen <andersen@codepoet.org>
#
# Note: BusyBox init doesn't support runlevels.  The runlevels field is
# completely ignored by BusyBox init. If you want runlevels, use
# sysvinit.
#
# Format for each entry: <id>:<runlevels>:<action>:<process>
#
# id        == tty to run on, or empty for /dev/console
# runlevels == ignored
# action    == one of sysinit, respawn, askfirst, wait, and once
# process   == program to run

# Startup the system
null::sysinit:/bin/mount -t proc proc /proc
null::sysinit:/bin/mount -o remount,rw / # REMOUNT_ROOTFS_RW
null::sysinit:/bin/mkdir -p /dev/pts
null::sysinit:/bin/mkdir -p /dev/shm
null::sysinit:/bin/mount -a
null::sysinit:/bin/hostname -F /etc/hostname
# now run any rc scripts
::sysinit:/etc/init.d/rcS

# Put a getty on the serial port
ttyS2::respawn:/sbin/getty -L ttyS2 115200 vt100 # GENERIC_SERIAL

# Stuff to do for the 3-finger salute
::ctrlaltdel:/sbin/reboot

# Stuff to do before rebooting
null::shutdown:/usr/bin/killall klogd
null::shutdown:/usr/bin/killall syslogd
null::shutdown:/bin/umount -a -r
null::shutdown:/sbin/swapoff -a

[/codesyntax]

Son olarak bir kolaylıktan daha bahsedeceğim. Bu ayarları sisteme direkt olarak yüklemeniz aslında mümkün. Bu ayarları yaptığınızı düşünelim. Kaydettikten sonra tekrar aynı ayarları otomatik olarak yüklemek mümkün. Bunun için make <ayar_adı> ile bu ayarlarınızı otomatik olarak config dosyasına ekleyecektir.

Pratik

Çıkan imaj dosyalarımızın beagle board üzerine nasıl atıldığını bilmiyorsanız başlamadan önce bölümüne tekrar göz atmanızı tavsiye ederim. Imaj dosyamız yaklaşık 35mb. Üzerinde GUI yok şu an konsoldan çalışıyor ama bir sonraki uygulamamızda GUI entegre edeceğiz. Bir şeyler yapmak adına games bölümündeki satranç programını da işletim sistemine dahil ettik ve bir video aldık.

You May Also Like

About the Author: tunayan

4 Comments

  1. Cortex m3-m4 ler için oluşturmanın bir mantığı var mı (zorlanır-çalıştırmaz-çalıştırır)? oluşturulabilinir mi (galiba bişey yaptım ama çalışırmı bilinmez)? Eğer oluyor ve mantıklıysa bize sağladıkları nelerdir?

    Yukarıda ki kısım olumlu ise uImage ı çipin flashına atıp (~900kb nasıl olacaksa) rootfs yi de sd kartamı atacağız? Nasıl olacak… biraz açıklarmısın.

    Teşekkürler,

  2. merhabalar hocam
    benim sorum şu arm tabamlı bir işlemci kullanıp çeşitli IO donanımları oluşturup ve bunu linux android işletim sistemi kurup nasıl çalıştırabılırız örneğin bir klavyem var ben bunu nasıl tanımlatırım lınuxa nasıl olur bunun ıcın bios yazmakmı gereklı?
    kaynak site ve herhangı bır dokumantasyon verırsenız cok sevınırım cunku gercekten bu konu hakkında hıc bır sey bulamadım araştırmama rağmen.
    iyi çalışmalar diliyorum şimdiden sağolun…

    1. Eğer builtroot gibi hazır rootfs oluşturma yazılımları kullanırsanız oluşturacağınız linux tabanlı işletim sistemi zaten klavyenin sürücüsünü destekleyecektir. Klavyeyi tanımlamanıza gerek yok. Ama bu iş nasıl yapılıyor sorusuna cevap ise sürücü yazmakta geçiyor. Bu yazdığınız sürücüyü kernel üzerinde ekleyip derleyip uimage oluşturabilirsiniz.

Leave a Reply

Your email address will not be published. Required fields are marked *