Вы находитесь на странице: 1из 311

Gml

Linux

Table of Contents
Giri

Linux ekirdei

Gml Sistemlerdeki Kullanm

1.1

Gelitirme Sreci ve Versiyonlar

1.2

Kod Szdizim Rehberi

1.3

Konfigrasyon Sreci ve Kbuild Sistemi

1.4

Derleme ve apraz Derleme

1.5

Initramfs majnn Eklenmesi

1.6

U-boot maj Haline Getirilmesi

1.7

Gml Sistemlerde Boot Ykleyiciler

U-boot

2.1

RedBoot

2.2

ARM Mimarisinde Al Sreci

2.3

Linux Al Sreci

Kernel Al Sreci

3.1

Kullanc Kipine Gei - Init Sreci

3.2

Kk Dosya Sistemi Oluturma

Initramfs le Erken Kullanc Kipi

Devtmpfs Dosya Sistemi

NfsRoot alma Yntemi

apraz Derleme ve Gerekli Ekipmanlar

NOR, NAND, eMMC ve Flash Tabanl Depolama

Memory Technology Device - MTD Katman

10

Unsorted Block Images - UBI Katman

11

Gml Sistemlerde Kullanlan Dosya Sistemleri

12

JFFS2 Dosya Sistemi

12.1

YAFFS2 Dosya Sistemi

12.2

UBIFS Dosya Sistemi

12.3

Cramfs Dosya Sistemi

12.4

Squashfs Dosya Sistemi

12.5

Gml Linux

Minix Dosya Sistemi

12.6

FAT Dosya Sistemi

12.7

Ext2,3,4 Dosya Sistemi

12.8

Watchdog Kullanm

13

CPU Frequency Scaling

14

Buildroot

15

Android Platformu

16

Gelitirme Ortamnn Hazrlanmas

16.1

na Sreci

16.2

Sistem arlar

17

Strace Kullanm

18

GNU Build Sistemi Aralar

19

Make

19.1

Autoconf, Automake

19.2

Raspberry Pi

20

Raspberry Pi 2 Teknik zellikleri

20.1

Al Sreci

20.2

Gerekli Aralarn Elde Edilmesi

20.3

Kernel Derleme Sreci

20.4

U-boot Derleme Sreci

20.5

Dosya Sisteminin Hazrlanmas

20.6

Cihazn Almas

20.7

NFS Root alma

20.8

Sistem Konfigrasyonu

20.9

Board Spesifik Klavuzlar

21

Hawkboard

21.1

Olimex A20

21.2

TI DM6446 EVM

21.3

BeagleBoard

21.4

BeagleBoneBlack

21.5

EKLER

22

Seri Konsol Kullanm

22.1

TFTP Sunucu Kurulumu

22.2

NFS Sunucu Kurulumu

22.3
3

Gml Linux

TI ilemcilerinde DSP kullanm

22.4

C6Run

22.4.1

DSP Testi

22.4.2

Ubuntu Sanal Makine Performans

22.5

Gml Linux

Giri
Gml Linux kitab, bu alanda gerekletirdiimiz eitim programlarmzda ilediimiz
konularn biraraya getirilmesi fikriyle olutu.
Eitim iin hazrladmz belgelerin kitap formatnda dzenlenme ve gncelleme almalar
devam ediyor. Srecin yarsna yaklatmzdan bakalarna da faydal olabileceini
dnerek, kitap ieriini genel eriime ayoruz.
Gml Linux kitab bu alanda almak isteyenlere balang seviyesinde bilgiler
sunmasnn yan sra, uzun yllardr alan kiiler iin de retici unsurlar barndrmaktadr.
Amacmz spesifik konulara girmek yerine renme sreci asndan en fazla fayda retecek
balklara deinmek eklinde olmakla birlikte, bu dengeyi tutturmann kolay olmadnn da
bilincindeyiz. Tam da bu noktada ierikle ilgili geri bildirimlerden memnuniyet duyacamz
belirtiriz.

Sorularnz in
Kitapla ilgili neri ve dncelerinizi mdemirten at yh.com.tr adresinden bizimle
paylaabilirsiniz.
Ek olarak teknik sorularnz http://www.linux-tips.org sitesinde zellikle Embedded tartma
bal altnda iletmeniz halinde, yantlamaya alacamz belirtmek isteriz. Katk
salayabilecek daha ok kiiye ulamak iin site ngilizce olarak hazrlanmaktadr.

Yardmc Kitap
Henz genel eriime almam olan Linux Sistem Programlama kitabmzn da okunmasn
neriyoruz. Mart ay ierisinde ilk versiyonu am olmay planlyoruz.

Telif Hakk
Bu kitabn btn telif haklar Murat Demirten'e aittir. Kitabn tamam veya bir ksm, "kaynak
gsterildii ve deiiklik yaplmad" takdirde, herhangi bir izne gerek kalmadan, her
trl ortamda oaltlabilir, datlabilir, kullanlabilir.

Teekkr
Giri

Gml Linux

erie katklarndan dolay Serkan Eser'e teekkrlerimi sunuyorum, katklarnn devamn


bekliyoruz :)

Giri

Gml Linux

Linux ekirdei
Linux, Unix felsefesi ve tasarm prensipleri dorultusunda gelitirilmi ak kaynak kodlu bir
iletim sistemi ekirdeidir. ekirdein kaynak kodlar GNU Genel Kamu Lisans
erevesinde zgrce datlabilir, deitirilebilir ve kullanlabilir.
Linux, 1991 ylnda Finlandiyal bir niversite rencisi olan Linus Benedict Torvalds
tarafndan gelitirilmeye balanmtr. Torvalds, 25 Austos 1991'de, comp.os.minix haber
grubuna gnderdii mesajda yeni bir iletim sistemi gelitirmekte olduunu ve ilgilenen
herkesin yardmn beklediini yazd. Daha sonra 17 Eyll 1991'de Linux'un ilk srm olan
0.01'i nternet'te yaynlad. Ksa bir sre sonra, 5 EKim 1991'de temel zellikleriyle beraber
ilk resmi Linux srm olan 0.02'yi yaynlad. Linux ismi ilk olarak 0.02 versiyonunda
gemektedir.
Linus Torvalds, hlen aktif olarak ekirdek gelitirme ekibinde olup halen en fazla kod
gnderenler arasnda ilk sralarda yer almaktadr.

Kaynak Kod Boyutu


Linux ekirdeinin prematre hallerini es geip 1994 ylnda duyurulan 1.0 versiyonunu ele
alacak olursak, proje yaklak 6 MB yer kaplamaktayd ve 34 dizin, 561 dosya ieriyordu.
Kaynak kod satr says ise tam olarak 165165 idi.
Mays 2015 tarihinde yaynlanan 4.0.4 versiyonunun kaynak kodlar tar.xz arivi haline
getirildiinde 78 MB yer kaplamaktadr. Ariv dosyas aldnda ise 3159 dizin, 48948
dosya kmakta ve toplam boyut 641 MB eklinde olmaktadr. Proje yaklak 20 milyon kod
satrndan olumaktadr.
Bu boyuttaki devasa bir yazlm projesinin belirli bir irket ats olmakszn binlerce insann
katklaryla yrtlebiliyor olmas da bal bana bir baar noktas olarak
deerlendirilmelidir. Srecin ynetilebilir alt paralara ayrlmas ve sorumluluklarn
datlmas, karar alma mekanizmalarnn iletimi, test, srm ve yol haritas planlama vb.
gibi adreslenmesi gereken tm balklarn, bir an iin Enterprise bak asyla byk bir
irket tarafndan gerekletirildiini ve halihazrda Linux'un destekledii tm platformlar
desteklediini dnelim:
Acaba ka yl srerdi?
Nasl bir maliyet ortaya kard?
Daha iyi olur muydu?

Linux ekirdei

Gml Linux

Desteklenen Mimariler
Gncel Linux ekirdei, 29 farkl mimariyi (yaz ile yirmi dokuz) desteklemektedir.
Desteklenen mimariler Alpha, Analog Devices (Blackfin), ARM, Atmel AVR32, Axis Etrax
CRIS, Texas TMS320 DSP Ailesi, Motorola 68K, Fujitsu FR-V, Qualcomm Hexagon,
Hewlett-Packard PA-RISC, Renesas (Hitachi) H8, IBM 31bit System/390 ve 64bit Z
Mainframe, Intel IA-64 Itanium, x86, Mitsubishi M32R, Xilinx Microblaze, MIPS, Panasonic
MN103, Open RISC, Power (IBM), PowerPC, Sparc 32 Bit, Ultra Sparc 64 bit, SuperH,
Synopsys, S+core, Tilera, Xtensa ve Unicore32 eklindedir.

Linux ekirdei

Gml Linux

Gml Sistemlerdeki Kullanm


Linux ekirdei 2000'li yllarn bandan itibaren giderek artan hzda, gml sistemlerde
kendine kullanm alan bulmutur.
nceleri Windows CE, VxWorks vb. nemli rakipleri varken, ilerleyen yllarda neredeyse
standart haline gelmi ve youn bir kullanm oran yakalamtr.
Gnmzde bata akll telefonlar olmak zere, tketici elektronii dnyasnda televizyon,
setst-kutu, DSL modem, uydu alc, gvenlik duvar, a depolama birimleri, el terminali,
kontrol panel birimleri, navigasyon cihazlar vb. pek ok farkl alanda kullanlmaktadr.

Gml Sistemlerdeki Kullanm

Gml Linux

Gelitirme Sreci ve Versiyonlar


Linux ekirdeinin gelitirme sreci tamamen gnll eforlara dayanmaktadr. Bu sebeple
ticari dnyann aksine sk tanmlanm yol haritalar (roadmap) veya her X ayda bir
kartlmas beklenen srm hedefleri bulunmaz.
Bunun yerine teknik olarak izlenecek rehberler tariflenmi olup bu erevede proje her
trden katkya srekli ak durumdadr. Elbette baz nemli gelitirmelerin geni bir gelitirici
kitlesiyle tartlmas, belli bal kararlar alnmas ve bazen bu kararlar neticesinde hatr
saylr oranda yapsal deiikliklere gidildii de olmaktadr.

Gelitirme Modeli
Yeni versiyonlar gnmzde halen bizzat Torvalds tarafndan kartlmaktadr. Torvalds
gnderilen yeni kodlar ve eitli hatalara ilikin yamalar bir araya getirerek srm
oluturur ve test sreleri balar. Bu noktadan sonra ortalama 10 hafta ierisinde yeni
versiyon duyurulur. Bu ekildeki kernel versiyonlar vanilla veya mainline eklinde anlr.
Baz Linux datmlar dorudan vanilla kernel versiyonunu kullanrken, Debian, RedHat gibi
baz datmlar ise eitli ek srcler, yamalar ve zellikleri ieren ayr bir kernel versiyonu
kullanrlar. Bu yntemi izleyen datmlarda kernel versiyonu ok sk gncellenmez, ou
zaman datmn bir sonraki versiyonu kana kadar ayn kernel versiyonu kullanlr (rnek
olarak Debian Wheezy versiyonunda kernel 3.2 kullanlrken Debian Jessie versiyonunda
kernel 3.16 kullanlmaktadr). Bununla birlikte yeni kernel versiyonlarnda dzeltilen nemli
bir gvenlik a veya fonksiyonel dzenleme olursa, ilgili datmlarn kernel paketleme
ekipleri tarafndan bu zellikler datmla birlikte verilen kernel versiyonuna backport edilir.

Kaynak Kod Ynetim Sistemi


Linux projesi gibi byk bir kaynak kod kmesi iin kaynak kod ynetim sistemi de byk
nem tamaktadr.
Linus Torvalds, subversion, cvs gibi merkezi yapdaki zmlere kar hep mesafeli
olmutur. Merkezi yapdaki zmler birbiriyle yakn irtibat halinde alma imkan olan ve az
sayda gelitiriciden oluan projeler iin kabul edilebilir olmakla birlikte, Linux projesindeki
gelitirme modelinde ok dertler amaktadr.
2002 ylnda Torvalds nemli bir karar alarak, Linux kernel projesini teknik zellikleri
asndan kendisini ok tatmin eden Bitkeeper platformu zerinden ynetmeye karar verdi.
Gelitirme Sreci ve Versiyonlar

10

Gml Linux

Bitkeeper zamannn tesinde, datk bir kaynak kod ynetim sistemi ve pek ok yeni zellik
sunuyordu ancak cretsiz bir yazlm deildi ve kaynak kodu kapalyd. Bununla birlikte Linux
projesine bedelsiz olarak hizmet veriyorlard.
Linux gibi bir projenin kapal kodlu bir kaynak kod ynetim sistemi zerinden ynetilmesi
zamannda epey tartmalara yol amtr.
2005 ylnda Andrew Tridgell Bitkeeper uygulama protokoln reverse-engineering yoluyla
zmeye alt. Buradaki amac Bitkeeper ile entegre alabilecek aralar retmekti.
Andrew Tridgell reverse-engineering konusunda ok baarl bir aratrmacyd ve zellikle
Microsoft Windows alarndaki dosya paylam iin kullanlan Server Message Block
protokoln benzeri yntemlerle zmesiyle tannyordu. Ayn zamanda nemli Linux
servislerinden Samba'nn yan sra rsync, talloc gibi projeleri gelitirmiti.
Andrew'in bu almas Bitkeeper'n sahibi olan firmann tepkisini ekti ve Linux projesi iin
verilen cretsiz lisans iptal ettiler.
Buna cevaben Linus Torvalds kollar svayp datk bir kaynak kod ynetim sisteminin
gelitirmesine balad. Aradan sadece 2 ay getikten sonra, bugn en ok kullanlan datk
kaynak kod ynetim sistemi olan Git ortaya km ve Linux kernel kaynak kodlar iin hizmet
vermeye balamt.
Kiisel olarak Git projesini neredeyse Linux kadar nemli buluyorum. Bugn nasl ki bir
browser yazmak iletim sistemi yazmaktan ou zaman daha zor ise, Git'in sahip
olduu fonksiyonlar dnldnde Torvalds'n yapt en nemli ve karmak ilerden
biri olduunu syleyebiliriz.

Gelitirme Sreci ve Versiyonlar

11

Gml Linux

Kod Szdizim Rehberi


Linux ekirdek kaynak kodu zerinde gelitirmeler yapmak istiyorsanz,
Documentation/CodingStyle dosyasnda yer alan ynergelerin takip edilmesinde fayda vardr.

Milyonlarca satrdan oluan bu byk yazlm ierisinde bakalaryla birlikte alma


yapabilmek iin genel bir ynergenin takip edilmesi, ekirdek gelitiricilerinin hayatn
kolaylatrr.
Bu noktada Linus Torvalds'a kulak verelim:
Coding style is very personal, and I won't force my views on anybody, but this is what
goes for anything that I have to be able to maintain, and I'd prefer it for most other
things too. Please at least consider the points made here.
First off, I'd suggest printing out a copy of the GNU coding standards, and NOT read it.
Burn them, it's a great symbolic gesture.
Linus zetle kod szdizim tercihlerinin kiiye gre deieceini ama sreci ynetilebilir klma
adna bir eyler yaplmas gerekliliinden bahsediyor. Devamnda da bunu destekler
biimde, GNU Szdizim Rehberi dokmannn ktsn alp okumadan yakmamz salk
veriyor.

Girinti ve Hizalama
TAB iin 8 boluk karakteri kullanlr. Gemite bunu 4'e hatta 2'ye indirmek zerine eitli
tartmalar dnd. Ancak Torvalds bu tartmalar saysn 3 olarak almak
isteyenlerdekilere benzetiyor ve faydasz buluyor.
8 karakter gibi balangta fazla gibi grnen boluk says, gnde 20 saat ekirdek kodu
inceleyen biri iin bir bloun nerede balayp nerede bittiini kolay gstermesi asndan
nemlidir.
8 karakterlik TAB kullanm sonucudan kodun ok fazla sa tarafa doru ilerledii iin 80
karakterlik konsol ekrannda okunmay zorlatrdndan ikayet edenlere Torvalds, zaten 3
seviyeden fazla girinti yapmanz gerektiyse bir eyleri yanl yapyorsunuz demektir, en iyisi
oturup kodu dzeltin eklinde neride bulunuyor.
Tahmin edebileceiniz zere ekirdek kodu ierisinde 3 seviyeden fazla girintiye sahip olan
pek ok kod bulunmaktadr. Ancak bu boyuttaki bir yazlm projesi iin girinti ve blok
kullanmnn grece minimum dzeyde tutulduunu syleyebiliriz. Torvalds ile ters
dmemek iin zellikle yeni balayanlarn sz dinlemesinde fayda var.

Kod Szdizim Rehberi

12

Gml Linux

Kvrk Parantez
Kvrk parantezlerin kullanmnda Kernighan & Ritchie metodu tercih edilmitir.
Fonksiyon ierisinde kvrk parantez koullu ifadenin hemen bitiminde alp, blok sonunda
ayr bir satrda kapatlr:
if (x == condition) {
// code here
}

Fonksiyon tanmlarnda ise kvrk parantez fonksiyon tanmn takip eden satrda alp,
fonksiyon bitiminde ayr bir satrda kapatlr:
int my_super_function(int a, int b)
{
// code here
}

do .. while dnglerinde aadaki yap kullanlr:


do {
// code here
} while (x == y);

if .. else deyimlerinde aadaki yap kullanlr:


if (x < y) {
...
} else if (x > y) {
...
} else {
...
}

simlendirme Kurallar
C dili genel olarak Spartan Programlama mant etrafnda bir kullanm kltr
oluturmutur. Minimalist, az yer kaplayan ama halen daha byk oranda anlalabilir bir kod
yazm tercih edilir.

Kod Szdizim Rehberi

13

Gml Linux

rnein bir Pascal programcsnn ThisVariableIsATemporaryCounter eklinde isimlendirdii


bir deikenin C programcs tarafndan basite tmp eklinde isimlendirileceini tahmin
edebiliriz: yazmas kolay, okunurluu da tamamen ldrmyor, byk oranda anlalyor.
Bununla birlikte global deikenlerde aklayc bir isim kullanmas art koulmudur. Genel
olarak global deikenlerin sadece ve sadece zaruri olduunda kullanlmas ve
kullanldnda derdini net bir ekilde anlatabilecek bir isimlendirme yaplmas istenmektedir.
Fonksiyon isimlendirmelerinde de ilevini aka ifade eden bir yap kullanlmas istenir.
rnein aktif olan kullanclarn saysn bulan bir fonksiyon iin cntuser() gibi bir isim
kabul edilmez, bunun yerine count_active_users() gibi bir isim kullanlmaldr.
Deiken ve fonksiyon isimlendirmelerinde Macar Notasyonu kullanm kesinlikle istenmez.
Derleyici zaten deiken veya fonksiyonun tipini bildiine gre, bu ekildeki kullanm kodu
okuyan beyinlere hasar vermek dnda bir fayda vermeyecektir. Torvalds bu noktada
Microsoft platformlarnda bu kadar hata olmasna amamal eklinde dnyor. Katlmak
mmkn, bu notasyonu literatrden karmak ok yerinde olurdu.
Yerel deikenlerin de ksa ve tam yerinde kullanlmas istenir. rnein bir dng ierisinde
saya tutmanz gerekiyorsa, bunun iin i ismini kullann. loop_counter eklinde aklayc
bir isim fazladan pek bir ey kazandrmayacaktr.

Typedef Kullanm
Bu konudaki kural basit: ok istisnai bir durum olmadka typedef kullanmayn.
vps_t a;

eklindeki bir tanm aklayc deil. Onun yerine


struct virtual_container a;

eklindeki gibi, struct anahtar kelimesi ile birlikte daha aklayc yap ismini kullann.
Genel bir kural olarak, elemanlarna erimek iin accessor metodlar kullanmanz gereken
opak veri tiplerinin dnda typedef kullanmndan kann.

Fonksiyonlar

Kod Szdizim Rehberi

14

Gml Linux

Fonksiyonlar sadece tek bir ii iyi yapacak ekilde ve ksa olmaldr. Ksalktan kast,
80x24'lk ANSI konsol ekrann baz aldmzda bir fonksiyonun maksimum 2 ekran boyutu
kadar yer kaplamas gerektiidir.
Eer fonksiyon ierisinde yaplan i basit ve temiz olmasna ramen, rnein bir
switch..case blou ierisinde ok sayda deeri kontrol etmesi gerekiyorsa ve bu nedenle

2 ekran snrn ayorsa, bu durum ho karlanr, sorun edilmez.


Fonksiyonlarn deerlendirilmesindeki bir dier kriter de yerel deiken kullanmdr.
Maksimum 5-10 arasnda yerel deiken kullanm nerilmektedir. nsan beyni genelde 7
farkl eyi takip edebilir. Bu saylarn almas durumunda bir eyleri yanl yaptnz
dnmeniz, yeni bir tasarm yapmanz veya mevcut fonksiyonu, yardmc ek fonksiyonlara
blmeniz beklenir.
Fonksiyonlarn bitiminde 1 adet bo satr brakmanz istenmektedir. Bylece gzle daha
kolay takip edilebilecektir. Ancak bu durumun istisnas olarak, eer fonksiyonunuz kernel
ierisinde baka yerlerden de kullanlaca iin export edilecekse, ilgili EXPORT makrosunu
hemen fonksiyonun bitiminde tanmlamanz ve sonrasnda bo satr brakmanz
beklenmektedir:
int system_is_up(void)
{
return system_state == SYSTEM_RUNNING;
}
EXPORT_SYMBOL(system_is_up);

Ek olarak balk dosyalarnda fonksiyonlarnz tanmlarken okunabilirlii artrmak iin,


parametre blounda sadece deikene ait veri tipini deil, deiken ismini de belirtmeniz
beklenir.

Goto Kullanm
Kernel kodu ile urarken yerinde goto kullanm okunabilirlii ve verimlilii artrr.
Bununla birlikte etiket isimlendirmelerine zen gstermeniz beklenir. GW-BASIC
alkanlklarndan gelen err1: , err2: gibi etiketler kullanmamalsnz. Onun yerine goto
sonrasnda ne olacan ve nereyi etkilediini net bir ekilde belirtmeniz tavsiye edilmektedir.
rnein out_buffer: eklindeki bir etiket, goto ilemi sonras fonksiyondan klacan ve
buffer ile ilgil olduunu gstermektedir.

Kod Szdizim Rehberi

15

Gml Linux

int fun(int a)
{
int result = 0;
char *buffer;
buffer = kmalloc(SIZE, GFP_KERNEL);
if (!buffer)
return -ENOMEM;
if (condition1) {
while (loop1) {
...
}
result = 1;
goto out_buffer;
}
...
out_buffer:
kfree(buffer);
return result;
}

Yorum Satrlar
Yorum satrlarn kullanmak gzeldir ama fazla kullanldnda tehlikeli olabilir. Genel prensip
olarak yorum satrlarnda fonksiyonunuzun nasl altn deil, basite ne yaptn
anlatmanz yeterlidir.
Yorum satrlar fonksiyonun tanmnn hemen zerinde yer almal, fonksiyon ierisinde
yorumlara yer verilmemelidir.
Yorum satrlar iin Linux kernel kodunda C89 /* ... */ sitili kullanlr. Tek satrlk C99 stili
// ... yorumlara izin verilmez.

Fonksiyon balangcndaki rnek bir yorum blm u ekilde olabilir:


/*
* This is the preferred style for multi-line
* comments in the Linux kernel source code.
* Please use it consistently.
*
* Description: A column of asterisks on the left side,
* with beginning and ending almost-blank lines.
*/

Kod Szdizim Rehberi

16

Gml Linux

Kconfig Konfigrasyon Dosyalar


Kconfig konfigrasyon dosyalarndaki szdizim kurallar biraz farkldr.
config anahtar kelimesi altndaki satrlar TAB ile girinti yaplarak yazlr. help anahtar

kelimesini takip eden yardm satrlar ise buna ek olarak, 2 adet ek boluk kullanlarak
yazlmaktadr:
config NET_FC
bool "Fibre Channel driver support"
depends on SCSI && PCI
help
Fibre Channel is a high speed serial protocol mainly used to connect
large storage devices to the computer; it is compatible with and
intended to replace SCSI.

Kod Szdizim Rehberi

17

Gml Linux

Konfigrasyon Sreci ve Kbuild/Kconfig


Sistemi
Konfigrasyon srecinin amac, derleme ilemi sonrasnda oluacak olan kernel imajnn
sahip olaca zelliklerin belirlenmesidir. Bu ilem tamamlandktan sonra, belirlenen
zellikler dorultusunda derleme ilemi yrtlebilir.

Konfigrasyon
Konfigrasyon sreci olduka zaman alc bir ilemdir. Derlenecek olan kernel imajnn sahip
olaca zellikleri tek tek semeye almak saatlerce srebilir. Eer karmza soru olarak
kartlan seeneklerin pek ou hakknda n bilgimiz yoksa -ki ounlukla yle olacaktr-,
seenekler hakknda ek bilgi alma ve karar verme srecini de hesabmza eklediimizde bu
sre gnlerce srebilir.
Elbette konfigrasyon iin bir ka gn zaman ayrmayacaz ancak Gml Linux veya
genel olarak Linux alannda bilginizi bir seviye daha ileriye tamann yollarndan birinin, bu
srece geni bir zaman ayrp kernel ierisindeki teknolojileri incelemek ve ilgili dokmanlar
ek referanslaryla birlikte okumaktan getiini unutmayn.
Konfigrasyon ileminin sonucunda .config adnda bir adet dosya retilecektir. Dolaysyla
eer kullanacanz sistem iin daha nceden retilmi bir konfigrasyon dosyas var ise
onu baz alarak veya dorudan kullanarak da ilem yapabilirsiniz.
zellikle gml sistemler sz konusu olduunda kullanacanz board iin retici tarafndan
nceden hazrlanm bir konfigrasyon dosyas genellikle bulunur. Bu konfigrasyon
dosyasn kullanarak board reticinizin salad veya nerdii kernel kaynak kodlarn
derlediinizde, kullanacanz board ile uyumlu bir kernel imaj kmasn beklersiniz.
Hazr bir konfigrasyon dosyas gelmi olsa dahi, bu dosyay baz alarak konfigrasyon
srecinin zerinden geilmesi ve konfigrasyon dosyasnn biraz daha iyiletirilmesi nerilir.
reticiden gelen konfigrasyon dosyalar genellikle rn kullanacanz senaryoda esasen
ihtiya duymayacanz pek ok bileene dair destei de ierir. Bu dosyay iyiletirmeye
almak hem rn daha iyi tanmanz hem de daha kk bir kernel imaj elde etmenizi
salayacaktr.

Kbuild / Kconfig Sistemi


Konfigrasyon Sreci ve Kbuild Sistemi

18

Gml Linux

700 MB'a yaklaan kaynak kod bykl ve onbinlerce derleme seenei opsiyonu, Linux
kernel derleme srecinin ynetimine dair de ek bir sistem gelitirilmesi ihtiyacn
dourmutur.
Kbuild sistemi ve beraberindeki Kconfig dili bu amala gelitirilmitir. Konfigrasyon
srecine genel olarak baktmzda, ok sayda seenek ve birbirlerine olan bamllk
kurallarndan oluan bir veritaban ierisinden, kendi iinde tutarl bir alt kme oluturma
ilemi olarak grebiliriz.
Aada bir ka seenek kmesine dair hiyerari gsterilmektedir:
+- Code maturity level options
| +- Prompt for development and/or incomplete code/drivers
+- General setup
| +- Networking support
| +- System V IPC
| +- BSD Process Accounting
| +- Sysctl support
+- Loadable module support
| +- Enable loadable module support
| +- Set version information on all module symbols
| +- Kernel module loader
+- ...

rnekteki her bir eleman, opsiyonel olarak bamllk kurallar tanmlam olabilir. rnein
PCI veriyolu zerinde alacak bir ethernet kart doal olarak PCI Veriyolu Destei'ne
baml olduundan, bu ekilde bir bamllk kuralnn tanmlanmas halinde, PCI destei
seilmediinde konfigrasyon srecinin ilerleyen aamalarnda ilgili ethernet kartlarnn
karmza bir seenek olarak gelmemesi gerekir. Eer sre bu ekilde ilemez ise, birbiriyle
elien konfigrasyon sembollerini sememiz iten bile deildir.
Bamllk kurallarn doru biimde tm sistem genelinde uyguladmzda, bu kadar geni
bir seim kmesi ierisinden her zaman anlaml bir kme oluturma imkanna sahip oluruz.
Kconfig dili olduka basittir ve ncesinde ok fazla bilgi sahibi olmasanz dahi, yeterince
rnek ieren bir Kconfig dosyasna bakldnda kullanm kendiliinden anlalabilir.
Kbuild sistemini anlatan dokmanlara, kernel kaynak kodu altnda
Documentation/kbuild dizininde eriebilirsiniz.

rnek Kconfig Dosyas


Ksa bir rnekle balamak iin kernel kaynak kodu ierisindeki drivers/android/Kconfig
dosyasn inceleyelim:

Konfigrasyon Sreci ve Kbuild Sistemi

19

Gml Linux

menu "Android"
config ANDROID
bool "Android Drivers"
---help-- Enable support for various drivers needed on the Android platform
if ANDROID
config ANDROID_BINDER_IPC
bool "Android Binder IPC Driver"
depends on MMU
default n
---help-- Binder is used in Android for both communication between processes,
and remote method invocation.
This means one Android process can call a method/routine in another
Android process, using Binder to identify, invoke and pass arguments
between said processes.
config ANDROID_BINDER_IPC_32BIT
bool
depends on !64BIT && ANDROID_BINDER_IPC
default y
---help-- The Binder API has been changed to support both 32 and 64bit
applications in a mixed environment.
Enable this to support an old 32-bit Android user-space (v4.4 and
earlier).
Note that enabling this will break newer Android user-space.
endif # if ANDROID
endmenu

Dosya ncelikle bir menu tanmyla balyor. Bu sayede ileride karmza ismi "Android" olan
bir men kacan anlyoruz.
Sonraki admda config anahtar kelimesi ile ANDROID sembol tanmlanm. Semboln tipi
bool olarak belirtildiinde var/yok eklinde ikili bir seim ierdiini anlyoruz. Semboln

tipinden sonra gelen aklama satrnda ise ilgili semboln hangi metinle karmza
kacan gstermektedir: Android Drivers
Hemen altnda ---help--- ile balayan blmde tahmin edebileceiniz zere, bu sembolle
ilgili yardm alnmak istendiinde gsterilecek olan metin yer almaktadr.

Konfigrasyon Sreci ve Kbuild Sistemi

20

Gml Linux

Sonrasnda dosyann geri kalann bir if ANDROID blou ierisine alndn grmekteyiz.
Bunun anlam eer st blmde tanmlanan bool tipindeki ANDROID sembol seilirse bu
konfigrasyon seeneklerinin aktif olaca ve kullancya gsterilecei, aksi takdirde bu
seeneklerin hi gsterilmeyeceidir.
Bir sonraki sembolmz gene bool veri tipinde ANDROID_BINDER_IPC eklindedir. Bu
semboln depends on anahtar kelimesi kullanlarak MMU sembolne baml olduu
belirtilmitir. Dolaysyla konfigrasyon srecinin dier admlarnda MMU sembol seilmedi
ise bu zellik de seilemeyecektir. Ek olarak default anahtar kelimesiyle ntanml
deerinin hayr anlamnda n eklinde olduu belirtilmitir.
Son sembolmz gene bool tipinde ANDROID_BINDER_IPC_32BIT 'dir. Bu sembol iin
ntanml deer evet anlamnda y olarak verilmitir. Bununla birlikte semboln
seilebilmesi iin verilen bamllk kurallarnda, mimarinin 64 bit olamayaca ( !64BIT ) ve
ANDROID_BINDER_IPC sembolnn de seilmi olmas artlarnn ayn anda salanmas

istenmitir.
rnek dosyamzn son ksmlarnda alan if blounun endif ile, en bata alan menu
blounun ise endmenu ile kapatldn grmekteyiz.
Aadaki rneklerde bu men iin 64bit aktif iken ANDROID sembolnn deerleri iin
oluan ktlar grebilirsiniz:

ANDROID sembol seili deilken

Konfigrasyon Sreci ve Kbuild Sistemi

21

Gml Linux

ANDROID sembol seili durumdayken

Kconfig Sembol Tipleri


Yukarda Kconfig sistematii ierisinde kullanabildiimiz bool tipini rnekle grmtk.
Kconfig ierisinde kullanlabilecek tiplerin tamam ise aadaki tabloda yer almaktadr.
Sembol_Tipi

Aklama

bool

Evet/Hayr trnden boolean seim imkan verir

tristate

bool tipine 3. bir durumun daha eklenmesiyle bir zelliin modl


olarak derlenebilmesi iin gereken seimin de yaplabilmesine imkan
verir. Bu sayede rnein FAT dosya sistemi destei iin hayr (n), evet
(y) ve modl (m) eklinde 3 alternatiften birinin belirtilebilmesi mmkn
olur. En ok kullanlan sembol tipi budur.

string

Deer olarak herhangi bir metin alr

hex

16'lk dzende nmerik veri alr

int

10'luk dzende nmerik veri alr

Nmerik sembol tipleri ayrca opsiyonel olarak bir aralk belirtilmesine olanak veren range
deyimine de sahiptir. Aadaki rnekte PM_WAKELOCKS_LIMIT sembolnn int tipinde
tanmland, ntanml deerinin 100 ve geerli deer aralnn 0 - 100000 arasnda olduu
belirtilmektedir.

Konfigrasyon Sreci ve Kbuild Sistemi

22

Gml Linux

config PM_WAKELOCKS_LIMIT
int "Maximum number of user space wakeup sources (0 = no limit)"
range 0 100000
default 100
depends on PM_WAKELOCKS

Kconfig dosyalarnda girinti seviyeleri (indentation) nemlidir, mevcut rneklere

baktnzda bunu kolaylkla anlayabilirsiniz. Ana konumuzdan uzaklamamak adna dier


detaylara girmeyip burada sonlandryoruz.
Not: Kbuild ve Kconfig sistemi zel olarak Linux kernel projesi iin gelitirilmitir. Ancak
eer sizin de birbirini etkileyen bileenler arasnda seim yapmak suretiyle derleme
yapmanz gereken byk bir projeniz varsa, bu sistemi aynen kullanabilirsiniz. Keza
busybox gibi eitli projelerde de Kbuild sistemi kullanlmaktadr.

Konfigrasyon Dosyas Format


retmeye alacamz .config dosyasnn format aadaki gibidir:
...
# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
CONFIG_DVB_CORE=m
CONFIG_DVB_NET=y
CONFIG_TTPCI_EEPROM=m
CONFIG_DVB_MAX_ADAPTERS=8
CONFIG_DVB_DYNAMIC_MINORS=y
...

Yukarda grlen sembol isimleri, Kconfig sistemi ierisindeki sembollerin nne CONFIG_
neki getirilerek oluturulur.
Dosya ierisinde 4 farkl trde satr olduunu greceiz. Bunlar:
Yorum Satrlar: Diyez karakteri ile balayan satrlar yorum satr olarak nitelenir ve
deerlendirmeye alnmazlar.
=y le Biten Satrlar: lgili semboln niteledii bileenlerin, oluacak nihai kernel imaj
ierisinde yer almasnn istendiini belirtir.
=m le Biten Satrlar: lgili semboln niteledii bileenlerin, oluacak nihai kernel imaj
ierisine konulmamasn ancak ayr bir modl olarak derlenmesinin istendiini belirtir.
..XXX=8, YYY=Z eklindeki Satrlar: Bu ekildeki satrlar genel olarak derleme
srecinde baz parametrik ilemlerin yaplabilmesine olanak salamak amacyla
kullanlr, rnein yukardaki rneimizde maksimum DVB adaptr kart saysnn 8 ile

Konfigrasyon Sreci ve Kbuild Sistemi

23

Gml Linux

snrlandrldn grmekteyiz. Burada tanml deer Makefile sistematikleri zerinden


derleme srecine doru ekilde aktarldnda, ilgili DVB kaynak kodlar derlenirken bu
limit dikkate alnacaktr.

Konfigrasyon Aralar
Konfigrasyon dosyasn elle oluturmak pratikte imkansz ve zaten gereksizdir. Kconfig
dosyalarn analiz edip bize seim yapma noktasnda yardmc olacak eitli aralar
mevcuttur. Bu aralar da kaynak kod eklinde Linux kernel projesi ierisindeki
scripts/kconfig dizininde yer alr. Kullanlabilmeleri iin ncelikle derlenmeleri gereklidir.

Bu dizinde birden fazla yardmc ara bulunur. Her biri ayn ii hedefleyen, farkl arayzlere
sahip aralardr.
Yntem

Aklama

htiya Duyulan Ktphaneler

xconfig

Qt-4 backend

qt4-dev

gconfig

Gtk-2 backend

gtk-2-dev, libglade-2-dev

nconfig

Ncurses backend

libncurses-dev

menuconfig

curses backend

libncurses-dev

Konfigrasyona balamak iin bu aralardan birini kullanabilirsiniz. En sk kullanlan


menuconfig aracn aadaki ekilde balatabilirsiniz:
$ make menuconfig

Konfigrasyon Sreci ve Kbuild Sistemi

24

Gml Linux

menuconfig arac ierisinde yn tular ile gezebilir, Help blmnden seili balk
hakknda yardm alabilirsiniz. Belirli bir sembol iin arama yapmak istediinizde / ksayolunu
kullanabilirsiniz (vi editrndeki ile ayn ekilde)
Konfigrasyon ilemi tamamlandktan sonra tm menlerden k yapabilirsiniz. Uygulama
sonlanmadan hemen nce yaplan konfigrasyonu kaydetmek isteyip istemediiniz
sorulacaktr.

Konfigrasyon Sreci ve Kbuild Sistemi

25

Gml Linux

Derleme ve apraz Derleme


Konfigrasyon sreci tamamlandktan ve herhangi bir yolla .config dosyas kernel kaynak
kodlarnn bulunduu ana dizinde oluturulduktan sonra derleme aamasna geilir.
Derleme ilemi sonucunda ilemin yapld sistem iin alacak native kernel imaj elde
edilebilecei gibi, apraz derleme (cross-compiling) metoduyla farkl bir mimari iin imaj
retimi de salanabilir.
Normal derleme ilemi iin make komutunu vermeniz yeterlidir. ncelikle ana dizinde yer
alan Makefile dosyas okunacak ve .config dosyasnda yaplan seimler export edilerek
derleme srecinin ilerleyen aamalarnda kullanlabilir olmas salanacaktr.
Kernel imaj sktrlmadnda biraz byke olduundan her zaman sktrlm formda
kullanlr. Bunun iin kernel imaj ierisinde kendi kendini decompress edebilecek bir rutin
eklenir ve kernel imaj sktrlm haliyle kullanlr.
Bu sreci otomatik hale getirmek iin PC mimarisi iin yaplan derlemeler iin bzImage
hedefi kullanlmaktadr:
$ make bzImage

Komut iletilirken build ileminin ktlar aadaki gibi olacaktr:


...
CC arch/arm/kernel/topology.o
CC arch/arm/kernel/io.o
AS arch/arm/kernel/debug.o
CC arch/arm/kernel/early_printk.o
LD arch/arm/kernel/built-in.o
AS arch/arm/kernel/head.o
LDS arch/arm/kernel/vmlinux.lds
...

Bu zet kt yerine altrlan derleyici, linker vb. tm ald parametreleri grmek


isterseniz, make komutunun sonuna V=1 parametresini ekleyebilirsiniz (verbosity):

Derleme ve apraz Derleme

26

Gml Linux

$ make bzImage V=1


...

gcc -Wp,-MD,arch/x86/crypto/.aes-x86_64-asm_64.o.d -nostdinc -isystem /usr/lib/gcc/x86_64-linux-gnu/


-I./arch/x86/include -Iarch/x86/include/generated/uapi -Iarch/x86/include/generated
-Iinclude -I./arch/x86/include/uapi -Iarch/x86/include/generated/uapi
-I./include/uapi -Iinclude/generated/uapi -include ./include/linux/kconfig.h
-D__KERNEL__ -D__ASSEMBLY__ -m64 -DCONFIG_X86_X32_ABI -DCONFIG_AS_CFI=1
-DCONFIG_AS_CFI_SIGNAL_FRAME=1 -DCONFIG_AS_CFI_SECTIONS=1 -DCONFIG_AS_FXSAVEQ=1
-DCONFIG_AS_CRC32=1 -DCONFIG_AS_AVX=1 -DCONFIG_AS_AVX2=1 -Wa,-gdwarf-2 -mfentry
-DCC_USING_FENTRY -DMODULE -c -o arch/x86/crypto/aes-x86_64-asm_64.o
arch/x86/crypto/aes-x86_64-asm_64.S
...

Derleme ilemi bittiinde bzImage dosyas oluur. Bu dosya vmlinux kernel imajnn
sktrlm halini ve decompress rutinini ierir.
Derleme ilemi ktsnn son blm aadaki gibi bir kt retecektir:
LINK vmlinux
LD vmlinux.o
MODPOST vmlinux.o
GEN .version
CHK include/generated/compile.h
UPD include/generated/compile.h
CC init/version.o
LD init/built-in.o
KSYM .tmp_kallsyms1.o
KSYM .tmp_kallsyms2.o
LD vmlinux
SORTEX vmlinux
SYSMAP System.map
CC arch/x86/boot/a20.o
AS arch/x86/boot/bioscall.o
CC arch/x86/boot/cmdline.o
AS arch/x86/boot/copy.o
HOSTCC arch/x86/boot/mkcpustr
CC arch/x86/boot/cpuflags.o
CC arch/x86/boot/cpucheck.o
CC arch/x86/boot/early_serial_console.o
CC arch/x86/boot/edd.o
VOFFSET arch/x86/boot/voffset.h
CC arch/x86/boot/main.o
CC arch/x86/boot/mca.o
LDS arch/x86/boot/compressed/vmlinux.lds
AS arch/x86/boot/compressed/head_64.o
CC arch/x86/boot/compressed/misc.o
CC arch/x86/boot/memory.o
CC arch/x86/boot/compressed/string.o
CC arch/x86/boot/compressed/cmdline.o
OBJCOPY arch/x86/boot/compressed/vmlinux.bin

Derleme ve apraz Derleme

27

Gml Linux

HOSTCC arch/x86/boot/compressed/mkpiggy
CC arch/x86/boot/compressed/cpuflags.o
CC arch/x86/boot/compressed/early_serial_console.o
CC arch/x86/boot/pm.o
AS arch/x86/boot/pmjump.o
CC arch/x86/boot/printf.o
CC arch/x86/boot/compressed/eboot.o
AS arch/x86/boot/compressed/efi_stub_64.o
CC arch/x86/boot/regs.o
CC arch/x86/boot/string.o
CC arch/x86/boot/tty.o
CC arch/x86/boot/video.o
CC arch/x86/boot/video-mode.o
CC arch/x86/boot/version.o
CC arch/x86/boot/video-vga.o
XZKERN arch/x86/boot/compressed/vmlinux.bin.xz
CC arch/x86/boot/video-vesa.o
CC arch/x86/boot/video-bios.o
HOSTCC arch/x86/boot/tools/build
CPUSTR arch/x86/boot/cpustr.h
CC arch/x86/boot/cpu.o
MKPIGGY arch/x86/boot/compressed/piggy.S
AS arch/x86/boot/compressed/piggy.o
LD arch/x86/boot/compressed/vmlinux
ZOFFSET arch/x86/boot/zoffset.h
OBJCOPY arch/x86/boot/vmlinux.bin
AS arch/x86/boot/header.o
LD arch/x86/boot/setup.elf
OBJCOPY arch/x86/boot/setup.bin
BUILD arch/x86/boot/bzImage
Setup is 17388 bytes (padded to 17408 bytes).
System is 3131 kB
CRC 43b226da
Kernel: arch/x86/boot/bzImage is ready (#1)

lem bitiminde kullanacamz kernel imaj dosyas arch/x86/boot dizini altnda oluur.
Dier mimariler iin derleme yaptmzda arch/<mimari>/boot dizini altnda
oluacaktr.
Derleme srecini ynettiimiz kernel ana dizininde ise vmlinux adnda bir dosya
olutuunda dikkat ediniz. Bu dosya kernel imajnn sktrlmam halidir:

Derleme ve apraz Derleme

28

Gml Linux

$ ls -lh vmlinux
-rwxr-xr-x 1 demirten demirten 120M May 16 07:58 vmlinux
$ file vmlinux
vmlinux: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked,
BuildID[sha1]=f6c3556c7b74f9b300b03275831a4b716d18ee9e, not stripped
$ ls -lh arch/x86/boot/bzImage
-rw-r--r-- 1 demirten demirten 3.1M May 16 07:58 arch/x86/boot/bzImage

Grld zere sktrlmam hali 120 MB iken, sktrlm hali 3.1 MB seviyelerindedir.

Kernel imaj retildikten sonra modllerin derlenmesi ve uygun dizin yaps ile sistemde
oluturulmas gerekir. Bu ilemler iin modules ve modules_install make hedefleri
kullanlr:
$ make modules
$ make modules_install

modules_install hedefi, modllere ait dizin yapsn ntanml olarak derlemenin yapld

sistemde, /lib/modules/<KERNEL-VERSION> dizini altnda oluturacaktr. Eer derlediimiz


kernel imajn kendi sistemimizde kullanmak istemiyorsak (apraz derleme vb.) modulleri
ayr bir dizine install etmemiz gerekir. Bunun iin INSTALL_MOD_PATH deikenini
aadaki gibi kullanmalsnz:
$ make modules_install INSTALL_MOD_PATH=/tmp/modules

Derleme ve apraz Derleme

29

Gml Linux

lem sonucunda tm modller /tmp/modules dizini altndaki dizin yaplar ierisinde


oluturulacaktr.

Paralel Derleme
Derleme sreci olduka cpu youn bir ilemdir. Ek bir parametre verilmemesi halinde sadece
tek bir cpu core kullanlr. Oysa kernel ierisindeki Makefile dosyalar paralel derlemeye
imkan verecek ekilde dzenlenmitir. Birden fazla cpu core var ise, bunlar maksimum
dzeyde kullanmak ve derleme srecini ok daha abuk sonulandrmak iin, paralel
derleme yntemini uygulayabilirsiniz. Bu yntemde ka adet paralel derleme sreci olacan
-j N parametresi ile verebilirsiniz.

Genel bir yaklam, sistemdeki tm kapasiteyi kullanmak istiyorsanz cpu core saysnn 2
kat kadar bir deer kullanmak ynndedir. Bunun sebebi derleme srecinde arada gcc
dnda da betik uygulamalar vb. altndan tam olarak cpu core says verildiinde atl
kalan bir kapasite olmasdr. 2 kat gibi bir deer verildiinde sistemin tm performansndan
faydalanabilirsiniz:
$ make bzImage -j 8

apraz Derleme

Derleme ve apraz Derleme

30

Gml Linux

Initramfs majnn Eklenmesi


Hazrlanyor...

Initramfs majnn Eklenmesi

31

Gml Linux

U-boot maj Haline Getirilmesi


Hazrlanyor...

U-boot maj Haline Getirilmesi

32

Gml Linux

Gml Sistemlerde Boot Ykleyiciler

Gml Sistemlerde Boot Ykleyiciler

33

Gml Linux

U-Boot
U-Boot (Universal Bootloader), ARM, MIPS ve x86 olmak zere birok mimariyi destekleyen,
ak kaynak kodlu bir nykleyici uygulamasdr. Genel olarak iletim sistemi ekirdeini
birincil bellee yklemekten ve uygun parametrelerle altrmaktan sorumludur.
U-Boot genellikle, al srecine kullancnn dahil olmasna imkan vermek iin, iletim
sistemini balatmadan nce, belli bir sre kullancnn bir tua basmasn beklemektedir. Bu
bekleme sresi, u-boot kaynak kodundan belirlenebildii gibi sonrasnda u-boot zerinden
de deitirilebilmektedir. Bekleme sresi iinde bir tua baslarak u-boot komut satrna
dlebilir.
u-boot bir takm evre deikenleri kullanmaktadr. Bu evre deikenleri kullanlarak uboot'un davran deitirilebilmektedir. nemli grdmz baz evre deikenleri ve
grevleri aadaki gibidir.
evre Deikeni

erii

bootcmd

Otomatik olarak altrlacak komut kmesi

bootargs

ekirdee geirilecek komut satr parametreleri

bootdelay

bootcmd ierii iletilmeden nce bekleme sresi

ipaddr

Cihaz IP deeri

serverip

Sunucu IP deeri

baudrate

Baudrate deeri

u-boot ayrca ok sayda komut barndrmaktadr. Yine nemli grdmz baz komutlar ve
grevleri aadaki gibidir.
Komut

Grevi

setenv

evre deikeni tanmlar veya deerini gnceller

saveenv

evre deikenlerinin deerlerini kalc hafzaya yazar

bootm

Bellekte verilen adresteki kodu iletir

fatload

DOS blmnden bellee dosya ykler

tftp

TFTP zerinden dosya ykler

printenv

evre deikenlerini listeler

U-boot

34

Gml Linux

Komut satrnda help yazarak tm komut listesini grebildiiniz gibi help [komut ad] eklinde
bir komut ile ilgili daha detayl bir bilgi de alabilirsiniz. mmc destei olan bir u-boot zerinden
aldmz yardm aadaki gibidir.
# help mmc
mmc - MMC sub system
Usage:
mmc read addr blk# cnt
mmc write addr blk# cnt
mmc erase blk# cnt
mmc rescan
mmc part - lists available partition on current mmc device
mmc dev [dev] [part] - show or set current mmc device [partition]
mmc list - lists available devices
mmc setdsr - set DSR register value

Not: u-boot'un barndrd komut kmesi, hedef karta gre deimektedir. rnein a
ve SD kart destei olan bir kart iin tftpboot ve fatload komutlarn barndrmasna
karn, bu zelliklerin olmamas durumunda bu komutlar da bulunmayabilir.
Not: u-boot evre deikenleri, u-boot komut satrndan deitirilebildii sonrasnda
Linux zerinden de deitirilebilmektedir.
imdi bir rnek zerinden u-boot kaynak kodunun nasl derlendiine ve kullanldna
bakalm.
rnek platform olarak, Board Spesifik Klavuzlar ksmnda incelediimiz, Olimex A20 kartn
kullanacaz. lk olarak bu kart ve ailesi iin zelletirilmi u-boot kaynak kodunu indirelim.
git clone https://github.com/linux-sunxi/u-boot-sunxi.git
cd u-boot-sunxi

arch dizininde birok mimari iin yazlm C ve sembolik makina kodlar bulunmaktadr.
# ls arch/

arc arm avr32 blackfin m68k microblaze mips nds32 nios2 openrisc powerpc sandbox sh spar

Projeyi derlemek iin ana dizinde bir Makefile dosyas bulunmaktadr. Bu makefile dosyas
ile nce projeyi doru ekilde konfigre etmeli ve ardndan u-boot kodunu derlemeliyiz.
Ana dizinde desteklenen kartlar gsteren boards.cfg adl bir dosya bulunmaktadr. Bu dosya
kartmza ilikin bir giri bulundurmaktadr.

U-boot

35

Gml Linux

# grep sunxi boards.cfg | awk '{print $7}' | grep A20-OLinuXino-Micro


A20-OLinuXino-Micro
A20-OLinuXino-Micro_FEL

u-boot kodunu konfigr etmek iin, makefile ieriindeki CROSS_COMPILE deikenine


uygun deer vermeli ve hedef platformumuzu belirtemeliyiz. Genel formu ve rneimiz iin
durum aadaki gibidir.
make CROSS_COMPILE=<apraz Derleyici nceki> <ngrlen Ayar dosyas veya fadesi>
make CROSS_COMPILE=arm-linux-gnueabihf- A20-OLinuXino-Micro_config

ounlukla u-boot kodlarnda configs dizini altnda hedef platforma ilikin ngrlen ayar
dosyas bulunmasna karn, burada incelediimiz rnek iin byle bir kullanm sz konusu
deildir.
Son aamada ise u-boot kodu aadaki gibi derlenebilir.
make CROSS_COMPILE=arm-linux-gnueabihf-

u-boot kaynak kodunda ayrca, bazen MLO olarak da isimlendirilen, daha kk bir
nykleyici olan SPL (Secondary Program Loader)'de bulunmaktadr. SPL, grev olarak,
retim aamasnda kodlanan ROM ykleyici ile u-boot arasnda bulunmaktadr.
Yukarda derlediimiz u-boot iin seri terminal zerinden aldmz al mesajlar aadaki
gibidir.
U-Boot 2014.04-10733-gea1ac32 (Feb 02 2015 - 12:05:05) Allwinner Technology
CPU: Allwinner A20 (SUN7I)
Board: A20-OLinuXino-Micro
I2C: ready
DRAM: 1 GiB
MMC: SUNXI SD/MMC: 0
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: emac
Hit any key to stop autoboot: 2

imdi ksaca bir u-boot kullanm senaryosuna bakalm. Bu aamada, ekirdee geirilecek
komut satr parametrelerini belirleyebilir, ekirdei tftp veya SD kart zerinden ekip cihaz
aabiliriz. tftp zerinden rnek bir kullanm aadaki gibidir.

U-boot

36

Gml Linux

setenv bootargs console=ttyS0,115200 init=/bin/sh root=/dev/mmcblk0p2 rootwait panic=10


setenv autoload no
dhcp
setenv serverip 172.16.2.136
tftp 0x48000000 uImage
bootm 0x48000000

bootm komutundan sonra, u-boot mesajlar aadaki gibidir.


bootm 0x48000000
## Booting kernel from Legacy Image at 48000000 ...
Image Name: Linux-3.4.103-00033-g9a1cd03
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4555464 Bytes = 4.3 MiB
Load Address: 40008000
Entry Point: 40008000
Verifying Checksum ... OK
Loading Kernel Image ... OK
Starting kernel ...

U-boot

37

Gml Linux

RedBoot
RedBoot (Red Hat Embedded Debug and Bootstrap firmware) eCos realtime iletim
sisteminde ve Intel XScale gibi baz ARM tabanl platformlarda youn olarak kullanlan bir
boot ykleyici uygulamasdr.
RedBoot kendine zg bir partition table yaps kullanr. Tablo bilgisini flash zerinde saklar.
Linux ekirdei ierisinde RedBoot Partition Table Parsing aktifletirildiinde RedBoot ile
ayn ekilde mantksal blmlendirme yaplm olur.
Son zamanlarda kullanm orannn azald gzlemlenmektedir.

RedBoot

38

Gml Linux

ARM Al Sreci
ARM mimarisinde al sreci aadaki sra ile gerekleir:
Boot ROM zerinden dahili kodun almas
Birinci harici boot ykleyicinin almas ( X-loader )
Daha gelimi ikinci boot ykleyicinin almas ( U-boot )
Linux kernel'n almaya balamas
Dahili Boot ROM adresi ilgili donanm iin sabit olacaktr. Buradaki kodun temel amac,
birinci harici boot ykleyici kodunu yklemektir
Bu noktada ou zaman donanm zerinde, birinci harici boot ykleyicinin hangi ortamdan
ykleneceine dair (seri port, NAND flash, SD kart vb.) boot konfigrasyon pin'leri salanr.

Boot Ykleyicinin Grevleri: Bellek


Sistemdeki bellek alanlarnn tespit edilmesi ve ilklendirilmesi Linux ekirdeinden nce boot
ykleyici uygulamas tarafndan yaplmaldr.
Bu ilem iin bir takm otomatik alglama rutinleri, zel algoritmalar veya ilgili donanm iin
sabit deerler bulunabilir, tamamen boot ykleyici uygulamann gelitirimine gre deiir.

Boot Ykleyicinin Grevleri: Kernel


Linux kernel imaj, boot ykleyici tarafndan bellee yklenmelidir.
Boot ykleyici uygulama ne kadar yetenekli ise, o kadar farkl ekilde Linux kernel imaj
yklenebilir. rnein, boot ykleyici uygulamada TCP ve HTTP protokol destekleniyorsa,
herhangi bir web sunucuda barndrlan kernel imaj da download edilip bellee aktarlabilir.
te yandan boot ykleyici uygulamann olabildiince kk ve basit olmas beklenir. TCP
gibi kompleks bir protokoln dahil edilmesi iyi bir fikir deildir.
Pratik kullanmda boot ykleyiciler genellikle kernel imajn NAND flash bellekten, SD Kart
zerinden, seri porttan, network zerindeki bir TFTP sunucudan veya USB disk zerinden
okurlar. Bu desteklerden bir veya birden fazlas kullandnz boot ykleyici ierisinde ayn
anda bulunabilir.

Boot Ykleyicinin Grevleri: Initial Ramdisk


ARM Mimarisinde Al Sreci

39

Gml Linux

Linux tabanl sistemde, iki aamal initrd al yntemi kullanlyor ise, initrd imajn
barndran dosyann da bulunduu ortamdan bellee yklenmesi boot ykleyici uygulamann
grevleri arasndadr.
Tpk Linux imajn yklerken olduu gibi, boot ykleyici uygulama ierisindeki destekler,
initrd imajnn yklenme opsiyonlarn da belirleyecektir
Olduka benzer konseptler olmasna ramen bu durum initramfs imajyla
kartrlmamaldr. Initramfs imaj doas itibariyle zaten kernel imajnn sonuna eklenmi
olduundan, ayrca yklenmesine ihtiya bulunmamaktadr. initrd imajnn ise boot
ykleyici tarafndan yklenip, yklendii adresin kernel tarafna bildirimi arttr.

Boot Ykleyicinin Grevleri: Kernel


Parametreleri
Boot ykleyicinin bir dier temel grevi, Linux ekirdeine parametrelerin geirilmesini
salamaktr. Bu ilem iin ATAGS sistematii kullanlr
Fiziksel bellein 0x100 offsetinden balayarak ATAGS veriyaplar yerletirilir. Balang
adresi ayn zamanda Linux imajn altrmaya balamadan nce R2 yazmacna
kaydedilecektir.
ATAG_CORE tipi ile balayp ATAG_NONE tipine kadar birbirini takip eden deerler kullanlr.

ATAGS Veri Tipleri

ARM Mimarisinde Al Sreci

40

Gml Linux

Tag

Deer

Aklama

ATAG_NONE

0x00000000

Tag listesinin sonunu gsterir

ATAG_CORE

0x54410001

Liste balangcn gsterir

ATAG_MEM

0x54410002

Bellek zerinde kullanlabilecek alanlar gsterir

ATAG_VIDEOTEXT

0x54410003

VGA metin konsoluyla ilgili parametreleri


gsterir

ATAG_RAMDISK

0x54410004

Ramdisk kullanmna ilikin parametreleri


gsterir

ATAG_INITRD2

0x54420005

Initrd imajnn nerede bulunacan gsterir

ATAG_SERIAL

0x54410006

64 bit board seri numarasn tutar

ATAG_REVISION

0x54410007

32 bit board versiyon numarasn tutar

ATAG_VIDEOLFB

0x54410008

Vesa frame buffer iin deerleri tutar

ATAG_CMDLINE

0x54410009

Kernel tarafna aktarlacak komut satr


argmanlarn tutar

ATAGS Veri Tipleri


ATAGS veri tipleri aadaki gibi balk ve veri alanlarndan olumaktadr
struct atag_header {
u32 size; /* legth of tag in words including this header */
u32 tag; /* tag value */
};
struct atag {
struct atag_header hdr;
union {
struct atag_core core;
struct atag_mem mem;
struct atag_videotext videotext;
struct atag_ramdisk ramdisk;
struct atag_initrd2 initrd2;
struct atag_serialnr serialnr;
struct atag_revision revision;
struct atag_videolfb videolfb;
struct atag_cmdline cmdline;
} u;
};

Geleneksel Boot Yntemi


ARM Mimarisinde Al Sreci

41

Gml Linux

Kernel 3.8 ve sonrasnda kullanlmaya balanan Device Tree modeliyle alanlarn dnda
kalan tm sistemler, geleneksel yntemle boot srecini gerekletirirler.
Bu yntemde, her board ailesi iin deil, her bir board iin zgn bir ID alnmas gereklidir.
Bu ID deeri ARM mimarisi iin Linux kernel tarafndaki ana sorumlu olan Russell King
zerinden kayt ettirilmelidir. Gncel listeye http://www.arm.linux.org.uk/developer/machines
adresinden ulaabilirsiniz. 2014 sonu itibariyle 4981 adet board kayd bulunmaktadr

Board Numarasnn ekirdee Aktarm


Bootloader uygulamasnn, zgn board numarasn R1 yazmacna gemesi zorunludur.
Linux ekirdei, boot srecinde bu yazmaca zgn board numarasnn yazldn varsayar
ve tm ak bu ekilde ilerler.
Linux ekirdeinin derlenmesi aamasnda da R1 yazmacndaki zgn makine
numarasyla ilgili donanm spesifik ksmlarn seilmi ve ekirdek ierisine dahil edilmi
olmas zorunludur. Aksi takdirde aadaki gibi bir hata mesaj alnacaktr:
Uncompressing Linux... done, booting the kernel.
Error: unrecognized/unsupported machine ID (r1 = 0x000007d9).
Available machine support:
ID (hex) NAME
00000af0 ti8168evm
Please check your kernel config and/or bootloader.

zet: Boot Sreci


1. Boot ROM zerinden dahili kod alr ve birinci boot ykleyici yklenir ( X-loader )
2. X-loader tarafndan ek ilklendirmeler yaplr ve daha gelikin ikincil boot ykleyici
yklenir ( U-boot )
3. Boot ykleyici tarafndan Linux ekirdei bulunduu ortamdan bellee aktarlr
4. Eer initrd imaj kullanlyorsa, ayn ekilde initrd imaj da bellee aktarlr
5. Sisteme ait zgn numara, R1 yazmacna yazlr
6. Initrd imajnn bellekteki yeri ve uzunluu, kernel al parametreleri vb. parametreler
iin fiziksel bellein balangcna yakn yerlerde ATAGS veri yaplar oluturulur

ARM Mimarisinde Al Sreci

42

Gml Linux

7.

ATAGS veri yapsnn balang adresi R2 yazmacna yazlr (Genellikle 0x100)

8. Bellekteki kernel imajndaki ilk makine kodu altrlr

Device Tree Yntemi


Device Tree ynteminde (detaylar iin ilgili konu baln inceleyiniz) al srecinde bir
miktar farkllk bulunmaktadr.
Bu modelde her bir board versionu iin zgn bir numara belirtmek yerine, her bir board
ailesi iin zgn bir Device Tree numaras bulunur.
Geleneksel modele oranla ok daha az numara kullanlr zira bir DT modeli ile bir ok farkl
board versiyonu adreslenebilir.
lgili DT veri yaps boot ykleyici tarafndan bellee aktarlr ve adresi R2 yazmacna yazlr
Bu yntemi desteklemeyen eski boot ykleyicileri iin Linux kernel ierisinde
CONFIG_ARM_APPENDED_DTB zellii kullanlarak DT veri yaps kernel imajnn sonuna

eklenebilir

ARM Mimarisinde Al Sreci

43

Gml Linux

Linux Al Sreci

Linux Al Sreci

44

Gml Linux

Kernel Al Sreci
Sistem Al

Kernel Bootstrap Sreci

Kernel Al Sreci

45

Gml Linux

Kernel Derleme leminde Son Admlar


...
LD vmlinux
SYSMAP System.map
SYSMAP .tmp_System.map
OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
AS arch/arm/boot/compressed/head.o
GZIP arch/arm/boot/compressed/piggy.gzip
AS arch/arm/boot/compressed/piggy.gzip.o
CC arch/arm/boot/compressed/misc.o
CC arch/arm/boot/compressed/decompress.o
AS arch/arm/boot/compressed/head_cpu.o
SHIPPED arch/arm/boot/compressed/lib1funcs.S
AS arch/arm/boot/compressed/lib1funcs.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
..

Kernel Bootstrap Kodu

Kernel Al Sreci

46

Gml Linux

head.o:
Bu blmde mimariye zgn obje kodlar bulunur. Boot ykleyici uygulama tarafndan
altrlmasna yneliktir.
head-cpu.o:
lemciye zg ilklendirme ilemlerine ait kodlar barndrr.
decompress.o:
Sktrlm formda bulunan kernel'i ama ilemlerini gerekletirir.
lib1funcs.o:
ARM mimarisi iin optimize edilmi blme ilemlerine dair kodlar ierir. VFP NEON

head.o Tarafndan Yaplan lemler


Mimari, ilemci ve makine/sistem tipinin belirlenmesi
Memory Management Unit konfigrasyonu ve virtual memory desteinin
etkinletirilmesi
init/main.c ierisindeki start_kernel fonksiyounun arlmas

start_kernel
asmlinkage void __init start_kernel(void)
{
char * command_line;
extern const struct kernel_param __start___param[], __stop___param[];
smp_setup_processor_id();
/*
* Need to run as early as possible, to initialize the
* lockdep hash:
*/
lockdep_init();
debug_objects_early_init();
/*
* Set up the the initial canary ASAP:
*/
boot_init_stack_canary();
cgroup_init_early();
local_irq_disable();

Kernel Al Sreci

47

Gml Linux

early_boot_irqs_disabled = true;
/*
* Interrupts are still disabled. Do necessary setups, then
* enable them
*/
tick_init();
boot_cpu_init();
page_address_init();
printk(KERN_NOTICE "%s", linux_banner);
setup_arch(&command_line);
mm_init_owner(&init_mm, &init_task);
mm_init_cpumask(&init_mm);
setup_command_line(command_line);
setup_nr_cpu_ids();
setup_per_cpu_areas();
smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */
build_all_zonelists(NULL);
page_alloc_init();
printk(KERN_NOTICE "Kernel command line: %s\n", boot_command_line);
parse_early_param();
parse_args("Booting kernel", static_command_line, __start___param,
__stop___param - __start___param,
&unknown_bootoption);
jump_label_init();
/*
* These use large bootmem allocations and must precede
* kmem_cache_init()
*/
setup_log_buf(0);
pidhash_init();
vfs_caches_init_early();
sort_main_extable();
trap_init();
mm_init();
/*
* Set up the scheduler prior starting any interrupts (such as the
* timer interrupt). Full topology setup happens at smp_init()
* time - but meanwhile we still have a functioning scheduler.
*/
sched_init();
/*
* Disable preemption - early bootup scheduling is extremely
* fragile until we cpu_idle() for the first time.
*/
preempt_disable();
if (!irqs_disabled()) {
printk(KERN_WARNING "start_kernel(): bug: interrupts were "

Kernel Al Sreci

48

Gml Linux

"enabled *very* early, fixing it\n");


local_irq_disable();
}
idr_init_cache();
perf_event_init();
rcu_init();
radix_tree_init();
/* init some links before init_ISA_irqs() */
early_irq_init();
init_IRQ();
prio_tree_init();
init_timers();
hrtimers_init();
softirq_init();
timekeeping_init();
time_init();
profile_init();
call_function_init();
if (!irqs_disabled())
printk(KERN_CRIT "start_kernel(): bug: interrupts were "
"enabled early\n");
early_boot_irqs_disabled = false;
local_irq_enable();
/* Interrupts are enabled now so all GFP allocations are safe. */
gfp_allowed_mask = __GFP_BITS_MASK;
kmem_cache_init_late();
/*
* HACK ALERT! This is early. We're enabling the console before
* we've done PCI setups etc, and console_init() must be aware of
* this. But we do want output early, in case something goes wrong.
*/
console_init();
if (panic_later)
panic(panic_later, panic_param);
lockdep_info();
/*
* Need to run this when irqs are enabled, because it wants
* to self-test [hard/soft]-irqs on/off lock inversion bugs
* too:
*/
locking_selftest();
#ifdef CONFIG_BLK_DEV_INITRD
if (initrd_start && !initrd_below_start_ok &&
page_to_pfn(virt_to_page((void *)initrd_start)) < min_low_pfn) {
printk(KERN_CRIT "initrd overwritten (0x%08lx < 0x%08lx) - "
"disabling it.\n",
page_to_pfn(virt_to_page((void *)initrd_start)),

Kernel Al Sreci

49

Gml Linux

min_low_pfn);
initrd_start = 0;
}
#endif
page_cgroup_init();
enable_debug_pagealloc();
debug_objects_mem_init();
kmemleak_init();
setup_per_cpu_pageset();
numa_policy_init();
if (late_time_init)
late_time_init();
sched_clock_init();
calibrate_delay();
pidmap_init();
anon_vma_init();
#ifdef CONFIG_X86
if (efi_enabled)
efi_enter_virtual_mode();
#endif
thread_info_cache_init();
cred_init();
fork_init(totalram_pages);
proc_caches_init();
buffer_init();
key_init();
security_init();
dbg_late_init();
vfs_caches_init(totalram_pages);
signals_init();
/* rootfs populating might need page-writeback */
page_writeback_init();
#ifdef CONFIG_PROC_FS
proc_root_init();
#endif
cgroup_init();
cpuset_init();
taskstats_init_early();
delayacct_init();
check_bugs();
acpi_early_init(); /* before LAPIC and SMP init */
sfi_init_late();
ftrace_init();
/* Do the rest non-__init'ed, we're now alive */
rest_init();
}

Kernel Al Sreci

50

Gml Linux

setup_arch(&command_line) ile bootloader tarafndan spesifik bir adrese konulmu olan

kernel boot parametrelerini iler


Mesajlar olabildiince erken gsterebilmek iin console aygtnn ilklendirilmesi
security, buffers, high resolution timers gibi bir ok altsistemin ilklendirilmesi
Son olarak rest_init 'in arlmas

rest_init
init srecinin her zaman PID deeri olarak 1 almas iin erkenden bir thread oluturuluyor

ve idle_loop 'a geri dnyor:


static noinline void __init_refok rest_init(void)
{
int pid;
rcu_scheduler_starting();
/*
* We need to spawn init first so that it obtains pid 1, however
* the init task will end up wanting to create kthreads, which, if
* we schedule it before we create kthreadd, will OOPS.
*/
kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
numa_default_policy();
pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
rcu_read_lock();
kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
rcu_read_unlock();
complete(&kthreadd_done);
/*
* The boot idle thread must execute schedule()
* at least once to get things moving:
*/
init_idle_bootup_task(current);
preempt_enable_no_resched();
schedule();
/* Call into cpu_idle with preempt disabled */
preempt_disable();
cpu_idle();
}

kernel_init

Kernel Al Sreci

51

Gml Linux

kernel_init temel olarak iki arda bulunur:


Bu aamada temel kernel servisleri hazr olduundan, device init ilemlerini balatmak
amacyla do_basic_setup arlr
!c
static void __init do_basic_setup(void)
{
cpuset_init_smp();
usermodehelper_init();
shmem_init();
driver_init();
init_irq_proc();
do_ctors();
usermodehelper_enable();
do_initcalls();
}

Sonrasnda init_post arlr

init_post
Boot ileminin son admlarn gerekletirmekten sorumludur.
Bir console amay dener (Initial Console)
Baarsz olduu takdirde: Unable to open initial console uyar mesaj grntlenir.
Ardndan init process'ini altrmay dener.
Baarl olmas halinde rest_init srecinde oluturulan kernel thread'ini bir userspace
process'e dntrr.

init_post

Kernel Al Sreci

52

Gml Linux

static void run_init_process(const char *init_filename)


{
argv_init[0] = init_filename;
kernel_execve(init_filename, argv_init, envp_init);
}
static noinline int init_post(void)
{
/* need to finish all async __init code before freeing the memory */
async_synchronize_full();
free_initmem();
mark_rodata_ro();
system_state = SYSTEM_RUNNING;
numa_default_policy();

current->signal->flags |= SIGNAL_UNKILLABLE;
if (ramdisk_execute_command) {
run_init_process(ramdisk_execute_command);
printk(KERN_WARNING "Failed to execute %s\n",
ramdisk_execute_command);
}
/*
* We try each of these until one succeeds.
*
* The Bourne shell can be used instead of init if we are
* trying to recover a really broken machine.
*/
if (execute_command) {
run_init_process(execute_command);
printk(KERN_WARNING "Failed to execute %s. Attempting "
"defaults...\n", execute_command);
}
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
panic("No init found. Try passing init= option to kernel. "
"See Linux Documentation/init.txt for guidance.");
}

zet
Boot ykleyici uygulamas tarafndan bootstrap kodu altrlyor
Bootstrap kodu ilemci ve kart ilklendiriyor

Kernel Al Sreci

53

Gml Linux

Ardndan Linux kernel'i RAM bellek zerinde uncompress ediyor.


start_kernel fonksiyonu altrlyor
Boot ykleyici tarafndan salanan command line blm kopyalanyor
Sistem ve konsol ilklendirmeleri yaplyor
Temel kernel servisleri ilklendiriliyor
leride init process'ine dnecek kernel thread'i oluturuluyor
Aygtlar ilklendiriliyor ve init process'i userspace'ten altrlyor.

Kernel Al Sreci

54

Gml Linux

Kullanc Kipine Gei - Init Sreci


Linux ekirdei al srecinin kendisiyle ilgili son 2 admnda nce kk dosya sistemini
balar, ardndan kk dosya sisteminde yer alan bir adet uygulamay balatr.
Eer ekirdek kendisiyle ilgili tm al ilemlerini yapmasna ramen, altraca
uygulamay sistemde bulamaz veya uygulamay altramaz ise, aadaki gibi bir hata
mesaj ile panic durumuna geer:
Kernel panic - not syncing: No init found

Bu senaryo olutuunda henz kullanc kipinde hi bir uygulama altrlamam


olduundan, sistemi kullanmanz mmkn olmaz. Yaplacak yegane ilem, panic=10 gibi bir
deeri ekirdek al parametresi olarak kullanmaktr. Bu deer ekirdee, herhangi bir
sebeple panic durumuna dlrse, sistemin girilen saniye deeri sonrasnda yeniden
balatlmasnn istendiini belirtir. zellikle gml sistemler iin panic=xxx parametresinin
kullanlmas nerilir. Herhangi bir beklenmedik sebeple ekirdek bu duruma derse,
zellikle uzak lokasyonlarda yer alan cihazlarnz olduunu varsayarsak, panic durumda
kalmaktansa bir sre sonra otomatik yeniden balama srecinin denenmesini talep etmek ve
sisteme tekrar eriim salamay ummak daha iyi bir alternatiftir.

Init Uygulamasnn altrlmas


ekirdek tarafndan kullanc kipinde altrlan bu uygulamann Process ID (PID) deeri her
zaman 1 olur. Eer altrlan bu process herhangi bir ekilde sonlanrsa, ekirdek
tarafndan yeniden bir process altrmay denemek eklinde bir aksiyon alnmaz.
Dolaysyla kullanc kipinden baktmzda sistem kilitlenmi olur.
SORU: Sistem aldktan sonra root kullancs ile 1 nolu process'e kill 1 veya kill
-9 1 komutu ile SIGTERM ve SIGKILL sinyali gnderirsek sistem kilitlenir mi?

1 nolu process'in ekirdek seviyesinde zel bir durumu vardr. Sistemdeki 1 nolu process'i
root kullancs ile dahi sinyal gndererek sonlandramazsnz. 1 nolu process balatlrken
ekirdek tarafndaki process tablosunda SIGNAL_UNKILLABLE bayra ile iaretlenir. Bu
sayede sonraki aamalarda process'in sonlanmasna yol aabilecek trden hi bir sinyal
ekirdek tarafndan bu process'e gnderilmez. Bu sreci detayl incelemek isteyenler
kernel/fork.c ierisindeki is_child_reaper() ve kernel/signal.c ierisindeki
SIGNAL_UNKILLABLE kullanmlarna gz atabilir.

Kullanc Kipine Gei - Init Sreci

55

Gml Linux

lk altrlan uygulamaya tehlikeli sinyallerin gnderilmesi ekirdek tarafndan engelleniyor


fakat uygulama ierisinde hata olmas durumunda veya kontroll bir exit yaplyorsa, ilk
alan uygulama sonlanm olaca iin sistem kilitlenmi olur.
Bu noktadan hareketle, sistemdeki ilk alacak uygulamay kendimiz gelitirmek yerine,
belki de toplam milyarlarca farkl sistem ve cihazda alan ve hibir hata iermedii bylece
kantlanm olan bir uygulamay kullansak daha iyi olmaz myd?
Bu sorunun yant System V ekolndeki Unix/Linux sistemleri iin /sbin/init
uygulamasdr.
Eer al srasnda ekirdek parametresi olarak init=xxx eklinde bir parametre verilerek
ilk altrlacak uygulama zellikle belirtilmemise, ntanml olarak /sbin/init altrlr.
Aslnda ou ekirdek versiyonunda ntanml uygulama olarak /sbin/init 'in altrlmas
denenir ancak baarsz olursa sistemi aabilmek adna bir ka farkl dosya daha sistemde
aranr ve altrlmaya allr. ekirdek ierisindedeil, birden fazla uygulama kontrol edilir.
ekirdek ierisindeki init/main.c dosyasndaki aadaki blm inceleyiniz:
...
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
panic("No init found. Try passing init= option to kernel. "
"See Linux Documentation/init.txt for guidance.");

SORU: 1 nolu uygulamay sonlandramazsnz diyorsunuz. Peki 1 nolu init uygulamas


sistem aldktan, tm servisler (daemon'lar) ayaa kalktktan sonra kendi isteiyle
exit ederse ne olur? Sistem alm, servisler almaya balam olduunda gre
init 'in almasna halen ihtiya var mdr?

Byle bir durumda sistemimiz intihar teebbsnde bulunmu olacaktr. Bir uygulamann
servis (daemon) olmas ne demektir? Uygulamalarn onlar balatan uygulamalar (parent
process) sonlansa dahi arkada almaya devam eder hale getirilmesine eytanlatrma :)
(daemonize) ismini veriyoruz. Aslnda bu srecin arkasnda yatan basit mantk da, daemon
haline getirmek istediimiz uygulamann parent process id deerini (PPID), 1 nolu process
olarak deitirmekten ibarettir. 1 nolu process hi lmeyecei iin daemon yaptmz
uygulamann parent process'i hi sonlanmayacak, bu sayede daemon da arka planda
almaya devam edecektir. Herhangi bir ekilde sadece 1 nolu uygulamay sonlandrabiliyor
olsaydk dahi, tm daemon'larn anas 1 nolu process olduundan, ekirdek tarafndan tm
child process'leri de sonlandrlacakt.

Kullanc Kipine Gei - Init Sreci

56

Gml Linux

/sbin/init 'le almak


Buraya kadar okuduklarmzda, al srecini ynetecek uygulamay sfrdan yazma riskini
stlenmektense, onun yerine init uygulamasn kullanmamz gerektiini rendik. Peki,
al srecinin tmn ynetmek istediimize gre, bu grevi init 'e devredersek sonra
nasl tekrar sreci kontrol edeceiz?
Init uygulama kodu olduka sadedir. Temel baz ilevler haricinde fazla bir i yapmaz.
Normal Linux datmlarmzda kullandmz init uygulamas ile busybox ierisinden
kan krplm init uygulamas birebir ayn deildir ancak temelde ayn ilevleri yerine
getirirler. Gml sistemlerde kullanacamz busybox init uygulamas orjinalinden farkl
olarak alm seviyelerini (runlevel) desteklemez. Ancak alma seviyelerinin gml bir
sistem iin zaten pek ilevsel bir kullanm bulunmamaktadr. Bu sebeple busybox init
uygulamasnn konfigrasyon dosyasnda da minik farklar bulunur.
Init uygulamas ayaa kalktnda /etc/inittab dosyasn okur. Busybox versiyonunda
/etc/inittab dosyasnn okunmas derleme srecinde CONFIG_FEATURE_USE_INITTAB

opsiyonuyla deitirilebilmektedir. Bu zellik devre d brakldnda da init uygulamas


alabilir bir sisteme ulamak adna ntanml olarak /etc/init.d/rcS betik uygulamasn
altrr ve sistemin ntanml konsolunda kabuk uygulamasn balatr.
Sreci daha ak hale getirmek iin /etc/inittab dosyasn kullanma yolunu tercih
edeceiz (nerilen alma ekli de budur).
Aada busybox iin rnek bir inittab dosyas yer almaktadr:

Kullanc Kipine Gei - Init Sreci

57

Gml Linux

# /etc/inittab
::sysinit:/etc/init.d/rcS
# /bin/sh invocations on selected ttys
#
# Note below that we prefix the shell commands with a "-" to indicate to the
# shell that it is supposed to be a login shell. Normally this is handled by
# login, but since we are bypassing login in this case, BusyBox lets you do
# this yourself...
# Start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh
# Start an "askfirst" shell on /dev/tty2-4
tty2::askfirst:-/bin/sh
tty3::askfirst:-/bin/sh
tty4::askfirst:-/bin/sh
# /sbin/getty invocations for selected ttys
tty5::respawn:/sbin/getty 38400 tty5
tty6::respawn:/sbin/getty 38400 tty6
# Example how to put a getty on a modem line.
#::respawn:/sbin/getty 115200 ttyS2
# Stuff to do when restarting the init process
::restart:/sbin/init
# Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a

imdi bu dosyadaki nemli satrlar detaylandralm.

::sysinit:/etc/init.d/rcS
Dosyada bizi en ok ilgilendiren blm, sysinit ile belirtilen ksmlardr. Bu anahtar kelime
ile, init uygulamasna al srecinde bizim admza bir baka uygulamay balatmasn
sylyoruz. Yani al srecini init uygulamasna devretmekle kaybettiimiz kontrol,
sysinit ile tanmladmz uygulama zerinden tekrar geri alyoruz. Bu ekilde belirttiimiz

uygulamamzda sistemin alnda yaplmas gereken tm ilemleri gerekletirip, gerekli


servisleri de ayaa kaldrdmzda tam anlamyla alan bir sisteme kavumu olacaz.
sysinit deyimi birden fazla satrda yer alabilir. Byle bir kullanmda init uygulamas
dosyada yer alan sralama dorultusunda her bir sysinit ile belirtilen uygulamann
almasnn sonlanmasn bekler ve bir sonraki uygulamaya geer. Bu ekildeki bir kullanm

Kullanc Kipine Gei - Init Sreci

58

Gml Linux

yerine inittab dosyasnda tek bir sysinit ieren satrn yer almas ve altrlacak dier
mekanizmalarn ilgili uygulama ierisinden ynetilmesi tercih edilir.

::askfirst:-/bin/sh
Bu zel satr, ekirdein al srecinde de kullandmz n tanml sistem konsolu
zerinde, /bin/sh kabuunu balatacaktr. askfirst anahtar kelimesi sayesinde
karmza bir bilgi mesaj kacak ENTER tuuna basmamz halinde ise kabuk uygulamas
alacak ve kabuu kullanmaya balayabileceiz. Herhangi bir gvenlik kontrol iermeyen
bu mekanizma, gelitirme srecinin balangcnda iimize yarayabilir ancak daha sonra
devre d braklmaldr. Aksi takdirde sistemimize bir ekilde seri konsol balants yapmay
baaran birisi, dorudan sistem zerinde bir kabuk altrabilir.

tty2::askfirst:-/bin/sh
Konsolun haricinde benzer ekilde, tty2, tty3 ve tty4 sanal konsollarnda gvenlik kontrol
olmadan kabuk uygulamasnn balatlmas bu ekilde ntanml olarak rnek inittab
dosyasnda yer almaktadr. Eer sisteme bal bir monitor var ve bu sanal konsol
mekanizmasn kullanmak istiyorsak, aada anlatacamz ekilde askfirst ile deil,
parola korumasyla girii salamalyz. Ya da pek ok gml sistemde olduu gibi, bu
ekilde bir sanal konsol kullanmna ihtiyacmz yok ise, bu satrlarn inittab dosyasndan
karlmas yerinde olacaktr.

tty5::respawn:/sbin/getty 38400 tty5


Bu rnekte 5. sanal konsolda getty uygulamasnn 38400 tty5 parametreleri ile
balatlmas salanmaktadr. Eer sanal konsol kullanacaksak bu yntem izlenmelidir.
getty uygulamas alt konsolda ncelikle login uygulamasn altracak ve

kullanc ad, parola kontroln yapacak, baarl olmas durumunda kullanc adna kabuk
uygulamasn balayacaktr.
respawn zel deyimi ise, init uygulamas tarafndan salanan ek bir zellik olup, ilgili

kuralda altrlmak zere belirtilen uygulama herhangi bir ekilde sonlanacak olursa,
otomatik olarak ayn parametrelerle yeniden balatlmasn (respawning) salar (init
uygulamas bu gibi fonksiyonlar salayabilmek adna da hi lmemelidir).
Respawn zellii gml sistemimizde bizim iin faydal bir kullanm alan bulabilir. rnek
olarak sisteminizde 3 adet nemli daemon yazdnz dnelim. 4. olarak da bu
daemon'larn alp almadn periyodik olarak kontrol eden ve srekli arka planda
alan bir uygulamanz olduunu dnelim, ad controller olsun. Eer controller
uygulamanzda uygulamann sonlanmasna neden olacak herhangi bir hata olursa, tm

Kullanc Kipine Gei - Init Sreci

59

Gml Linux

kontrol mekanizmas devre d kalacaktr. controller uygulamanz kontrol edecek ayr bir
uygulama yapsanz ayn sorun onun iin de geerli olacandan, hi bir zaman lmeyecek
bir uygulamadan yardm almamz gerekecektir ki bu uygulama init olmaktadr. Teorik
olarak bunun iin ekirdekten de yardm talep edebilirdik ancak Linux ekirdei byle ilere
bulamaz ve kullanc kipinde alan uygulamalardan ilk altrd init haricindekilere
zel bir muamele yapmaz. O yzden biz de init uygulamasnn yardmna bavurarak,
sistemdeki dier servisleri kontrol eden controller uygulamamz, respawn deyimiyle
/etc/inittab dosyasna yazp, init tarafndan sonlansa bile yeniden balayacak hale

getirebiliriz.
Bu noktada yle de dnebilirsiniz: zaten controller uygulama kodumuz ok basit
olacandan hi kmeyecek bir ey yazabiliriz. O yzden gene de init 'in yardmna
ihtiyacmz var m?
Doru bir soru, gidi yolundan puan verilebilir. Temel hedef tm hatalarn kontrol edildii ve
kmeyecek uygulamalar yazabilmek olmaldr. Aksi takdirde bu i tm uygulamalarn init
zerinden balatlmasna kadar gider ki bu ilemin burada ayrntsna girmeyeceimiz baka
zorluklar da vardr.
Fakat zellikle gml sistemler iin, sistemin salkl almas ve rnein uzaktan balant
yaplabilmeye devam etmesi iin gereken minimum servislerin her zaman alr durumda
olduunun kontroln yapan ve almayanlar yeniden balatan, belki bundan biraz daha
fazlasn da yapan genel bir controller yazlmnn kendisini init zerinden respawn ile
altrlacak ekilde balatmak daha doru bir davran olacaktr.
controller uygulamanz ok iyi yazm olabilirsiniz, ancak sistemdeki baka bir
uygulamann bellei tkettiini ve yeni bellek isteyen bir uygulama iin ekirdek ierisindeki
Out Of Memory Killer mekanizmasnn bellekte yer amak iin kulland algoritma sonucu
sizin controller process'inizi setiini ve onu sorgusuz sualsiz ldrdn dnelim
(ekirdek gerekten byle iler de yapmaktadr). Bu durumda sizin uygulamanz ok iyi
yazlm olsa bile beklentiniz dnda bir sonlanma da yaayabilirsiniz. Linux OOM Killer
algoritmasnn aday process seim srecinde controller uygulamanza daha dk deer
vermesini salamak iin yapabileceiniz baz ilemler bulunmaktadr. Ancak bunun gibi
farknda olamayabileceiniz detaylar nedeniyle, controller uygulamas iin init
uygulamasndan yardm talep etmemiz yerinde olacaktr, ayp karlanmaz.

::respawn:/sbin/getty 115200 ttyS2


Bu satr respawn mekanizmasyla ttyS2 seri portunda 115200 baudrate ile getty
uygulamasnn balatlmasn salamaktadr.

Kullanc Kipine Gei - Init Sreci

60

Gml Linux

Gml sistemlerde seri port aygt dosyas isimlendirmeleri kullanlan teknoloji ve board
ailesine gre (ttyO1 vb.) deikenlik gsterebilmektedir. Bu blmde sistemin standart
konsolu veya dier seri portlar zerinde kullanc kimlik denetimi yaparak girie izin vermek
istediimiz aygtlar iin her biri ayr bir satrda yer alacak ekilde ayarlamalarmz yapabiliriz.

::restart:/sbin/init
Bu ayar bir miktar kafa kartrc olabilir. Bazen SIGHUP sinyali gndererek /etc/inittab
dosyasnn yeniden okunmasn salamak yeterli olmaz ve init srecini yeniden
balatmak gerekir. Init srecini yeniden balatmak istediimizde (restart), hangi uygulamann
altrlacan sylyor. Baz zel senaryolarda, sistemin kk dizinini alma srasnda
deitirmeniz gerekebilir. Yeni kk dizinde farkl bir /sbin/init versiyonu da yer alabilir.
Buradaki ntanml davranla init 'e restart eyleminde gene /sbin/init uygulamasnn
altrlacan sylemi oluyoruz.
SORU: Peki bu ekilde bir restart ilemi sonucunda yeni oluacak init process'in PID
deeri 1'den byk olmayacak mdr?

::ctrlaltdel:/sbin/reboot
Bu deyim zellikle X86 tabanl sistemlerde klavyeden CTRL-ALT-DEL tularna basldnda
tetiklenen sistemi yeniden balatma ileminde hangi uygulamann alacan
gstermektedir.

::shutdown:/bin/umount -a -r
Shutdown anahtar kelimesi ile yer alan satrlar, sistem kapatlrken hangi uygulamalarn
alacan belirtir. Birden fazla tekrar edildiinde, kapan srasnda inittab dosyasnda
yer ald sralama ile ilgili komutlar altrlacaktr.
Shutdown anahtar kelimesinin tekrarndan oluan satrlar ile kapan srasnda birden fazla
ilem yapmak yerine,
::shutdown:/etc/kapanis

rneindeki gibi tm sreci bir betik uygulamasna ynlendirip, betik ierisinde gereken dier
tm ilemleri yapmanz daha doru olacaktr.

Kullanc Kipine Gei - Init Sreci

61

Gml Linux

Busybox ile Kk Dosya Sistemi Oluturma


Gml sistemimizin oluturulmasnda kk dosya sisteminin retimi nemli admlarn
banda gelmektedir.
Boot ykleyici ve Linux ekirdei ile ilgili ilemler tamamlandktan sonra, ekirdek tarafndan
/ kk dizini altna balanacak dosya sistemimizi hazrlamalyz. Dosya sistemimizin
temellerini ise Busybox ile oluturacauz.
Busybox projesi 1995 ylnda, zgr Yazlm dnyasnn nemli figrlerinden Bruce Perens
tarafndan gelitirilmeye balanmtr. Projenin temel hedefi, 1.44 MB'lk tek bir disket
ierisine temel bir Linux kk dosya sistemini ve Linux kurulum uygulamasn sdrmak idi. O
tarihlerde tipik bir Linux kurulum sreci, 2 disket ile balyordu. Birinci diskette Linux
ekirdei yer alyordu. Kk dosya sistemi ise 2. disket zerinden okunuyordu.
Linux datmnn kurulumu sresince bize yardmc olan kurulum (installer) uygulamas da
herhangi bir Linux uygulamasndan farkl deildir. Dolaysyla alabilmesi iin alt tarafta
bata standart C ktphanesi olmak zere, alan bir Linux dosya sistemine de ihtiya
duymaktadr. Bunun yan sra kurulumun eitli aamalarnda fdisk, mount, cp, mkdir, ..
vb. temel Linux aralarnn da sistemde yer almas gereklidir.
Busybox projesi derlendiinde tek bir uygulama dosyas (busybox) olumaktadr. Bu tek
uygulama ierisinde, pek ok temel Linux uygulamasna ait fonksiyonlar (kabuk, editr,
dosya sistemi ilemler, disk blmleme ve biimlendirme aralar vb.) yer almaktadr.
Busybox uygulamas ierisindeki bu fonksiyonlar kullanmak iin, ilgili fonksiyon ve
fonksiyonun parametreleri busybox uygulamasna verilmelidir. rnek olarak sistemde
mkdir komutuyla yeni adnda bir dizin yaratmak istersek, bunu busybox ile u ekilde

yapabiliriz:
$ busybox mkdir yeni

Eer busybox uygulamasn derlerken mkdir fonksiyonlarn ieren applet 'i de dahil etmi
isek, ilem gerekleecektir.
Busybox uygulamamz ierisinde hangi fonksiyonlara destek olduunu grmek iin,
uygulamay parametre vermeden altrp kty inceleyebiliriz:

Kk Dosya Sistemi Oluturma

62

Gml Linux

$ busybox
Usage: busybox [function [arguments]...]
or: busybox --list[-full]
or: busybox --install [-s] [DIR]
or: function [arguments]...
BusyBox is a multi-call binary that combines many common Unix
utilities into a single executable. Most people will create a
link to busybox for each function they wish to use and BusyBox
will act like whatever it was invoked as.
Currently defined functions:

[, [[, acpid, add-shell, addgroup, adduser, adjtimex, arp, arping, ash, awk, base64, basename, beep,

bzcat, bzip2, cal, cat, catv, chat, chattr, chgrp, chmod, chown, chpasswd, chpst, chroot, chrt, chvt,

crond, crontab, cryptpw, cttyhack, cut, date, dc, dd, deallocvt, delgroup, deluser, depmod, devmem, d

dnsdomainname, dos2unix, du, dumpkmap, dumpleases, echo, ed, egrep, eject, env, envdir, envuidgid, et

fatattr, fbset, fbsplash, fdflush, fdformat, fdisk, fgconsole, fgrep, find, findfs, flock, fold, free

ftpd, ftpget, ftpput, fuser, getopt, getty, grep, groups, gunzip, gzip, halt, hd, hdparm, head, hexdu

ifconfig, ifdown, ifenslave, ifplugd, ifup, inetd, init, insmod, install, ionice, iostat, ip, ipaddr,

iptunnel, kbd_mode, kill, killall, killall5, klogd, last, less, linux32, linux64, linuxrc, ln, loadfo

losetup, lpd, lpq, lpr, ls, lsattr, lsmod, lsof, lspci, lsusb, lzcat, lzma, lzop, lzopcat, makedevs,

mkdir, mkdosfs, mke2fs, mkfifo, mkfs.ext2, mkfs.minix, mkfs.vfat, mknod, mkpasswd, mkswap, mktemp, mo

mpstat, mt, mv, nameif, nanddump, nandwrite, nbd-client, nc, netstat, nice, nmeter, nohup, nslookup,

ping, ping6, pipe_progress, pivot_root, pkill, pmap, popmaildir, poweroff, powertop, printenv, printf

rdate, rdev, readahead, readlink, readprofile, realpath, reboot, reformime, remove-shell, renice, res

rpm2cpio, rtcwake, run-parts, runlevel, runsv, runsvdir, rx, script, scriptreplay, sed, sendmail, seq

setlogcons, setserial, setsid, setuidgid, sh, sha1sum, sha256sum, sha3sum, sha512sum, showkey, shuf,

split, start-stop-daemon, stat, strings, stty, su, sulogin, sum, sv, svlogd, swapoff, swapon, switch_

tcpsvd, tee, telnet, telnetd, test, tftp, tftpd, time, timeout, top, touch, tr, traceroute, tracerout

ubidetach, ubimkvol, ubirmvol, ubirsvol, ubiupdatevol, udhcpc, udhcpd, udpsvd, umount, uname, unexpan

unzip, uptime, users, usleep, uudecode, uuencode, vconfig, vi, vlock, volname, wall, watch, watchdog,
xzcat, yes, zcat, zcip

Busybox ierisinde yer alan tm fonksiyonlar, yukardaki rnekte gsterdiimiz ekliyle


busybox uygulamasna parametre olarak geirmek suretiyle kullanmaya kalksaydk, zellikle
kabuk betiklerimiz gereksiz tekrarlar nedeniyle olduka irkin grnecek, betiklerin
okunabilirlii de nemli oranda azalacakt.
Busybox bu problemi ok basit ama zekice bir yntemle zmektedir. Tek bir uygulamadan
ibaret olmasna ramen, make install komutu verildiinde, busybox ierisinde destei
eklenmi tm fonksiyonlar (uygulamalar) iin kendisini gsterecek ekilde sembolik linkler
oluturmaktadr. rnek olarak, /bin/mkdir linki /bin/busybox ' gstermekte, /bin/cp linki
de ayn ekilde /bin/busybox ' iaret etmektedir. Bu ekilde tm gerekli linkler retildiinde
artk uygulamalar busybox mkdir eklinde deil sadece mkdir eklinde armamz
mmkn olmaktadr. Sonuta tm bu linkler yznden ayn uygulama almakta, ancak her
defasnda farkl isimle arm olduumuzdan argv[0] adresinde arld programn ismi
(rnein mkdir) yer almaktadr. Busybox ierisindeki komut satrn parse eden blm,

Kk Dosya Sistemi Oluturma

63

Gml Linux

arlma biimi busybox dndaki bir deer ise ve bu deere ilikin destekler uygulama
ierisinde derlenmise, kendi iinde ilgili fonksiyonu armak suretiyle istenen amac
gerekletirmektedir.

Konfigrasyon ve Derleme
Busybox ierisinde pek ok bileenle geldiinden, derleme sreci ncesinde hangi
bileenlerden oluan bir busybox uygulamas retmek istediimizi belirlememiz, bunun iin
bir konfigrasyon dosyas retmemiz gerekiyor.
Seenek / kombinasyon says bir kernel derleme sreci kadar devasa olmasa da, hatr
saylr miktarda seenek kmesi olduunu syleyebiliriz. Tpk kernel derleme
konfigrasyonu srecinde olduu gibi, busybox konfigrasyon ve derleme ilemleri iin de
Kbuild sistemi kullanlmaktadr.
Menuconfig arayz zerinden konfigrasyon srecimizin hedefi olan .config dosyasn
retebiliriz. Bunun iin make menuconfig veya aadaki make hedeflerinden biriyle
.config dosyamz oluturabiliriz:

Make Hedefi

Aklama

menuconfig

nteraktif men tabanl sei arabirimini altrr

defconfig

Hemen her seenein aktifletirildii genel bir konfigrasyon


salar

allyesconfig

Tm olas seeneklerin aktifletirildii bir konfigrasyon salar

allnoconfig

Tm seeneklerin inaktif edildii, minimum bir konfigrasyon


salar

android_defconfig

Android platformu iin derleme yaplacaksa genel bir seenek


kmesi salar

Seim ilemi tamamlandktan sonra


$ make

komutuyla derleme ilemi yaplabilir. Paralel derleme zelliini -j parametresi ile devreye
alp (genelde ilemci ekirdek saysnn 2 katna kadar deer girebilirsiniz) derleme srecini
hzlandrabilirsiniz:
$ make -j 8

Kk Dosya Sistemi Oluturma

64

Gml Linux

NOT: Bu noktadan sonraki apraz derleme rneklerinde, /home/training/toolchains


dizini altna gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux toolchain'inin ald ve
PATH ortam deikeninin uygun ekilde ayarland varsaylmtr. Cross-Compiler
prefix'i arm-linux-gnueabihf- eklinde olup EABIHF yani Hard-Float trnde bir
toolchain'dir.
Busybox uygulamasn hedef platform iin apraz derlemek istediimizde, kernel derleme
srecindeki benzer ekilde ARCH ve CROSS_COMPILE deikenlerine atama yapmamz
gerekecektir:
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j 8

Bu ekilde apraz derleme sreci tamamlanacaktr.


lem bitiminde busybox uygulamasn tm gerekli linkleriyle birlikte bir dizin yaps ierisinde
(aslnda kk dosya sistemimizin ilk ablonu da diyebiliriz) make install komutuyla
oluturabiliriz. Bu komut eer CONFIG_PREFIX deikenine .config dosyas retimi
srecinde farkl bir deer atanmad ise bulunulan dizin altnda, _install eklinde bir alt
dizin aacak ve tm linkleri ve uygulama dosyasn bu alt dizinlerde oluturacaktr.
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- CONFIG_PREFIX=/opt/cross/rootfs install

Yukardaki rnekte ARM mimarisi iin apraz derleme ilemi sonras busybox uygulamas ve
gerekli linkleri, /opt/cross/rootfs dizini altnda oluturulacaktr.

NFS zerinden Sistemi Aarak lerleme


Not: Bu noktada NFS Sunucu Kurulumu ve NfsRoot blmlerini henz okumad iseniz
incelemeniz nerilir. Kk dosya sistemi ile ilgili burada verilen rnekler
BeagleBoneBlack cihaz zerinde altrlmtr.
rneklerimizde ntanml beaglebone_defconfig ile derlenmi ekirdek, aadaki gibi Uboot komutlar ile almaktadr:

Kk Dosya Sistemi Oluturma

65

Gml Linux

setenv serverip 192.168.100.1


setenv ipaddr 192.168.100.5
setenv console ttyO0,115200n8
setenv rootpath /opt/cross/rootfs

setenv bootargs console=${console} root=/dev/nfs nfsroot=${serverip}:${rootpath},vers=3 rw ip=${ipadd


tftp 0x80200000 uImage-dtb.am335x-boneblack
bootm

Yukardaki gibi minik dosya sistemimizi /opt/cross/rootfs dizini altnda hazr ettikten sonra,
bu dizini NFS sunucumuz zerinden paylama ap, cihazmz zerinden yeni
oluturduumuz bu dosya sistemiyle al yapmay deneyelim.
[ 5.320738] IP-Config: Guessing netmask 255.255.255.0
[ 5.326212] IP-Config: Complete:

[ 5.329625] device=eth0, hwaddr=d0:5f:b8:ef:61:07, ipaddr=192.168.100.5, mask=255.255.255.0,


[ 5.340641] host=192.168.100.5, domain=, nis-domain=(none)
[ 5.346837] bootserver=255.255.255.255, rootserver=192.168.100.1, rootpath=
[ 5.354377] ALSA device list:
[ 5.357663] #0: TI BeagleBone Black
[ 5.369033] VFS: Mounted root (nfs filesystem) on device 0:12.
[ 5.375638] devtmpfs: error mounting -2
[ 5.379967] Freeing init memory: 216K

[ 5.394642] Kernel panic - not syncing: No init found. Try passing init= option to kernel. See Li

Al srecimizin yukarda belirtilen ekliyle sonlandn grdk.


Daha nceki aamalarda, Linux ekirdeinin altaki tm ilemleri baarl olarak
tamamlamas halinde son 2 ilem olarak, kk dosya sistemini mount edip, kk dosya sistemi
zerinden bir adet uygulamay balatacan ifade etmitik. Yukardaki ktya baktmzda
kk dosya sisteminin NFS zerinden baarl bir ekilde mount edildiini grmekteyiz:
[ 5.369033] VFS: Mounted root (nfs filesystem) on device 0:12.

Fakat daha sonra init uygulamasnn altrlamadn ve kernel panic durumu


olutuunu grmekteyiz:
[ 5.394642] Kernel panic - not syncing: No init found.

Neden byle bir problem olutu?


Problemin nedeni retmi olduumuz dosya sistemimizde /bin/busybox ' gsteren bir ok
link olmasna ramen, toplamda sadece 1 adet binary uygulama bulunmakta, paylaml
ktphane dosyas ise hi bulunmamaktadr. Hatta paylaml ktphaneleri tutacamz

Kk Dosya Sistemi Oluturma

66

Gml Linux

lib dizini dahi henz sistemimizde mevcut deildir. Yapmamz gereken, hedef platform iin

apraz derleme yaptmz busybox uygulamamzn baml olduu ktphaneleri bularak,


kk dosya sistemimizdeki lib dizini altna kopyalamaktr.
ncelikle derlemi olduumuz busybox binary dosyasnn ktphane bamllklarn
bulalm. Bunun iin readelf uygulamasn -d parametresi ile arabiliriz:
$ readelf -d busybox | grep Shared
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libc.so.6]

Grld zere libc.so.6 ve libm.so.6 ktphanelerine ihtiya duymaktadr. ncelikle


kk dosya sistemimizde henz mevcut olmayan lib dizinini oluturalm:
$ mkdir /opt/cross/rootfs/lib

Sonrasnda ihtiya duyulan 2 ktphaneyi kopyalayalm. Peki bu ktphaneleri nereden


kopyalayacaz? Kendi gelitirme bilgisayarmzn /lib dizini altndakileri kopyalayamayz.
Oluturacamz kk dosya sistemine zaman zaman bu ekilde gereken ktphaneleri
kopyalamamz gerekecektir. Bu ilemleri ounlukla ncelikle ilgili ktphaneyi ayr bir yerde
hedef platform iin derleyerek, sonrasnda ktphane dosyalarn kk dosya sistemimiz
altna kopyalayarak gerekletireceiz.
Ancak libc.so.6 , libm.so.6 gibi temel ktphaneler zaten kullandmz toolchain
ierisinde yer almaktadr. Bu ktphaneleri yeniden derlemek, bir tr toolchain retim sreci
de gerektirdiinden, apraz derlemeyle ilgili blmde de anlattmz zere yeniden retmek
yerine toolchain ierisinden kan versiyonlarn kullanmak daha salkldr.
Kullandmz ARM eabihf toolchain'i iin bu dosyalar, toolchain ana dizinini referans
aldmzda, ./arm-linux-gnueabihf/libc/lib/arm-linux-gnueabihf dizini altnda yer alr.
Bulmakta sorun yaarsanz toolchain ana dizininde iken:
$ find -name libc.so.6

gibi bir komutla da arama yapp bulabilirsiniz.


imdi her iki ktphaneyi kk dosya sistemimize kopyalayalm:
$ cp ./arm-linux-gnueabihf/libc/lib/arm-linux-gnueabihf/libc.so.6 /opt/cross/rootfs/lib/
$ cp /arm-linux-gnueabihf/libc/lib/arm-linux-gnueabihf/libm.so.6 /opt/cross/rootfs/lib/

Kk Dosya Sistemi Oluturma

67

Gml Linux

Sistemimizi tekrar NFS zerinden atmzda problemin devam ettiini greceiz. Busybox
uygulamamzn ihtiya duyduu ktphaneleri kk dosya sistemimize attk ancak paylaml
ktphane bamll olan herhangi bir uygulamay altrabilmek iin ayn zamanda
ld.so ktphanesine de ihtiya bulunmaktadr. Bu ktphane toolchain versiyonlarna gre
ld-linux.so.2 , ld-linux.so.3 , ld-linux-armhf.so.3 gibi isimlerde bulunabilir. Bizim

kullandmz ARM eabihf toolchaini ierisinde bu dosya, ld-linux-armhf.so.3 eklindedir


ve bunun da kk dosya sistemine kopyalanmas gereklidir:
$ cp ./arm-linux-gnueabihf/libc/lib/ld-linux-armhf.so.3 /opt/cross/rootfs/lib/

ARM eabihf toolchain ile alan sistemimiz iin son bir ilem daha yapmamz gerekiyor. ldlinux-armhf.so.3 loader uygulamas, ayn anda eabihf ve eabi sistemleri destekleyebilmek

iin, ykleyecei dier ktphaneleri /lib/arm-linux-gnueabihf dizini altnda arar. Ayn anda
her iki ARM ABI ile almak pek karlalan bir durum deildir. Bu nedenle genellikle
/lib/arm-linux-gnueabihf dizini /lib dizinini gsteren bir sembolik link olarak oluturulur:

$ cd /opt/cross/rootfs/lib && ln -s . arm-linux-gnueabihf

Artk tm bileenlerimiz hazr grnyor. Cihazmz tekrar NFS zerinden amay


denediimizde, bu defa al srecinin gerekletiini grmekteyiz.

/etc/inittab yiletirmeleri
Artk alan bir sistemimiz var. Fakat greceiniz zere seri konsol ekranmzda aadaki
mesajlar srekli olarak kmakta:
can't open /dev/tty2: No such file or directory
can't open /dev/tty3: No such file or directory
can't open /dev/tty4: No such file or directory
can't open /dev/tty2: No such file or directory
can't open /dev/tty3: No such file or directory
can't open /dev/tty4: No such file or directory
...

Sistemimiz alm ve alyor durumda olmasna ramen bu hata mesajlar yznden


konsolu efektif kullanamyoruz. Buradaki problem sistemimizde henz bir /etc/inittab
dosyas olmad iin busybox init uygulamasnn ntanml bir inittab dosya ierii varm
gibi almasndan kaynaklanyor. /dev/ttyXX aygtlar sistemimizde yer almadndan
uygulamay altramamakta ve tekrar tekrar yapt denemelerden kaynaklanan hata
mesajlar grntlenmektedir.

Kk Dosya Sistemi Oluturma

68

Gml Linux

rnek bir inittab dosyasn busybox kaynak kodlarn atmz dizinde,


examples/inittab yolunda bulabiliriz. Bu dosyann ierii Init Sreci'nin anlatld blmde

detaylandrlmtr.
Sistemimiz iin aadaki inittab dosyasn kullanacaz:
::sysinit:/etc/acilis
::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/etc/kapanis

Yukardaki ierie sahip dosyay /opt/cross/rootfs/etc/inittab eklinde oluturup


ardndan sitemimizi tekrar amay denediimizde, daha nce aldmz hata mesajlarnn
ortadan kalktn ama yenilerinin geldiini grmekteyiz:
can't run '/etc/acilis': No such file or directory
Please press Enter to activate this console.
getty: can't open '/dev/null': No such file or directory
getty: can't open '/dev/null': No such file or directory
getty: can't open '/dev/null': No such file or directory
getty: can't open '/dev/null': No such file or directory
getty: can't open '/dev/null': No such file or directory
...

/etc/acilis dosyamz henz hazrlamadmz iin onunla ilgili aldmz hata normaldir.

Ancak sonrasnda srekli /dev/null dosyasnn yer almadna dair hatalar almaktayz ve
bu hata mesajlar yznden gene konsolumuzu kullanamyoruz. Kullandmz ekirdek
ierisinde DEVTMPFS ve DEVTMPFS_MOUNT destei aktr dolaysyla /dev dizini
altndaki aygt dosyalarnn ekirdek tarafndan otomatik retilmesi gerekirdi (detaylar iin
Devtmps Dosya Sistemi blmne baknz). Buna ramen /dev dizini altna bu zel
dosya sisteminin ekirdek tarafndan otomatik olarak balanamadn gryoruz. Bunun ok
basit bir nedeni var: minik dosya sistemimizde henz /dev dizini mevcut deil.
Mount ileminin baarl olabilmesi iin gerekli artlardan biri, mount edilecek dizinin de
ncesinde sistemde bulunmasdr (rneimizde /dev dizini).
Bu sorunu zmek iin kk dosya sistemimizde aadaki komutla /dev dizinini
oluturalm:
$ mkdir /opt/cross/rootfs/dev

Sonrasnda sistemi tekrar NFS zerinden aalm:

Kk Dosya Sistemi Oluturma

69

Gml Linux

[ 5.368528] VFS: Mounted root (nfs filesystem) on device 0:12.


[ 5.375468] devtmpfs: mounted
[ 5.378895] Freeing init memory: 216K
can't run '/etc/acilis': No such file or directory
Please press Enter to activate this console.
/ #

Nihayet sistemimizi grece uygun bir ekilde amay baardk. Mesajlar incelediimizde
devtmpfs mount ileminin gerekletiini gryoruz. /etc/acilis betiimiz henz hazr

olmadndan hata alyoruz ancak konsola dmeyi baardk. ls /dev komutuyla /dev
dizini altndaki dosyalar grebiliriz.
imdi alan uygulamalarn listesini ps komutuyla almay deneyelim:
/ # ps
PID USER TIME COMMAND
ps: can't open '/proc': No such file or directory

Grld zere /proc dizininin sistemde olmadna dair bir hata alyoruz ve process
listesini de gremiyoruz.
Sistemimizi yeniden balatmay deneyelim:
/ # reboot
reboot: can't open '/proc': No such file or directory

Bu ilem iin de /proc dizinine ihtiya olduu grlyor. alan bir Linux sisteminde proc
dosya sisteminin /proc altna mount edilmi durumda olmas nemlidir. Bu dizin altndaki
pek ok dosya ve dizin zerinden, kullanc kipindeki uygulamalar ekirdek ile haberleebilir
ve bir takm ilemleri gerekletirebilirler.
u ana kadar proc dosya sistemini mount etmi olmamamza ramen sistemimiz yeterince ilevsel olmasa da- alyordu, dolaysyla bu tarz ilemler iin ekirdek tarafndan
bir yardm beklememeliyiz. Bu sreci kullanc kipinde gerekletirmemiz lazm. Sistem her
aldnda mount komutu ile proc dosya sistemini /proc dizini altna balamalyz.
/dev dizini iin yaptmz rnekte olduu gibi, ncesinde /proc dizinini kk dosya

sistemimizde oluturalm:
$ mkdir /opt/cross/rootfs/proc

imdi /etc/acilis betiini /opt/cross/rootfs/etc/acilis ismiyle oluturmaya balayalm:

Kk Dosya Sistemi Oluturma

70

Gml Linux

#! /bin/sh
echo "Sistem acilisi basladi"
echo "proc dosya sistemi baglaniyor"
mount -t proc none /proc

Dosyay oluturduktan sonra altrma haklarn vermemiz gerekiyor:


$ chmod 755 /opt/cross/rootfs/etc/acilis

Tekrar sistemi NFS zerinden atmzda hi hata almadan sistemin aldn grebiliriz:
[ 5.374822] devtmpfs: mounted
[ 5.378254] Freeing init memory: 216K
Sistem acilisi basladi
proc dosya sistemi baglaniyor
Please press Enter to activate this console.
/ #

Artk ps , top , ifconfig , reboot vb. pek ok uygulama olmas gerektii gibi almaya
balayacaktr. reboot komutunu tekrar deneyelim:
/ # reboot
can't run '/etc/kapanis': No such file or directory
The system is going down NOW!
Sent SIGTERM to all processes

Reboot gerekleti ancak /etc/kapanis uygulamas henz hazr olmadndan bir hata
mesaj aldk. Bu dosyay da oluturalm. Temel olarak kapan srecinde, tm mount edilmi
dosya sistemlerinin unmount edilmesini salamamz yerinde olacaktr. Unmount ilemi Linux
Page Cache tablolarnn depolama ortamlarna yazlmasn tetikler, bylece kapan
srasnda veri kayb sorunu yaamazsnz. Aksi takdirde Write-Back mekanizmas nedeniyle
veri kayplaryla karlaabilirsiniz.
#! /bin/sh
echo "Sistem kapatiliyor"
umount -a -r

Ayn ekilde altrma haklarn vermemiz gerekiyor:


$ chmod 755 /opt/cross/rootfs/etc/kapanis

Kk Dosya Sistemi Oluturma

71

Gml Linux

Kk Dosya Sistemi Oluturma

72

Gml Linux

Initramfs le Erken Kullanc Kipi


nceki blmlerde Linux sistemlerinin genel al srecini inceledik. Linux ekirdei al
srecinin son nemli adm olarak, kullanc kipinde bir adet uygulamay altrmak
zorundadr. Doal olarak bu uygulamay altrmadan nce, uygulamann bulunduu dosya
sistemi (kk dosya sistemi) mount edilmi olmaldr.
Kk dosya sisteminin fiziksel olarak nerede bulunduu ise kernel tarafndan nceden
biliniyor olmaldr. Bu bilgi kernel derleme srecinde statik olarak kernel obje kodlar ierisine
gmlebilecei gibi boot ykleyici uygulama zerinden kernel al parametresi olarak da
belirtilebilir. Her iki durumda da kernel, kk dosya sisteminin hangi aygt (NFS dahil)
zerinde bulunduuna dair tek bir deeri biliyor olacaktr.
Kernel kk dosya sistemi olarak tek bildii yeri ya baarl olarak mount edecek ya da VFS:
unable to mount root fs eklindeki bir hata mesaj ile al srecini sonlandracaktr.
imdi bu bilgiler nda aadaki sorulara yantlar aramaya alalm:
Sistemde kullanlan kk dosya sisteminin trne ait dosya sistemi destei ve ilgili
fiziksel aygta erimek iin gereken destekler, kk dosya sistemi mount edilmeden nce
kernel tarafnda hazr olmaldr. Yani kk dosya sistemi olarak Ext4 kullanlan bir
sistemde Ext4 destei, XFS kullanlan bir sistemde de XFS destei hazr olmal, ayn
ekilde dosya sistemi fiziksel olarak MMC aygt zerinde ise MMC katman, NFS
zerinde ise IP ve NFS katman kernel tarafnda hazr edilmelidir. Bunlardan herhangi
biri eksik olduunda, kk dosya sistemi mount edilemez ve sistem alna devam
edemez. Tm bu destekleri hazr hale getirmenin bir yolu, ilgili destekleri kernel kodu
ierisine statik olarak eklemekten (modl yapmamak) geer. Ancak yzlerce farkl
kombinasyonda almasn beklediiniz bir Linux datm iin ntanml kernel
retmeye alyorsanz, tm bu destekleri kernel imaj ierisine atmak gibi bir
zorunlulukla karlarsnz. Bu da kernel imajn gereksiz bir ekilde bytecektir. Bu
sorunu nasl zebiliriz?
Gml sistemimizde yedek amal ikinci bir kk dosya sistemi tuttuunuzu dnelim.
Al srecinde kernel birinci dosya sistemini mount edemez (dosya sistemi btnl
bozulmu olabilir) veya dosya sistemi ierisinde bir takm anormallikler tespit ederse
otomatik olarak yedek olarak tuttuunuz kk dosya sisteminden ala devam etsin
istiyorsunuz. Bunu nasl yapabilirsiniz?
Sistemimizde al srasnda zel bir USB stick takmak ve zel bir takm gvenlik
kontrolleri yapmak suretiyle, tm sistem yazlmlarnn (kk dosya sistemi ve dier
yazlmlar) gncellenmesi nasl mmkn olabilir?

Initramfs le Erken Kullanc Kipi

73

Gml Linux

Kk dosya sistemini dm-crypt veya benzeri bir encrypted dosya sistemi ile birlikte nasl
kullanabiliriz? Bu tarz bir dosya sisteminin kullanlabilmesi iin ncesinde gereken
cryptsetup vb. uygulamalarn kk dosya sistemi mount edilmeden nasl

altracaz?
Asl veya yedek kk dosya sistemlerimizin her ikisinde birden sorun olmas veya
sistemin bir ekilde kk dosya sistemine eriememesi durumunda kernel panic
durumuna dmek yerine, otomatik olarak recovery amal kullanlabilecek bir ortam
salanabilir mi? Hatta bu recovery ortamna SSH vb. bir protokolle uzaktan balanmak
mmkn olur mu?
Sorular daha da artrabiliriz. Dikkat edilirse bu sorulara olumlu yantlar verebilmek iin, Linux
kernel tarafnda kk dosya sistemini mount etme ileminden nce, sorumuza bal olarak
zel bir takm ek ilemler yaplmas gerektii grnmektedir. Szgelimi dm-crypt ile
encrypted bir kk dosya sistemi kullanyorsak, kernel tarafndan n hazrlklarn yaplmas
gerekiyor. Eer dm-crypt yerine encfs kullanmak istersek, bu defa kernel tarafnda baka
ilemlerin yaplmas gerekecekti. Yukardaki sorularn her biri ve burada listelemediimiz
dier pek ok soru iin Linux kernel tarafnda ayr ayr ek destek gerekiyor. Byle bir ilem
kernel tarafnda mmkn mdr?
imdiye kadar rendiklerimizi bir kenara atmamza gerek yok, Linux kernel al srecinin
son ksmlar olduka basittir: kk dosya sistemini mount et ve ierisinden bir adet
uygulamay altr.
Yukardaki sorunlara zm retebilmek iin Linux kernel tarafnda karmak ilemler
yapmak yerine, daha basit bir yaklam gelitirilmitir: 2 aamal al yntemi
Bu yntem balangta genelde sadece Linux datm gelitiricileri iin nemliydi ancak
gnmzde pek ok gml sistemde de nemli kullanm alanlar bulmaktadr.

Initrd - Initial Ramdisk


2 aamal al sisteminin ncl initrd sistemidir. ekirdein ok eski versiyonlarnda
dahi bu destek bulunmaktadr.
Initrd imaj esasen alabilen kk bir kk dosya sistemidir. Ayrca hazrlanr ve genellikle
ext2 ya da cramfs gibi bir dosya sisteminin hazrlanmas ve sktrlmasyla cpio arivi
eklinde oluturulur.
rnek olarak kendi kullandmz Linux bilgisayarmzdaki initrd imajnn ieriine bakmay
deneyelim. rneimizde Debian Jessie 64bit versiyonundaki /boot/initrd.img-3.16-2-amd64
dosyasn kullanacaz. Dosyann boyutunun 15 MB olduunu grmekteyiz. file komutu
ile dosya hakknda bilgi edinmeye alalm:

Initramfs le Erken Kullanc Kipi

74

Gml Linux

$ file /boot/initrd.img-3.16-2-amd64
/boot/initrd.img-3.16-2-amd64: gzip compressed data,
last modified: Wed Dec 10 00:23:17 2014, from Unix

.gz gibi bir uzant verilmi olmamakla birlikte dosyann gzip ile sktrlm olduu

grlmektedir. ncelikle dosyamz amalyz:


$ zcat /boot/initrd.img-3.16-2-amd64 > /tmp/initrd

Dosyay /tmp/initrd eklinde sistemimize atk ve boyutunun 45 MB'a ktn grdk.


file komutuyla bu dosyaya baktmzda:

$ file /tmp/initrd
initrd: ASCII cpio archive (SVR4 with no CRC)

eklinde dosyann bir cpio arivi olduunu reniyoruz. Bo bir dizin oluturup, cpio -id
parametresiyle bu arivi yeni oluturduumuz dizin ierisine aabiliriz:
$ mkdir /tmp/image
$ cd /tmp/image
$ cpio -id < /tmp/initrd
90871 blocks
$ ls
bin conf etc init lib lib64 run sbin scripts

Initrd imajnn ierisine grebilmi olduk. Burada yer alan init uygulamas initrd al
ynteminde kullanlan ilk uygulamadr. ounlukla bir kabuk uygulamas olduundan
herhangi bir metin editr ile ieriini ap inceleyebiliriz.
Initrd imaj bu rnekte olduu gibi kernel imajndan ayr bir dosyada tutulur. Boot ykleyici
uygulama initrd al srecinde ncelikle bulunduu ortamdan kernel imajn bellee ykler.
Sonrasnda benzer ekilde initrd imajn da bulunduu yerden bellee ykler ve kernel
alnda initrd imajnn bellekte bulunduu adresi kernel tarafna bildirir. Kernel bu ekilde
balatldnda kk dosya sistemini geleneksel biimde mount etmeyi denemek yerine, initrd
imajnn ieriini RAM Disk yntemiyle bellee aar ve at yeri kk dosya sistemi olarak
kullanr. Geleneksel alta kk dosya sistemi mount edildikten sonra ntanml olarak
/sbin/init altrlyorken, initrd sistemiyle al gerekletirildiinde kk dizindeki /init

uygulamas altrlr.
zetle Linux kernel tarafnda daha nce renmi olduumuz al sistematii korunmakta,
gene sadece bir adet kk dosya sistemi mount edilmekte ve ierisinden bir adet uygulama
altrlmaktadr.

Initramfs le Erken Kullanc Kipi

75

Gml Linux

Ancak root dosya sistemi fiziksel bir medya zerinden deil, boot ykleyici tarafndan
ncesinde bellee aktarlm bir imaj zerinden gereklemekte ve ilk alan uygulama
/init olmaktadr.

Bu yntem erken kullanc kipi (early user-space) olarak da bilinmektedir.


ift aamal al srecinde kernel tarafndan hazr edilen dosya sistemi ve /init
uygulamasnn eitli kontrol vb. ilemleri yaptktan sonra asl kk dosya sistemini ncelikle
rnein /mnt gibi bir dizine mount etmesi, sonra da kk dosya sistemini ( / ) ilgili yere
( /mnt ) kaydrmas beklenmektedir.

Initramfs - Initial Ram FileSystem


Initramfs yntemi kk detaylar haricinde initrd sreciyle ayn ekilde gerekleir. Initrd iin
yazdklarmz genel olarak burada da geerlidir.
Initramfs srecindeki temel farkllk, initrd yaklamndaki ayr bir initrd imaj dosyas
kullanmak yerine, imajn da kernel ierisine eklemlenmi olmasdr.
Bu sayede kernel imajn ayr initrd imajn ayr ynetmek yerine, ya hep ya hi eklinde boot
ykleyici tarafndan kernel imajnn bellee yklenmesi baarld ise, her durumda erken
kullanc kipine ulamak mmkn olmakta; initrd imajnn bozulmu olmas veya boot
ykleyici tarafndan diskten yklenememesi gibi sorunlar ortadan kalkmaktadr.
Linux kernel 2.6 ve sonraki serilerde initrd yerine initramfs sisteminin kullanm tercih
edilmektedir.
Her iki imaj tr de, Kk Dosya Sistemi Oluturma balkl blmde anlatlan yntemlerle
retilebilir. Initramfs imaj iin bu ekilde kk bir dosya sistemi hazrladmzda,
derleyeceimiz kernel ierisine bu imaj eklememiz gereklidir.
Bunun iin ya imajmz tek dosyalk cpio arivi haline getirmeli ya da hazrladmz ana
dizini kernel derleme srecinde belirtmeliyiz. Bu ilem iin kernel tarafnda
CONFIG_INITRAMFS_SOURCE deikeni kullanlr.

Al Sreci
Her iki yntemde kernel tarafndan altrlan ilk uygulama /init eklindedir.
/init uygulamasndaki yapabileceklerimizin snr, initramfs kk dosya sistemine dahil

ettiimiz aralarla snrldr. ok kk bir imaj yaplabilecei gibi ok daha gelimi bir
dosya sistemi ve uygulamalardan oluan bir imak da retilebilir.

Initramfs le Erken Kullanc Kipi

76

Gml Linux

Bu noktada konuya balarken sorduumuz sorularn tmne cevaplar retebiliriz zira artk
kernel katmannda deil, kullanc kipinde almaktayz ve istediimiz her trl uygulamay
sistemimize dahil edebilir veya gelitirip kullanabiliriz.
rnek olarak encrypted kk dosya sistemi kullanacaksak, gerekli aralar initramfs
imajmzn ierisine dahil edip, asl dosya sistemini mount etmeyi denemeden nce
sistemimizi uygun ekilde hazrlayabiliriz.
Yedek dosya sistemi senaryosunda, asl dosya sistemini mount etme ilemimiz baarsz
olursa veya mount etmemize ramen ierisindeki belirli dosyalarn md5sum deerleri
beklediimizden farkl ise, unmount ilemiyle vazgeebilir ve yedek dosya sistemini mount
edebiliriz.
USB veriyolunda belirli zelliklere sahip bir disk var ise, ierisinde gvenlik/imza kontrol de
yapp sistemi ierisindeki dosyalarla gncelleyebilir veya sistemin bir yedeini ilgili disk
zerine geri kopyalayabiliriz.
Bu ekilde snrsz sayda senaryo retilebilir. Artk kullanc kipinde altmz iin senaryo
saysnn bizim iin (ve de kernel iin) bir nemi yoktur. Herhangi bir ilem artk yaplabilir
durumdadr.
Bu ekildeki 2 aamal al srelerinde, /init uygulamasndan son olarak asl kk
dosya sistemini belirlemesi ve sistemin initramfs imajn gsteren kk dizinini, asl kk dosya
sistemini gsterecek ekilde deitirmesi beklenir.
Aada rnek bir /init betii grlmektedir:
#!/bin/sh
# get_opt("init=/sbin/init") will return "/sbin/init"
get_opt() {
echo "$@" | cut -d "=" -f 2
}
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
[ -d /dev ] || mkdir -m 0755 /dev
[ -d /root ] || mkdir -m 0700 /root
[ -d /sys ] || mkdir /sys
[ -d /proc ] || mkdir /proc
# devtmpfs does not get automounted for initramfs
mount -t devtmpfs devtmpfs /dev
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t tmpfs tmpfs /tmp

Initramfs le Erken Kullanc Kipi

77

Gml Linux

# Sistem spesifik
# USB
modprobe musb_hdrc
modprobe ti81xx
modprobe sd_mod
modprobe usb-storage
modprobe omap_hsmmc
modprobe mmc_block
modprobe ext4
echo "# Checking usb startup disk"
sleep 3
mkdir -p /mnt/usb
mount -t vfat /dev/sda /mnt/usb 2> /dev/null || \
mount -t vfat /dev/sda1 /mnt/usb 2> /dev/null
if [ -e "/mnt/usb/upgrade/run.sh" ]; then
echo "SCRIPT CALISTIRILIYOR..."
sh /mnt/usb/upgrade/run.sh
umount /mnt/usb
fi
# Defaults
init="/sbin/init"
root="/dev/mmcblk0p2"
mnt_point="/mnt/rootfs"
# Process command line options
for i in $(cat /proc/cmdline); do
case $i in
root\=*)
root=$(get_opt $i)
;;
init\=*)
init=$(get_opt $i)
;;
esac
done
# Mount the root device
mount "${root}" $mnt_point
#Check if $init exists and is executable
if [[ -x "$mnt_point/${init}" ]] ; then
mount --move /sys $mnt_point/sys
mount --move /dev $mnt_point/dev
mount --move /tmp $mnt_point/tmp
#Switch to the new root and execute init
exec switch_root $mnt_point "${init}"

Initramfs le Erken Kullanc Kipi

78

Gml Linux

fi
#This will only be run if the exec above failed
echo "Failed to switch_root, dropping to a shell"
exec sh

/init betiimiz ok daha karmak ilemler yapyor olabilir. Burada fikir vermesi asndan

ufak bir implementasyon yaplm ve zellikle bir ka ufak iyiletirme yaplabilecek nokta
braklmtr. Bunlarn neler olabileceini bulmaya almak retici olabilir.
Initramfs sreciyle ilgili nemli bir not eklemekte fayda gryoruz. Bu ekilde al
gerekletirildiinde, ilerleyen aamalarda deineceimiz devtmpfs dosya sistemi henz
mount edilmi durumda deildir. Dahas bu mount ilemini bizim yapmamz gerekmektedir.
/init betiinin ilk satrlarnda bu blm grmekteyiz. Ancak bir sorun daha var ki, /init

uygulamas altrlrken /dev/console aygt dosyasna eriim de yaplmakta ve henz


devtmpfs zerinden /dev dizini hazr hale getirilmemi olduundan bu dosyaya
ulalamamakta ve /init uygulamas altrlamamaktadr. Bu senaryo ile
karlatnzda kernel al mesajlarnda aadaki gibi bir hata grrsnz:
Warning: unable to open an initial console.

Bu sorunun stesinden gelebilmek iin, initramfs imajn rettiininz kk dosya sistemindeki


/dev dizini altna console zel aygt dosyasn aadaki gibi oluturabilir:

$ sudo mknod -m 622 /path/to/initramfs/dev/console c 5 1

veya cp -a komutuyla kendi sisteminizdeki /dev/console dosyasn da kopyalayabilirsiniz.


rnek /init uygulamamz ilerleyen zamanda daha detayl aklanacaktr. Kod zerinden
takip edip ne yapmaya altmz anlayabilirsiniz. Bu sreteki en nemli komutlar
switch_root ve mount --move ile balayan satrlarda yer almaktadr.

Initramfs le Erken Kullanc Kipi

79

Gml Linux

Devtmpfs Dosya Sistemi


alan bir Linux dosya sisteminin en temel bileenlerinden biri /dev dizini altnda yer alan
aygt dosyalardr. Dosya sisteminde normal bir dosya gibi grnen bu dosyalar,
dierlerinden farkl olarak bir adet MAJOR bir adet de MINOR numaras ierirler. Linux
ekirdei tarafndan dosyalarn isimlerinin bir anlam yoktur, nemli olan ilikili olduklar
major:minor numaralardr.
rnek olarak /dev/ttyS0 zel dosyasnn major numaras 4, minor numaras 64'tr. Ayn
major:minor numaralarna sahip /dev/seriport isminde bir aygt dosyas retilirse, hangi
dosya zerinden eriim yaparsak yapalm, gerekte hep ayn aygt zerinde alm oluruz
(rneimizde birinci seri port).
Sistemde alan uygulamalar /dev dizini altndaki fiziksel ve soyut aygt dosyalarna
ihtiya duyarlar. Kendisine yazlan tm ierii yok eden /dev/null , istendii kadar rastgele
veri reten /dev/random , istendii kadar NULL veri reten /dev/zero vb. gibi dosyalarn da
kendilerine zg bir major ve minor numaralar bulunmaktadr.
zetle major:minor ikilisi, ilgili aygt dosyasnn ekirdek ierisindeki hangi katmanla ilikili
olduunu ve hangi driver/fonksiyonlarn kullanlacan da belirtmi olur.
Linux sistemlerinde /dev dizini altndaki aygt dosyalarnn oluturulmas iin 3 temel
yntem bulunur:
mknod uygulamasyla statik olarak nceden gerekli tm aygt dosyalar hazrlanabilir.

Zahmetli bir sretir.


udev servisi zerinden ekirdek tarafndan gnderilen mesajlar dinlenir ve yeni bir

aygt ilklendirildiinde veya ortadan kalktnda retilmesi/silinmesi gereken aygt


dosyalar udev tarafndan dzenlenir.
devtmpfs sistemiyle Linux ekirdei tarafndan, tmpfs dosya sisteminde mount

edilmi bir alan zerinde otomatik olarak retilebilir. Gml sistemler iin olduka
uygundur, Linux datmlarnda da kullanlmaya baland grlmektedir.
devtmpfs zellii, Linux ekirdeinin 2.6.32 versiyonuyla birlikte sunulmaya balanmtr.

Bu zellii destekleyen bir ekirdee sahipseniz dier opsiyonlara bakmanza hi gerek


yoktur. Bu yntemin hem kullanm kolay (neredeyse hi bir ilem yapmak zorunda
kalmyoruz) hem de alma zamannda zellikle al srecinde getirdii ek yavalk sfra
yakndr (udev modelinde ilk alta sysfs zerinden parse ilemi yapp tm aygtlar
bulmas ve gerekli aygt dosyalarn oluturmas 5-20 saniye aras alabilmektedir).

Devtmpfs Dosya Sistemi

80

Gml Linux

Baz gml sistemlerle birlikte gelen ntanml ekirdek konfigrasyon dosyalarnda, ou


zaman retici devtmpfs desteinden habersiz olduundan veya bir ekilde eski
konfigrasyon dosyalar yeni zellikler dikkate alnmadan datlmaya devam ettiinden,
devtmpfs desteinin kapal olarak geldii grlmektedir. Bu gibi senaryolarda,

konfigrasyon dosyasnda CONFIG_DEVTMPFS ve CONFIG_DEVTMPFS_MOUNT seeneklerini aktif


hale getiriniz.
CONFIG_DEVTMPFS destei, ekirdein devtmpfs zelliiyle retilmesini salar. Ancak sadece

bu seenek aktif ise, al srasnda devtmpfs zel dosya sistemini aadaki gibi bir
komutla sizin mount etmeniz gerekir:
mount -t devtmpfs none /dev

Ancak bu mount ileminden sonra sistemi kullanabilir olursunuz.


CONFIG_DEVTMPFS_MOUNT seeneini de aktifletirdiinizde, ekirdek kk dosya sistemini

mount ettiinde, otomatik olarak devtmpfs dosya sistemini de /dev dizini altna mount
eder. Bu senaryoda al srecinden bizim yukardaki gibi mount komutuyla ek bir ilem
yapmamza gerek kalmaz. nerilen yntem her iki seenein de aktif edilmesidir.
Bu iki zellik sayesinde, /dev dizini altnda sadece o an sistemde mevcut olan aygtlara
ilikin dosyalarn barndrlmas garantilenmi olur. lgili aygt kartldnda veya ekirdek
modl kaldrldnda, ilikili aygt dosyalar da ekirdek tarafndan kaldrlr (rnein usb
seri port eviricinin kartlmas durumu).

Devtmpfs Dosya Sistemi

81

Gml Linux

NFS Root Mekanizmas


NFS destei Linux'ta ok uzun yllardr bulunmaktadr. Linux sisteminizden a zerindeki
herhangi bir veya birden ok NFS paylamn, eitli dizinlere mount etmek suretiyle
kullanabilirsiniz.
Ancak kk dosya sistemi NFS zerinden kullanmak, biraz daha farkl bir senaryodur. Sistem
aldktan sonra, NFS yardmc aralarn kullanmak suretiyle paylamlarn mount edilmesi
senaryosuna gre nemli farklar ierir.
Bu sre NFS Root mekanizmas olarak adlandrlr ve zellikle gml sistemlerde sklkla
kullanlr. k amac balangta disksiz istemcileri adaki bir NFS paylam zerinden
balatmak olsa da, gml Linux sistemlerinin yaygnlamasyla kullanm alan da
genilemitir.
Kk dosya sistemini NFS zerinden alabilmek iin ekirdek ierisinde aadaki destekler
aktif olmaldr:
1. TCP/IP katman
2. ekirdek seviyesinde statik veya dinamikIP yaplandrmas destei
3. NFS istemci destei
4. NFS Root destei
Bunlar aacak olursak, TCP/IP protokol gereken iletiim protokollerinin temelini salama
noktasnda mecburen gereklidir. Statik veya dinamik IP yaplandrmasndan kast, henz kk
dosya sistemi mount edilmeden IP atama ilevlerini gerekletirdiimiz ifconfig gibi
uygulamalar kullanamayacamz iin, Linux ekirdeinin bize IP atama ilemleri iin
sunduu olanaklar kmesidir. Her bir seenek ekirdek derleme sreci ierisinde ayr ayr
aktifletirilebilmektedir. Statik IP atamas yaplabildii gibi ekirdek seviyesinde basit bir
DHCP istemci destei de verilebilmektedir.
NFS istemci destei, herhangi bir NFS paylamnn mount edilebilmesi iin gereklidir. NFS
Root destei ise, Linux ekirdeinin normalde bir major:minor ile tanmlad root dosya
sisteminin ne olaca bilgisini ( root=/dev/sda1 , root=1f03 vb.) /dev/nfs gibi pseudo aygt
dosyas zerinden alabilmesi iin gereklidir.
Tipik bir nfs root senaryosunda ekirdek parametreleri aadaki gibi olur:
root=/dev/nfs nfsroot=SERVER_IP:NFS_SHARE_PATH,vers=3 ip=CLIENT_IP

NfsRoot alma Yntemi

82

Gml Linux

apraz Derleme ve Gerekli Ekipmanlar


Sistemimizde kullandmz standart derleme aralar (gcc, g++ vb.) normal olarak ayn
sistemde alacak obje kodlar retir. Derlenen uygulamada kullanlan ktphaneler ve
balk dosyalarn ncesinde sistemde yer alr, derleme ve linkleme ilemi bu dorultuda
gerekleir. Sonrasnda uygulama ilgili sistemde altrlr.
apraz Derleme (Cross Compiling) srecinde ise derleme ilemi sonucunda retilecek obje
kodlarnn, ilemin yapld sistemden bamsz olarak baka bir hedef sistemde almas
beklenir.
Derleme ileminin yapld sistem host, derleme sonucunda oluturulacak uygulamalarn
alaca sistem ise target olarak isimlendirilir.
rnek olarak Linux alan 64 bitlik X86 ailesi kiisel bilgisayarnzda ARM veya Windows
platformu iin derleme yaptnzda, bilgisayarnz host, derleme srecinin hedefi olan
platform (rneimizde ARM veya Windows) target olacaktr.
Bir hedef platform iin apraz derleme ilemini yapabilmek, sisteminizde ilgili hedef platform
iin obje kodlar retecek derleyici (gcc, g++), obje kodlar zerinde ilem yapabilecek eitli
binary aralar (objdump, objcopy, readelf, strip vb.), temel C ktphanesi ve ilgili balk
dosyalarnn kurulu olmasn gerektirir. te tm bu topluluk Toolchain olarak adlandrlr.

Toolchain Trleri ve simlendirme


Toolchain'ler genel olarak, ilgili hedef platformu tanmlayan bir n ek ile isimlendirilirler.
rnein ARM platformu iin arm-linux n eki kullanlabilir. Toolchain ierisinden kan tm
aralarda bu n ek bulunur: arm-linux-gcc, arm-linux-g++, arm-linux-as, arm-linux-objcopy
vb.
Derleyicinin mutlaka gcc ailesi olmas da gerekmez. rnein Linux bilgisayarnzda 32 bit
Windows hedefli uygulama derlemek istiyorsanz, kullanacanz C derleyicisi i686-w64mingw32 olacaktr.
eitli projelerde alrken toolchain isimlendirmelerinde kafa kartrc durumlarla
karlaabilirsiniz. rnek olarak aadaki toolchain isimlerini ele alalm:
arm-linux
arm-none-linux-gnueabi
arm-fsl-linux-gnueabi
arm-none-eabi

apraz Derleme ve Gerekli Ekipmanlar

83

Gml Linux

arm-linux-gnueabihf
Toolchain isimlendirmelerinde genellikle arch [-vendor] [-os] - eabi sistematii takip edilir.
rnein arm-none-linux-gnueabi toolchain'i iin hedef mimari arm, retici belirtilmemi o
yzden none, iletim sistemi linux ve ABI versiyonu gnueabi olarak belirtilmek istenmitir.
Bu toolchain ile ARM Linux EABI binary formatnda dosyalar retebileceimizi dnebiliriz.
Dier bir rnee baktmzda retici alannda fsl ibaresini grmekteyiz. Bu da bize ilgili
toolchain'in FreeScale firmas tarafndan retildiini gsteriyor.
Arm-none-eabi rnei ise dierlerinden biraz daha farkl bir yerde duruyor, ierisinde hi
linux ibaresi gemiyor yani iletim sistemi ksm yok. Bu toolchain iletim sistemi olmayan bir
ortamda dorudan ARM ilemci zerinde koacak kodlarn retimi iin kullanlacaktr.
Dolaysyla bu toolchain ile kod retirken harici ktphaneler kullanmak ve linklemek
(dinamik veya statik) mmkn olmayacaktr.
Arm-linux-gnueabihf toolchain'indeki hf ibaresi, ABI tipini gstermekte olup aada bu
konuya deinilmitir.

Toolchain ABI (OABI, EABI)


Toolchain isimlendirmelerinde karlaabileceiniz, oabi, eabi ve eabihf ibareleri, zellikle
gnmzde popler olan ARM platformlar iin Application Binary Interface'in ne olduunu
gstermektedir.
OABI, ARM platformu iin kullanlan ilk ABI versiyonudur. OABI, ilgili sistemin kayar noktal
ilemleri hzl yapabilmek iin bir Floating Point Unit'e sahip olduunu varsayar. Dolaysyla
byle bir toolchain ile retilecek olan obje kodlarnda FPU Instruction'lar yer alacaktr.
Ancak zellikle ilk retilen ARM platformlarnda herhangi bir FPU birimi bulunmamaktayd.
Bu nedenle ilgili toolchain'ler zerinden elde edilmi olan uygulamalar, ilemcinin
desteklemedii FPU Instruction'larn rettiinde CPU Exception durumu olumaktayd.
lemci mimarilerinde exception ve interrupt mekanizmalar, beklenmedik bir olay ile
normal ak kesintiye uratp farkl bir ekilde ilerlenmesini salar.
Genel olarak exception durumu CPU ierisinde beklenmedik bir durumun olumasn,
interrupt ise CPU dnda beklenmedik bir olay nedeniyle ortaya kar.
lgili CPU mimarisi, Exception Handling iin bir mekanizma tanmlam ise, oluan
exception durumlarnda sistemin aklmasn engellemek ve bu durumu ynetmek
mmkndr.
Exception durumlar aadaki olaylarda oluur:

apraz Derleme ve Gerekli Ekipmanlar

84

Gml Linux

1. Aritmetik ilemler sonucunda elde edilen deerin register'a smamas ve tama


durumu
2. letim sistemi tarafndan tetiklenen sistem arlar
3. CPU tarafndan bilinmeyen bir instruction gelmesi
OABI toolchain ile derlenmi uygulamalar ARM mimarisinde bu nc durumu sklkla
olutururlar. CPU tarafndan exception retilir ve bu exception sistemin aklmasn
engellemek iin Linux ekirdei ierisinde, FPU instruction'lar yazlm yoluyla emle edilir.
Bylelikle sistemin aklmas engellenmi olur.
Ancak bu sre beraberinde nemli bir performans maliyeti de getirmektedir. zellikle kayan
nokta ilemlerinin sk kullanld uygulamalarda srekli bu ekilde CPU Exception retimi ve
bunun ekirdek tarafndan emlasyonunun yaplmas, context-switch nedeniyle performans
ciddi oranda drmektedir.
EABI, ARM platformu iin yeni ABI versiyonudur. Yukarda bahsedilen context-switch
kaynakl performans sorununu, emlasyon ilemini kullanc kipinde yapmak suretiyle
zmektedir. EABI iin hazrlanm toolchain'lerin rettii obje kodlar ierisinde asla FPU
Instruction'lar yer almaz. Bunun yerine ilgili Instruction'lar, derleme srecinde ayr
fonksiyonlarla emle edilirler. Bu ekilde retilmi bir uygulama hi bir FPU Instruction
retmediinden, CPU Exception durumu olumayacak, context-switch gereklemeyecek ve
ekirdek seviyesinde bu nedenle bir exception handling ve emlasyon yaplmak zorunda
kalmayacaktr.
EABI toolchain'leri ierisinde bu destek n tanml olarak aktive edilmi olabilecei gibi, mfloat-abi=soft eklindeki derleyici parametresi ile de seilebilmektedir. Yaplan testlerde

FPU Instruction'lar youn kullanan uygulamalarn, ekirdek seviyesinde emlasyon yerine


kullanc kipinde bu ekilde emle edilmesi halinde, 5 - 20 kat aras hzlanma salad
grlmtr.
Yeni nesil ARM ilemcilerinde ise bu durum deimeye balamtr. eitli kayan nokta
ilemlerini hzlandrmak iin farkl bir instruction kmesine sahip olan Vector Floating Point
birimi ve sonrasnda da zellikle matris ve vektr ilemlerini hzlandran NEON birimi
ilemcilerde kullanlmaya balanmtr. Donanm tarafnda salanan bu destekler, -mfloatabi=soft eklinde derlenmi olan uygulamalar iin herhangi bir ek fayda salamayacaktr.

Bu nedenle EABI iin hard floating point destekli, eabihf toolchain'leri ortaya kmtr.
Donanmnzn desteklemesi halinde sisteminizde yer alan tm bileenlerin (ktphaneler ve
uygulamalar) eabihf toolchain'i tarafndan derlenmesi halinde, nemli oranda performans
kazanm elde edilebilmektedir. eabihf toolchain'lerinde -mfpu=vfp veya -mfpu=neon
derleyici parametreleri ile donanmza zg hzlandrmalar aktive edebilirsiniz.

apraz Derleme ve Gerekli Ekipmanlar

85

Gml Linux

NOT: ABI versiyonlar iin verdiimiz rnekler ARM mimarisi iin geerlidir. Farkl
mimarilerde farkl ABI'ler bulunmaktadr. rnein MIPS iin o32, o64, n32 ve n64
olmak zere 4 farkl ABI bulunmaktadr. ok daha eski bir mimari olmasna ramen,
bunun gibi pek ok dokmanda rnek olarak dahi yer alamyor olmas, ARM
mimarisinin gml Linux sistemler pazarndaki hakimiyetine dair fikir verebilir. Her
geen yl bu fark almaktadr.

Toolchain Edinme
Toolchain'ler hazr biimde indirilip kullanlabilecei gibi, sfrdan bir toolchain retmek de
mmkndr.
Toolchain retimi olduka zahmetli ve uzun zaman alan bir sretir. Bu sreci
kolaylatrmay amalayan, crosstool ve crosstool-ng projeleri bulunmakla birlikte ou
durumda hazr bir toolchain ile projelere devam edilmesi nerilir. Kendi rettiiniz toolchain
zerinden ilgili mimari iin retilen kodlarda herhangi bir sknt var ise, bunun alglanmas ve
zlmesi ok ciddi zaman kayplar getirebilir. Daha da kts, gelitirme ortamnda her ey
yolundaym gibi grnrken, proje sahaya ktktan sonra kaotik durumlar ile
karlaabilirsiniz.
Hazr bir toolchain kullandnzda byle bir sorunla karlama riskiniz ok daha dktr.
Zira ayn toolchain tm dnyada pek ok projede kullanldndan, toolchain'in kendisinde bir
problem varsa bunun tespit edilmesi ve dzeltilmesi kolay olacaktr. Ayrca donanmn
reticisi tarafndan uzun zaman test edilmi ve mterilere nerilen bir toolchain versiyonu
varsa, elbette onun kullanlmas da uygun olacaktr.
Peki ne zaman sfrdan bir toolchain retmek anlaml olabilir?
ncelikle sylemek gerekir ki, yukarda zel toolchain retiminin dezavantajlar adna
sylediklerimiz donanm reticileri iin de geerlidir. Onlar da tm bu ekosistem tarafndan
retilen bilgi birikimini kullanmak ve kendi toolchain baznda kendilerine zg bir problemi
satn almamamak isterler.
Fakat bazen donanm reticisinden gelen toolchain versiyonu ok eski olabilir. erisinden
kan glibc standart C kitaplnn versiyonu ok dk ise, alageldiiniz baz
fonksiyonlar bulamayacanzdan gelitirme yaparken bir miktar konfor kaybna
urayabilirsiniz.
rnein glibc 2.5 versiyonu kullanlyorsa, asprinf() fonksiyonu C kitaplnda yer
almayacaktr. Veya glibc 2.12 ncesinde bir versiyon kullanlyorsa, getsubopt()
fonksiyonu yer almayacaktr. Bu sorunlar zmek adna versiyonu ykseltmek iin gene
hazr bir toolchain kullanabilirsiniz. Ancak byle bir durumla karlatnzda muhtemelen

apraz Derleme ve Gerekli Ekipmanlar

86

Gml Linux

kullandnz donanm eskidir ya da retici toolchain noktasnda fazla destek sunmuyordur.


Bu noktada donanmza gre zelletirilmi bir toolchain retimi, son are olarak
dnlebilir.

Toolchain Salayclar
Gnmzde ARM platformu gml Linux sistemleri dnyasn domine ettii iin, daha ok
bu platforma zg opsiyonlar incelediimizde, aadaki toolchain salayclarnn ne
ktn grmekteyiz:
Mentor Graphics / Sourcery CodeBench: Destek ile birlikte satlan cretli
versiyonlarnn yan sra, kayt formunu doldurup cretsiz olarak kullanlabilecek Lite
versiyonlar da bulunmaktadr. Uzun yllardr bu alanda alan deneyimli bir firma olup
gml Linux dnyasnda youn bir kullanm mevcuttur. ARM, MIPS, PowerPC,
SuperH mimarileri iin toolchain retimi yapmaktadrlar.
Linaro: zellikle ARM platformu ve hard-float toolchain'ler zerinde almaktadrlar.
Her geen gn kullanm artmaktadr.
Linux Datmlar: Debian GNU/Linux, Ubuntu gibi datmlarda ARM mimarisi iin
gcc-arm-linux-gnueabi ve gcc-arm-linux-gnueabihf paketlerini kurmak suretiyle paket

gelitiricileri tarafndan retilmi toolchain'ler de kullanlabilir

Kullanm
Toolchain arivini sisteminizdeki bir dizine atnzda, arm-none-linux-gnueabi-gcc
rneindeki gibi derleyici aralarna ait dosyalar oluacaktr. Toolchain n ekleri ounlukla
buradakine benzer olmakla birlikte nceki blmlerde deindiimiz ekilde, deikenlik de
gsterebilir.
Eer toolchain ierisinde kullanlan n ek, arm-none-linux-gnueabi- eklinde uzun
olduunda alkanlk, kolaylk vb. nedenlerle, arm-linux- n ekini kullanmak isterseniz,
toolchain bin dizinine gidip, aadaki gibi bir komutla sembolik linkler oluturmak suretiyle,
hem arm-linux-gcc eklinde hem de arm-none-linux-gnueabi-gcc eklinde derleyici
altrmanz mmkn olacaktr:
$ cd /path/to/toolchain/bin && \
for i in `ls`; do s=`echo $i | cut -b 24-`; ln -s $i arm-linux-$s; done

Toolchain ierisinden kan derleyici altrmak iin ya bulunduu yerin mutlak yolunu
(absolute path) vermeli, ya da toolchain bin dizinini PATH ortam deikeninize ekleyip,
sadece derleyici adn vererek altrmalsnz: deikeninimize toolchain bin dizinini
apraz Derleme ve Gerekli Ekipmanlar

87

Gml Linux

ekleyebiliriz:
$ export PATH=$PATH:/path/to/toolchain/bin
$ arm-linux-gcc -v

PATH ortam deikenini bu ekilde her bir kabuk oturumu iin ayarlayabilir veya

kullandnz kabuun her girite okuduu temel konfigrasyon dosyalarndan birine


yazarak sonraki oturumlar iin de kalc hale getirebilirsiniz.

allan Toolchain Hakknda Bilgi Edinme


Toolchain ierisinden kan gcc derleyicisine -v parametresini vermek suretiyle,
toolchain'in oluturulmas srasnda yaplan tercihleri renebiliriz:
$ arm-linux-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gcc

COLLECT_LTO_WRAPPER=/home/demirten/work/downloads/arm-2011.03/bin/../libexec/gcc/arm-none-linux-gnuea
Target: arm-none-linux-gnueabi
Configured with: /scratch/janisjo/arm-linux-lite/src/gcc-4.5-2011.03/configure \
--build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi \
--enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch \
--enable-extra-sgxxlite-multilibs --with-arch=armv5te --with-gnu-as --with-gnu-ld \

--with-specs='%{save-temps: -fverbose-asm} %{funwind-tables|fno-unwind-tables|mabi=*|ffreestanding|no

-D__CS_SOURCERYGXX_MAJ__=2011 -D__CS_SOURCERYGXX_MIN__=3 -D__CS_SOURCERYGXX_REV__=41 %{O2:%{!fno-remo

%{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,

--enable-lto --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery G++ Lite 2011.03-

--with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery

-with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/janisjo/arm

--with-gmp=/scratch/janisjo/arm-linux-lite/obj/host-libs-2011.03-41-arm-none-linux-gnueabi-i686-pc-li
--with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' \

--with-cloog=/scratch/janisjo/arm-linux-lite/obj/host-libs-2011.03-41-arm-none-linux-gnueabi-i686-pc-

--disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/janisjo/arm-lin


Thread model: posix
gcc version 4.5.2 (Sourcery G++ Lite 2011.03-41)

gcc --sysroot parametresi


apraz derleme sreci boyunca sadece glibc standart C kitaplna ihtiya duyan
uygulamalarn derlenmesi olduka kolaydr. Ancak spesifik bir uygulama iin derleme
srecinde ihtiya duyduumuz dier ktphanelerin, apraz derleme hedef sistemi iin de
nceden derlenmi olmas, balk ve ktphane dosyalarnn apraz derleme iin kullanlan
derleyicinin bakt dizinlerden birinde yer almas gereklidir.

apraz Derleme ve Gerekli Ekipmanlar

88

Gml Linux

rnek olarak, eer Sqlite C arayzn kullanan bir uygulama gelitiriyorsanz, uygulamay
apraz derlemeye balamadan nce, sqlite ktphanesini hedef platform iin derlemeli,
balk dosyalarn ve ktphanelerini belirli bir dizinde oluturmalsnz. Bu admdan sonra
yazm olduunuz uygulamay da hedef platform iin derleyebilirsiniz.
rnekten yola karak yle bir soru sorabiliriz: Sqlite ktphanesini bu ekilde derlemek
zorunda kalmak yerine toolchain reticisi ayn derleme ilemini yapp, balk ve
ktphaneleri toolchain ierisine dahil etse daha iyi olmaz myd?
Bu mmkndr hatta baz toolchain'lerde gml sistemlerde sk kullanlan ktphanelerin
nceden derlenip hazr halde sunulduunu grmekteyiz. Toolchain retiminde verilen bu
trden ek kararlar, oluan toolchain'lerin boyutlarnn birbirinden farkl olmasna yol
amaktadr.
Kullanlan toolchain ierisinde ihtiya duyulan tm ktphane ve balk dosyalarnn
bulunmas olanakszdr. Dolaysyla uygulamamzn ihtiya duyduu dier ktphanelerin
derlenmesi ilemi kanlmaz olarak ihtiya duyulduka yaplmas gereken bir sretir.
htiya duyulan tm dosyalar belirli bir dizin yaps altnda birletirebilmemiz halinde apraz
derleme ilemlerini ok daha kolay hale getirebiliriz. rnek olarak /opt/cross eklinde bir
dizin ap, balk dosyalarn /opt/cross/usr/include , ktphane dosyalarn ise
/opt/cross/usr/lib dizini altnda topladmz varsayalm. Yeni nesil gcc derleyicilerinde

yer alan --sysroot parametresi araclyla, derleyicimizin sadece /opt/cross dizini


altnda hazrladmz balk ve ktphane dosyalarna bakmasn salayabiliriz. Bunun iin
derleyiciyi aadaki ekilde armamz yeterli olacaktr:
$ gcc --sysroot=/opt/cross test.c

Sysroot parametresiyle salanan bu kolaylk, Buildroot gibi hedef mimari iin derleme ve
dosya sistemi retimi srelerini modellemeyi amalayan projelerde youn olarak
kullanlmaktadr. Buildroot ile yeni bir projeye balandnda, staging adnda bir dizin
oluturulmakta ve ncelikle toolchain ierisinden kan balk dosyalar staging/usr/include
dizinine, ktphane dosyalar ise staging/usr/lib dizinine kopyalanmaktadr. Sonrasnda
Buildroot ierisinde seilmi tm ktphaneler iin derleme yapldka ortaya kan yeni
ktphane ve balk dosyalar da bu dizinler altnda oluturulmaya devam etmektedir.
Bylelikle host bilgisayarmzdaki /usr/include ve /usr/lib dizin yapsna benzer ekilde
staging dizini altnda bileenler hazr hale getirilmektedir. Yaplan tm apraz derleme

ilemlerinde de --sysroot=staging/ gcc parametresi kullanldndan derleme ilemleri


daha kolay ekilde yaplabilmektedir.

pkg-config
apraz Derleme ve Gerekli Ekipmanlar

89

Gml Linux

pkg-config uygulamas, bir ktphaneyi kullanmak istediinizde vermeniz gereken derleme

zaman parametrelerini belirlemenize yardmc olan bir aratr. rnek olarak xt


ktphanesiyle uygulamamz linklemek istediimizde gerekecek LDFLAGS ve CFLAGS
parametrelerini pkg-config ile u ekilde renebiliriz:
$ pkg-config --libs xt
-lXt -lX11
$ pkg-config --cflags xt
-I/usr/include/X11

Ancak pkg-config uygulamasnn bu bilgileri verebilmesi iin, ilgili ktphane sisteme


kurulurken, pkg-config veritaban dizinine gereken bilgileri ieren .pc uzantl bilgi
dosyasnn da konulmu olmas gerekir. Her ktphane bu ekilde bir .pc dosyas
salamyor olsa da byk ounlukta .pc dosyalar salanmaktadr.
Bu sistemi destekleyen bir ktphaneyi derlediinizde, make install ilemi sonras, .pc
uzantl tanm dosyas da sisteme kopyalanmaktadr. Bu dosyalarn da balk ve ktphane
dosyalarnda olduu gibi, hedef mimari iin ortak bir dizin yaps altnda birletirilmesinde
fayda vardr. Normalde .pc dosyalar host bilgisayarda /usr/lib/pkgconfig dizini altna
kurulur. apraz derleme ilemlerinde ./configure aamasnda --prefix=/usr eklinde
verilmi ise, make install aamasnda DESTDIR ortam deikenini dzenleyerek sysroot
iin hazrladmz dizin yaps altnda hem .pc dosyalarn hem de dier balk ve ktphane
dosyalarn olmas gereken yerlere kopyalayabiliriz:
$ make DESTDIR=/opt/cross install

Bu komut sonrasnda (configure aamasnda verilen prefix deerine bal olarak) balk
dosyalar /opt/cross/usr/include , ktphane dosyalar /opt/cross/usr/lib ve .pc
dosyalar /opt/cross/usr/lib/pkgconfig dizini altna kopyalanacaktr.
DESTDIR ortam deikenini kullanmaz isek kopyalama ilemi hedef platform yerine,

host bilgisayardaki /usr/lib/pkgconfig dizinine kopyalanmaya alr ki bu istediimiz bir


durum deildir.
pkg-config uygulamas ntanml olarak /usr/lib/pkgconfig dizinine bakt iin apraz

derleme senaryolarnda bu duruma mdahale etmez isek, host sisteminde yer alan
ktphaneler iin yantlar reyecektir. PKG_CONFIG_PATH ortam deikenini kullanarak,
uygulamann veritaban olarak farkl bir dizine bakmasn salayabiliriz:
$ PKG_CONFIG_PATH=/opt/cross/usr/lib/pkgconfig ./configure --host=arm-linux

apraz Derleme ve Gerekli Ekipmanlar

90

Gml Linux

Tipik Bir apraz Derleme Senaryosu


Autoconf Uygulamalar
GNU autoconf sistemiyle birlikte gelen ktphane veya uygulamalarn apraz derlenmesi
sreci olduka kolaydr. Toolchain n ekinin --host parametresiyle belirtilmesi yeterlidir.
Toolchain'imizdeki derleyici arm-linux-gcc ise:
$ ./configure --host=arm-linux

eklinde, arm-none-linux-gnueabi-gcc eklinde ise:


$ ./configure --host=arm-none-linux-gnueabi

eklinde configure srecini tamamladmzda, tm Makefile dosyalar doru derleyici


aralarn gsterecek biimde retilecektir.
Autoconf destekli uygulamalarn apraz derleme ilemleriyle bir sre uratktan
sonra, --host parametresi ile hedef platformunu belirtiyor olmamz size biraz tuhaf
veya yanl gelebilir. Hatta ./configure -h ile configure sistemi hakknda yardm
aldnzda, orada --target ve --build eklinde parametreler olduunu daha
grrsnz. apraz derleme sreci bir hedef (target) sistem iin kod retmeyi
amaladna ve genel olarak da host kavram ilemin yapld gelitirme bilgisayarn
gsterdiine gre, --target parametresinin daha anlaml olduunu dnmek
doaldr. Ancak GNU autoconf sisteminde target parametresi, sadece toolchain
retiminde anlaml olan zel bir parametredir. Aadaki rnekte gcc uygulamasnn
kaynak kodundan apraz derlemede kullanlmak zere configure edildiini gryoruz:
$ ./configure --build=i686-pc-linux-gnu --host=arm-linux --target=i686-pc-linux-gnu

Bu rnekte
Kaynak koddan derleme srecinde x86 Linux gelitirme bilgisayarndaki derleme
aralarnn kullanlaca [--build]
lem sonucunda oluacak gcc uygulamasnn ARM zerinde alaca [--host]
Derleme sonras oluacak gcc uygulamasnn x86 mimarisi iin kod retecei [-target]
tanmlanm oluyor. Derleme bittikten sonra oluacak gcc uygulamas ARM zerinde
alacak, ancak rettii kod x86 mimarisi iin olacaktr (ARM zerinden apraz
derlemeyle x86 kodu retilecektir)

apraz Derleme ve Gerekli Ekipmanlar

91

Gml Linux

Derleme ilemi yapacamz ktphane ve uygulamalarn konfigrasyon admlarnda


farkllklar grlebilir. lgili yazlmn ihtiya duyduu dier ktphaneler ve bu ktphanelerin
apraz derlenmi versiyonlarnn nerede bulunabileceini gsterebileceimiz onlarca
parametre bulunmaktadr.
$ ./configure --help

ile bunlar grebiliriz.


Bu noktada yardmmza pkg-config uygulamas koar. PKG_CONFIG_PATH ortam deikeni
dzgn ekilde ayarlanmsa, ek bir ileme gerek kalmakszn ihtiya duyulan dier
ktphanelerin apraz derlenmi versiyonlarna ait bilgiler configure uygulamas tarafndan
bulunabilir.
Ancak bunun mmkn olmad senaryolarda (pkg-config sisteminde tanm olmayan
ktphaneler, standart d dizinlerde kurulu ktphaneler vb.), ortam deikenlerini
kullanarak bu dizinleri gsterebiliriz:
$ CFLAGS="-I/opt/other_build/xxx/include" \
LDFLAGS="-L/opt/other_build/xxx/lib -lxxx" \
./configure --host=arm-linux

Baarl bir configure sonrasnda gerekli tm Makefile dosyalar retilmi olduundan


sonrasnda:
$ make

komutu ile derleme ilemleri yaplr.


Uygulama derlendikten sonra, DESTDIR yntemiyle apraz derlenmi yazlmlar
topladmz mini root filesystem altna kurulum yapabiliriz:
$ make DESTDIR=/opt/custom_build install

Baz eski programlar DESTDIR zel deikenini dikkate almayabilirler, bu durumda el


yordam ile ilgili dosyalarn mini root filesystem altnda yklenmesi gerekecektir.

Autoconf Dndaki Uygulamalarn Derlenmesi


Baz eski uygulamalarda, autoconf iermeyen kk uygulamalarda veya Linux kernel kodu,
busybox gibi baz zel derleme sreleri olan uygulamalarda apraz derleme ileminin nasl
olaca, ilgili sistemle birlikte gelen Makefile dosyalar incelenerek anlalabilir.

apraz Derleme ve Gerekli Ekipmanlar

92

Gml Linux

Linux kernel kodu, busybox gibi uygulamalarn Makefile dosyalarnda aadaki gibi bir
tanm bulunur:
CC = $(CROSS_COMPILE)gcc

Bu ekildeki bir Makefile dosyasnda CROSS_COMPILE deikeni verilmedii mddete


standart gcc derleyicisi alacaktr. Ancak CROSS_COMPILE deikenine arm-linux-
eklinde bir deer atandnda yukardaki satr dorultusunda Makefile ierisinde birletirme
yapldnda C derleyicisini gsteren CC deikeninin deeri apraz derleme iin istediimiz
biimde arm-linux-gcc halini alacaktr. Bu tarz uygulamalar aadaki gibi derleyebiliriz:
$ make CROSS_COMPILE=arm-linux-

Not: Autoconf sistemindeki host parametremizden farkl olarak sondaki - karakterine


dikkat ediniz. Bu gereklilik tamamen Makefile dosyalarndaki kurallarn tanmyla
ilgilidir.
Autoconf destei dndaki bu tarz uygulamalarda ounlukla CROSS_COMPILE ve
CROSS_COMPILE_PREFIX deikenleri kullanlr, bu deikenlere doru toolchain n
ekleri atandnda apraz derleme ilemi gerekletirilir.
Nadiren baz uygulamalarn Makefile dosyalarnda
CC = gcc

dorudan tanmlar da bulunabilmektedir. Bu ekildeki bir uygulamay apraz derlenebilir hale


getirmek iin Makefile dosyalarnda dzenleme yapmaktan baka yntem bulunmamaktadr.

apraz Derleme ve Gerekli Ekipmanlar

93

Gml Linux

NOR, NAND, eMMC ve Flash Tabanl


Depolama
Flash tabanl depolama ortamlar uzun yllardr kullanlyor. Mekanik disklere oranla hareket
eden paralarn olmamas hem grlt orann drmekte hem de daha verimli bir alma
imkan salamaktadr. Ayrca hareket halindeki mobil sistemler iin ok daha dayankl bir
kullanm salamaktadr. Hareket eden mekanik bileenler olmad iin rastgele eriim
performans da yksek olmaktadr. Tm bu saydmz avantajlara ek olarak, mekanik bir
diske oranla g tketimi ok daha dk olmaktadr.
Elbette yukarda saylan tm avantajlarna ramen, flash tabanl depolama aygtlarnn
nemli handikaplar da bulunmaktadr.
Flash tabanl bir aygt zerinde, ayn bloa herhangi bir ey yazmak iin, tm blok ieriinin
silinmesi gerekmektedir. Ancak her bir blok iin yazma mr snrldr. rnlere gre
deikenlik gstermekle birlikte genelde reticiler blok bana 100.000 - 1.000.000 arasnda
deien silme ilemi adedine kadar garanti verebilmektedir.
Blok bana silme mr kst nedeniyle, flash tabanl depolama aygt kullanlrken, ayn blok
zerinde ilem yapmak yerine donanm veya yazlm katmannda bu ilemlerin ynetilmesi
ve sistemdeki tm bloklarn eit sayda kullanlmas salanmaya allr. Depolama aygtnn
mrn uzatmaya ynelik bu ynteme wear leveling ad verilmektedir.

NOR Flash
NOR Flash tipi depolama aygtna ilemci tarafndan dorudan rastgele eriim
yaplabilmekte ve okunan kodlar dorudan altrlabilmektedir (XIP - eXecute-In-Place).
Geleneksel yntemlerin aksine, NOR Flash'tan okunan bir makine kodunun altrlmadan
nce RAM'e kopyalanmasna gerek yoktur.
Bu zellik NOR flash tipini zellikle bootloader, BIOS gibi uygulamalar iin daha iyi bir
seenek haline getirmektedir.
Okuma performans iyi olmasna ramen, yazma performans NAND flash tipine gre
dktr. Bu problem NOR flash'lar genel bir depolama birimi olarak kullanma noktasnda
dezavantajl konuma getirmektedir. Ayrca zaman ierisinde NAND flash kapasitelerinin
artmas ve fiyatlarnn dmesi, NOR flash kullanmn nemli oranda drm ve kullanm
belirli alanlarla snrlanmtr.

NOR, NAND, eMMC ve Flash Tabanl Depolama

94

Gml Linux

NAND Flash
NAND Flash depolama aygt son yllarda geni bir kullanm alan bulmu, birim maliyeti
dm ve kapasitesi artmtr. Ancak NOR Flash tipinden farkl olarak, CPU tarafndan
dorudan eriilip kod altrlamaz. NAND controller zerinden eriilip ierisinde yer alan
kodlar RAM'e aktarldktan sonra ilemci tarafndan iletilebilir.
NAND Flash'n bir dier problemi, retim srecinden belirli bir oranda bozuk blokla
(badblocks) kyor olmasdr. reticiler, %1'e kadar olan bozuk blok orann kabul edilebilir
bulmakta ve yaptklar testlerde bulunan bozuk bloklar, ilgili bloun OOB (Out-Of-Band)
alanna MBBM (Manufacturer's Bad Block Marker) zel iareti ile yazmaktadr.
Fabrika k iaretlenmi bozuk bloklarn yan sra, kullanm srasnda da yeni bozuk
bloklar oluacaktr. Bunlarn alglanmas ve benzer ekilde bir daha kullanlmamas iin
iaretlenmesi gereklidir.
Yukardaki maddeler nda, NAND Flash tabanl bir depolama aygtn verimli
kullanabilmek iin, donanm zerinde veya kernel seviyesindeki yazlmla NAND Flash
zerinde yaplacak ilemlerin ynetilmesi gerekmektedir.
Gnmzde 2 tr NAND Flash depolama aygt bulunmaktadr. Birinci tr, ierdii Flash
Translation Layer sayesinde st katmanda standart bir blok aygt gibi grnrken, ikinci tr
raw flash aygtlar olarak adlandrlr ve iletim sistemi ekirdei tarafndan Controller'a
eriilebilir ve bozuk blok ynetimi iletim sisteminin kontrolnde gerekletirilebilir.

Flash Translation Layer

lk zamanlarda kan PCMCIA flash kartlar, raw flash trnde idi. Bu nedenle zerinde blok
tabanl bir dosya sistemi altrabilmek iin (fat, ext3 vb.) yazlmsal bir FTL srsne ihtiya
vard.
Sonrasnda bu ilemler donanm zerindeki bir controller araclyla firmware ierisinde
yaplmaya baland.

NOR, NAND, eMMC ve Flash Tabanl Depolama

95

Gml Linux

Gnmzde USB Flash Bellek, SSD, eMMC gibi sistemler, firmware tarafndan sunulan FTL
katman sayesinde ek bir srcye ihtiya duyulmakszn, normal bir disk gibi
kullanlabilmektedir. Donanmn firmware'i ilemleri bizim iin yaptndan dolay st
katmanda herhangi blok tabanl dosya sistemi kullanlabilmektedir.
SSD ve byk oranda eMMC'yi kenarda tutarak, dier FTL tabanl depolama ortamlarn
gml Linux projelerinde, endstriyel ilerde kullanmak iyi bir fikir olmayabilir. Bunu biraz
daha aacak olursak:
reticiler FTL ilevini gerekletiren firmware kodunu kapal tuttuklarndan, flash tabanl
bir ortam kullanmaktan gelen kstlar (silme mr, wear-levelling vb.) bu firmware
ierisinde ne derece iyi bir ekilde halletmi olduklarn bilme ansmz kalmaz.
FTL tabanl ortamlarn ou, zerinde FAT gibi basit bir dosya sisteminin altrld,
g kesintilerinde veri kaybna tahamml olan, son kullancya ynelik rnler olarak
tasarlanmaktadr. Endstriyel bir kullanma ynelik tasarlanmamlardr.
FTL controller, dosya sisteminde ne olup bittiini tam olarak bilemeyeceinden, rnek
olarak silinmi dosyalara ait kullanlmayan bloklar iin de ilem yapmaya devam
ederken, raw flash zerinde alan dosya sistemleri, daha iyi bir ynetim yapabilir.
Bu olumsuzluklara ramen, kaliteli bir firmware ve hzl bir controller ile, yksek baarm
salanabilir. SSD ve eMMC aygtlarnn hedef kitlesi nedeniyle retim kaliteleri ortalama
olarak ok daha iyi olduundan daha iyi performans elde edilebilmektedir. Bununla birlikte
controller tarafnda kapal kod ile yaplan ilemler, srecin toplamdaki kalitesi noktasnda bir
phe noktas oluturmaktadr.

Raw NAND Flash


Raw NAND Flash aygtlar iin Linux kernel seviyesinde tam bir kontrol salanabilmektedir.
Farkl ip reticileri bulunduundan kullanlan raw-flash ipi donanmndan bamsz olarak
genel bir kontrol arayz ve katman salayabilmek adna, Linux kernel ierisinde Memory
Technology Device katman gelitirilmitir. Bu sayede raw-flash ip reticileri alt katmanda
donanmlaryla MTD katmannn balantsn saladnda, ilgili ip iin kernel yazlmsal
controller vazifesi grebilmektedir.

eMMC ve Gelecekteki Durum


eMMC aygtlar, NAND Flash depolama aygtnn board zerinde gml (embedded) olup
MMC arayz ile kernel ierisinde standart bir blok aygt gibi almaktadr.

NOR, NAND, eMMC ve Flash Tabanl Depolama

96

Gml Linux

Son 2 ylda giderek artan hzda kullanm alan bulmu olup, kapasite, verimlilik, birim maliyet
gibi alanlarda raw NAND flash aygtlarna gre avantajl hale gelmi, retim hacmi artm ve
srekli fiyatlar dmektedir. Buna bal olarak ok yakn bir gelecekte raw NAND flash
tabanl aygtlar piyasada grememeye veya ok yksek fiyatlardan bulmaya balarsak
almamas gerekir. 2014 sonu itibariyle piyasaki bir ok board, depolama birimi olarak raw
NAND flash yerine, eMMC veya MMC ile gelmektedir.

NOR, NAND, eMMC ve Flash Tabanl Depolama

97

Gml Linux

Memory Technology Device - MTD Katman


MTD katman, donanm spesifik raw flash aygt srcleri ile bunlar kullanacak st seviyeli
katmanlar arasnda bir soyutlama yaplabilmesini salar.
raw flash tabanl ortamlarda kullanlr.
MTD katman tarafndan alglanan aygtlar, /proc/mtd dosyasndan grntlenebilir:
$ cat /proc/mtd
dev: size erasesize name
mtd0: 00020000 00020000 "u-boot env"
mtd1: 00020000 00020000 "UBL"
mtd2: 00080000 00020000 "u-boot"
mtd3: 00400000 00020000 "kernel"
mtd4: 08000000 00020000 "filesystem1"
mtd5: 07a00000 00020000 "filesystem2"

MTD Karakter Aygt Destei


mtdchar srcs sistemde alglanan her bir MTD blmne (partition) karlk, karakter
tabanl eriimi simle edecek bir karakter aygt oluturur.
Major numaras 90 (5A) eklindedir. simlendirmesi /dev/mtdXX eklinde yaplr.
Read-Only eriimler iin tek sayl minor numaralar, read-write eriim iin ift sayl minor
numaralar kullanlr.
raw flash zerinde yaplacak ilemler ve silme operasyonlar iin ek ioctl arlar ierir.
Genellikle mtd-utils paketinden kan uygulamalar tarafndan kullanlr.

MTD Blok Aygt Destei


mtdblock srcs sistemde alglanan her bir MTD blmne (partition) karlk, blok
tabanl eriimi simle edecek bir blok aygt oluturur.
Major numaras 31 (1F) eklindedir. simlendirmesi /dev/mtdblockXX eklinde yaplr.
Minor numaras, MTD blmnn numarasn gsterir.

Memory Technology Device - MTD Katman

98

Gml Linux

Blok tabanl okuma-yazma operasyonlarn destekler. Ancak bozuk blok ynetimi, yazma
operasyonlarnn farkl bloklara datlmas (wear-levelling) gibi destekleri bulunmamaktadr.

MTD Partitioning (Blmlendirme)


MTD aygtlar, bir gereklilik olmamakla birlikte, ou durumda blmlendirme yaplarak
kullanlrlar.
Bu ekilde MTD aygtnn farkl alanlarn, farkl zelliklerde (read-write, read-only vb.) ve
amalarda kullanmak kolaylar.
Blok tabanl aygtlarda mevcut olan blmlendirme tablosu (partition table) yaps, MTD
aygtlarnda yer almaz.
Bu nedenle blmlendirme tablosunun nasl olduunun harici bir yerde saklanmas gerekir.
Bu harici yer, kernel kodunun ierisinde hard-coded biiminde veya kernel al
parametreleri sayesinde her alta parametrelerin okunmas suretiyle gereklenir.
Redboot gibi baz boot ykleyici uygulamalar, sabit disk gibi aygtlara benzer ekilde
blmlendirme tablosunu MTD aygtnn belirli bir yerinde tutma alternatif yntemiyle de
alabilmektedirler. Bu senaryoda kernel tarafndan ilgili blmlendirme kurallarnn okunup
anlalabilmesi iin, kernel derleme srecinde Redboot Partition Table Parsing seeneinin
aktifletirilmesi gereklidir.

MTD Partitioning
Hardcode Yntemi
Dorudan ilgili MTD srcs ierisinde yaplr. rnek olara arch/arm/mach-omap2/boardomap3beagle.c ierisine bakalm:

Memory Technology Device - MTD Katman

99

Gml Linux

static struct mtd_partition omap3beagle_nand_partitions[] = {


/* All the partition sizes are listed in terms of NAND block size */
{
.name = "X-Loader",
.offset = 0,
.size = 4 * NAND_BLOCK_SIZE,
.mask_flags = MTD_WRITEABLE, /* force read-only */
},
{
.name = "U-Boot",
.offset = MTDPART_OFS_APPEND, /* Offset = 0x80000 */
.size = 15 * NAND_BLOCK_SIZE,
.mask_flags = MTD_WRITEABLE, /* force read-only */
},
{
.name = "U-Boot Env",
.offset = MTDPART_OFS_APPEND, /* Offset = 0x260000 */
.size = 1 * NAND_BLOCK_SIZE,
},
{
.name = "Kernel",
.offset = MTDPART_OFS_APPEND, /* Offset = 0x280000 */
.size = 32 * NAND_BLOCK_SIZE,
},
{
.name = "File System",
.offset = MTDPART_OFS_APPEND, /* Offset = 0x680000 */
.size = MTDPART_SIZ_FULL,
},
};

Bu modelde alan ekirdek yeniden derlenmeden, blmlendirme tablosunu deitirmek


mmkn olmaz. Kulaa ho gelmiyor olsa da pek ok sistem bu ekilde almaktadr.
Gml sistemlerin dizayn yapldktan sonra sahadaki kullanmnda sonradan
blmlendirme tablosunun yeniden yaplandrlmas ihtiyac genellikle olumaz. Byle bir
ihtiyacn olumas durumu, muhtemel bir tasarm sreci problemine iaret eder.

Kernel Parametresiyle Blmlendirme


Kernel al parametresi olarak aadaki formatta deer girilmek suretiyle blmlendirme
tablosunu tanmlamak mmkndr:
mtdparts=davinci_nand:4m(kernel)ro,32m(rootfs)ro,100m(data),-(archive)

Bu rnekte;
4 MB Kernel iin read-only,

Memory Technology Device - MTD Katman

100

Gml Linux

32 MB kk dosya sistemi iin rootfs adnda read-only,


100 MB data adnda genel bir yazlabilir blm
Ve flash'n geri kalan ksmnn tamamndan oluan archive adnda bir blm daha
oluturulmutur.
Kernel'n ilgili flash ipini hangi anahtar kelime zerinden tandn nceden renmek veya
al loglarndan takip etmek gerekir. Bu rnekte anahtar kelime davinci_nand eklindedir.
Sistemde birden fazla NAND flash ipi de bulunabilir. Bu ekilde hangi src zerinden
hangi ipe erimek istediimizi de belirtmi oluyoruz. Ayn srcde birden fazla ip
olduunda, instance numaras da kullanlr.

MTD Blmnn Silinmesi


Bir MTD blmnn tamamnn veya belirli saydaki blokunun silinmesi iin mtd-utils
paketinden kan flash_erase uygulamas kullanlr:
flash_erase <mtd_device> <offset> <block_count>

Offset deeri olarak 0 ve block count deeri olarak 0 girilmesi durumunda, tm blm
silinir.
Bloklar daha nceden kilitlenmi durumda ise, -u parametresi ile veya flash_unlock
uygulamas ile kilit kaldrlr.
rnek kullanm:
flash_erase -u /dev/mtd3 0 0

MTD Blmne Yazma


Bir MTD blmne yazma (dosyasistemi imajn) ilemi iin mtd-utils paketinden kan
flashcp ve nandwrite uygulamalar kullanlr.

nandwrite -p <mtd_device> <file_name>


flashcp <file_name> <mtd_device>

nandwrite uygulamas NAND flash tipinde, flashcp uygulamas NOR flash tipinde kullanlr.
nandwrite uygulamas biraz daha yetenekli olu, padding vb. gibi daha fazla seenek
sunmaktadr.

Memory Technology Device - MTD Katman

101

Gml Linux

rnek kullanm:
nandwrite -p /dev/mtd3 /tmp/jffs.image
flashcp /tmp/jffs.image /dev/mtd3

MTD Aygt Simlasyonu


Gelitirme ortamnzdaki bilgisayarda NAND flash bulunmayaca iin srekli bir cihaz
zerinde almann mmkn olmad senaryolarda, nandsim modl zerinden NAND
flash ortamn simle etmeniz mmkndr.
NAND simulator (nandsim) NAND flash aygtn RAM veya bir dosya zerinde simle eder.
nandsim modln yklerken simlasyonun durumunu etkileyecek pek ok modl

parametresi bulunmaktadr. Balca modl parametreleri aadaki gibidir:


first_id_byte : NAND flash zerinden okunacak ilk byte'n ne olacan gsterir ( read
ID komutuna dnen cevap, manufacturer ID deeri olarak yorumlanacaktr). Kernel

kaynak kodu ierisindeki include/linux/mtd/nand.h dosyasnda NAND retici kodlar


tanmldr.
second_id_byte : NAND flash zerinden okunacak ikinci byte'n ne olacan gsterir

( read ID komutuna dnen cevap, chip ID deeri olarak yorumlanacaktr).


drivers/mtd/nand/nand_ids.c dosyasnda chip ID deerleri yer almaktadr. rnek

olarak 0x78 chip ID deeri, 128MiB 1,8V 8-bit NAND iken, 0xC5 2GiB 3,3V 16-bit
NAND ipini gsterir.
Bunlarn haricinde nandsim modlnn 20 kadar daha parametresi bulunmaktadr.
Parametrelerin listesini modinfo komutuyla alabilirsiniz:

Memory Technology Device - MTD Katman

102

Gml Linux

$ sudo modinfo nandsim

parm: first_id_byte:The first byte returned by NAND Flash 'read ID' command (manufacturer ID) (ui
parm: second_id_byte:The second byte returned by NAND Flash 'read ID' command (chip ID) (uint)
parm: third_id_byte:The third byte returned by NAND Flash 'read ID' command (uint)
parm: fourth_id_byte:The fourth byte returned by NAND Flash 'read ID' command (uint)
parm: access_delay:Initial page access delay (microseconds) (uint)
parm: programm_delay:Page programm delay (microseconds (uint)
parm: erase_delay:Sector erase delay (milliseconds) (uint)
parm: output_cycle:Word output (from flash) time (nanoseconds) (uint)
parm: input_cycle:Word input (to flash) time (nanoseconds) (uint)
parm: bus_width:Chip's bus width (8- or 16-bit) (uint)
parm: do_delays:Simulate NAND delays using busy-waits if not zero (uint)
parm: log:Perform logging if not zero (uint)
parm: dbg:Output debug information if not zero (uint)
parm: parts:Partition sizes (in erase blocks) separated by commas (array of ulong)
parm: badblocks:Erase blocks that are initially marked bad, separated by commas (charp)

parm: weakblocks:Weak erase blocks [: remaining erase cycles (defaults to 3)] separated by commas

parm: weakpages:Weak pages [: maximum writes (defaults to 3)] separated by commas e.g. 1401:2 mea
parm: bitflips:Maximum number of random bit flips per page (zero by default) (uint)

parm: gravepages:Pages that lose data [: maximum reads (defaults to 3)] separated by commas e.g.

parm: overridesize:Specifies the NAND Flash size overriding the ID bytes. The size is specified i
parm: cache_file:File to use to cache nand pages instead of memory (charp)
parm: bbt:0 OOB, 1 BBT with marker in OOB, 2 BBT with marker in data area (uint)
parm: bch:Enable BCH ecc and set how many bits should be correctable in 512-byte blocks (uint)

imdi Fujitsu reticisi iin (0x04), 128 MiB'lk NAND flash (0x78) ipini simle edelim:
$ sudo modprobe nandsim first_id_byte=0x04 second_id_byte=0x78

Sonrasnda dmesg komutuyla kernel buffer alannn son ksmna bakalm:

Memory Technology Device - MTD Katman

103

Gml Linux

$ dmesg
[14399.796192] nand: device found, Manufacturer ID: 0x04, Chip ID: 0x78
[14399.796192] nand: Fujitsu NAND 128MiB 1,8V 8-bit
[14399.796193] nand: 128MiB, SLC, page size: 512, OOB size: 16
[14399.796203] flash size: 128 MiB
[14399.796203] page size: 512 bytes
[14399.796204] OOB area size: 16 bytes
[14399.796205] sector size: 16 KiB
[14399.796205] pages number: 262144
[14399.796206] pages per sector: 32
[14399.796206] bus width: 8
[14399.796207] bits in sector size: 14
[14399.796207] bits in page size: 9
[14399.796208] bits in OOB size: 4
[14399.796209] flash size with OOB: 135168 KiB
[14399.796209] page address bytes: 4
[14399.796210] sector address bytes: 3
[14399.796210] options: 0x42
[14399.796646] Scanning device for bad blocks
[14399.803631] Creating 1 MTD partitions on "NAND 128MiB 1,8V 8-bit":
[14399.803635] 0x000000000000-0x000008000000 : "NAND simulator partition 0"
$ cat /proc/mtd
dev: size erasesize name
mtd0: 08000000 00004000 "NAND simulator partition 0"

Artk kernel asndan normal bir MTD aygtmz olumu oldu. MTD aygtlar zerindeki tm
ilemleri burada yapabiliriz (Jffs2, Ubi, Ubifs almalar, flash_erase , nandwrite vb.)

Memory Technology Device - MTD Katman

104

Gml Linux

Unsorted Block Images - UBI Katman


UBI zerinde ilem yapabilmek iin, kontrol arayz olan /dev/ubi_ctrl dosyas sistemde
yer almaldr.
Bu zel dosyann sabit bir major:minor numaras bulunmaz ve dinamik major:minor
allokasyonu kullandndan, ntanml major:minor deerlerin sistemde halihazrda
kullanmda olmas durumuna kar, farkl deerler de oluabilir.
Sistemde udev veya devtmpfs gibi, /dev dizini altndaki aygt dosyalarn otomatik oluturan
bir ara kullanmyorsanz, /dev/ubi_ctrl dosyasn elle oluturmanz gerekecektir.
Doru major:minor numaralarn, /sys/class/misc/ubi_ctrl/dev dosyasndan rendikten
sonra (rnek: 10 ve 63) aadaki gibi oluturabilirsiniz:
mknod /dev/ubi_ctrl c 10 63

UBI Attach lemi


UBIFS dosya sistemini kullanabilmek iin sistemde ncelikle UBI volume'lerin oluturulmas
gereklidir.
UBI destei kernel ierisinde mevcut ise, kernel al parametresiyle UBI attachment
aadaki ekilde ayarlanabilir:
ubi.mtd=rootfs
veya
ubi.mtd=3

Yukardaki rnekte, daha nceden blmlendirilmi ve blm etiketi olarak "rootfs" verilmi
olan /dev/mtd3 blm, bir UBI aygt olarak sisteme eklenmektedir.
Flash zerindeki blmlendirme etiketleri kullanlabilecei gibi, dorudan MTD blm
numaras da kullanlabilmektedir.
UBI destei modl olarak derlenmi ise, ubi modlne yklenirken yukardaki gibi
parametreler geilmelidir.
UBI Attach ve UBI Detach ilemleri, mtd-utils paketinden kan ubiattach ve ubidetach
uygulamalar kullanlarak da yaplabilir.

Unsorted Block Images - UBI Katman

105

Gml Linux

/dev/mtd3 blmn attach etmek iin:


ubiattach /dev/ubi_ctrl -m 3

/dev/mtd3 iin mevcut attachment' sonlandrmak iin:


ubidetach /dev/ubi_ctrl -m 3

Not: UBI komutlarnda kontrol aygt ismi verilmediinde ntanml olarak /dev/ubi_ctrl
varsaylr.
Soru: Root dosya sistemi olarak UBIFS kullanldnda attachment ilemi nasl yaplabilir?
UBI Attach ilemi tamamlandnda udev veya devtmpfs gibi /dev dizini altndaki aygt
dosyalarn yneten bir mekanizma kullanyorsanz otomatik olarak srasyla /dev/ubi0 ,
/dev/ubi1 eklinde attach edilen aygtlara ilikin dosyalar oluacaktr.

Bu ekilde bir sistem kullanmyorsanz bu dosyalar mknod uygulamasyla elle oluturmanz


gerekecektir. Bu ekilde elle oluturma durumu szkonusu ise, gereken major:minor
numaralarn /sys/class/ubi/ubi0/dev dosyasndan renebilirsiniz (rnek: 253 ve 0)
Sonrasnda aadaki komuta benzer ekilde ilgili aygt dosyasn oluturabilirsiniz:
mknod /dev/ubi0 c 253 0

Volume Ynetimi
UBI sisteminde attach edilmi olan MTD aygtlar zerinde, UBI katmannda mantksal
volume birimleri oluturulmaldr.
rnek olarak 600 MB boyutundaki /dev/mtd3 ubiattach ile sisteme /dev/ubi0 eklinde
eklenmi olsun. Bu UBI aygt zerinde ok sayda UBI volume birimi oluturmamz
mmkndr. Bu ilem iin ubimkvol uygulamas kullanlacaktr.
rnek olarak bu alan zerinde 100 MB, 200 MB ve 300 MB boyutlarnda 3 adet volume
birimi oluturalm:
ubimkvol /dev/ubi0 -N test0 -s 100MiB
ubimkvol /dev/ubi0 -N test1 -s 200MiB
ubimkvol /dev/ubi0 -N test2 -m

-N parametresi ile birimlere etiket atanmaktadr

nc komutta -m parametresi ile kalan maksimum alan ayrlmtr.


Unsorted Block Images - UBI Katman

106

Gml Linux

Mevcut bir UBI volume birimini silmek iinse ubirmvol uygulamas kullanlr.
Etiketi test2 olan volume birimini kaldrmak iin:
ubirmvol /dev/ubi0 -N test2

Etiket yerine volume birim numaralar da kullanlabilir:


ubirmvol /dev/ubi0 -n 2

Unsorted Block Images - UBI Katman

107

Gml Linux

Gml Sistemlerde Kullanlan Dosya


Sistemleri
Gml sistemlerde genellikle flash tabanl depolama alan kullanlmaktadr.
SSD, MMC, SD kartlar, USB flash diskler, Memory Stick, Compact Flash kartlar ve benzeri
FTL (Flash Translation Layer) kullanan aygtlar, flash tabanl olarak nitelendirilmezler.
Flash Translation Layer, ilgili aygtn normal bir disk gibi grnmesini ve zerinde blok
tabanl ilemler yaplabilmesini salar.
Flash tabanl sistemlere rnek olarak NAND ve NOR flash chip'lerini verebiliriz.
Flash tabanl sistemler Linux altndaki MTD (Memory Technology Device) alt sistemi ile
ynetilirler.

Aygt (Device) Tipleri


Linux altnda 2 aygt tipi bulunur:
Karakter Tabanl Aygtlar

Blok Tabanl Aygtlar

Sabit bir boyutu yoktur

Sabit bir boyut bulunur

Rastgele eriim modu tanml deildir

Rastgele eriim yaplabilir

Veri eriimlerinde tampon kullanlmaz

Eriimlerde tampon kullanlr

Raw Flash tabanl aygtlar ise ne bir karakter aygt gibi, ne de tam olarak blok aygt gibi
davranrlar.

MTD ve Blok Aygtlar

Gml Sistemlerde Kullanlan Dosya Sistemleri

108

Gml Linux

MTD Aygtlar

Blok Tabanl Aygtlar

eraseblock'lardan oluur

sektr'lerden oluur

eraseblock'lar genellikle 128KB gibi byk


deerlerde olur

sektrler 512, 1024 byte gibi kk


deerlerdedir

3 temel operasyonu destekler:


eraseblock'tan okuma, eraseblock'a yazma
ve eraseblok'u silme

2 temel operasyonu destekler: sektrden


okuma ve sektre yazma

Bozuk eraseblock'lar yazlm tarafnda


kontrol edilmelidir

Bozuk sektrler donanm tarafndan


kontrol edilir ve yazlmda bir ey
yapmak gerekmez

eraseblock'lar 10000 silme ileminden


sonra genellikle bozulmaya balar

sektrler iin benzeri bir bozulma sz


konusu deildir

Gml Sistemlerde Kullanlan Dosya Sistemleri

109

Gml Linux

JFFS2 Dosya Sistemi


Journalling Flash FileSystem'in 2. versiyonudur. David Woodhouse tarafndan gelitirilmi
olup 2.4.10 kernel versiyonundan itibaren Linux kaynak kodu ile birlikte datlmaya
balanmtr.
Blok tabanl aygtlar zerinde deil, raw flash aygtlar zerinde alr. Journal desteiyle
alt iin, ani g kesintilerinden sonra dosya sistemini kararl bir yapya
dndrebilmektedir. Kendisinden nceki ilk versiyona gre aadaki ek zelliklere sahiptir:
NAND flash desteimo
Hard link oluturabilme destei
Dosya sistemini sktrlm formda kullanma destei
Performans artran yeni garbage collection mekanizmas

Dezavantajlar
Aada sralanan temel sebeplerden tr JFFS2 kullanm gnmzde olduka azalmtr:
Tm node'larn mount ilemi srasnda taranmas ihtiyac gerektiinden, flash
kapasitelerinin GigaByte seviyelerine ulamas nedeniyle ok uzun mount sreleri
gerektirmesi
ok sayda kk dosyann yazlmas durumunda sktrma desteinin negatif bir etki
retmesi
Bellekte her node iin bir veri yaps tuttuundan kullanlan alan arttka bellek
kullanmnn artmas ve performansn dmesi
Tamamen senkron alan bir dosya sistemi olduundan yazma ilemleri dorudan flash
ortama yaplr. ok sayda dosya zerinde kk deiiklikler yapldka sktrma
ilemleri de tekrar yaplr, zamanla fragmentation artar, performans der.
Yukarda saylan nedenler yznden yerini byk oranda UBIFS'e brakmasna karlk,
dosya sistemi iin ayrlm alann ok kk olduu senaryolarda (rnein konfigrasyon
ilemleri iin 1 MB'lk bir blm ayrm olabilirsiniz), UBIFS overhead'i fazla olduundan
birinci alternatif olmaktadr.

JFFS2 Dosya Sistemi

110

Gml Linux

Kullanm
Bir MTD blm JFFS2 formatnda veri iermese dahi, blok tipi aygt ismi zerinden jffs2
trnde dorudan mount edilmeye alldnda ilem baarl olur, ancak bu yntem
nerilmez.
Bunun yerine ncelikle ilgili MTD blmnn flash_erase ile silinmesi gereklidir:
flash_erase /dev/mtd8 0 0

Sonra mount ilemi aadaki gibi gerekletirilebilir:


mount -t jffs2 /dev/mtdblock8 /mnt

flash_erase ile yaplan silme ileminin MTD'nin istenilen blmne ait karakter aygt

dosyas zerinden, mount ileminin ise gene MTD'nin ayn blmne ait blok aygt
dosyas zerinden gerekletirildiine dikkat ediniz.
Not: jffs2 dosya sistemi raw flash iplerine zel retilmi olmasna ramen ilgili MTD
blmn mount uygulamasna mtdblock emlasyonu zerinden gsteriyor olmamz,
tamamen mount uygulamasnn blok tabanl aygt arayzleri ile almasndan
kaynaklanmaktadr. Mount sonras jffs2 tarafndan mdtblock emlasyon katman
kullanlmaz.
Yukardaki rnekte mount ilemi sonras /mnt dizini altna kopyalama yapmak suretiyle ilgili
blme yazlabilir.

Dosya Sisteminin Yazlmas


Bir MTD blmn flash_erase ile silip jffs2 trnde mount ettikten sonra standart
yntemlerle kopyalama yaparak ilerlemek yerine, dosya sistemini baka bir yerde oluturup,
tm dosya sistemine ait jffs2 imajn hazrlayp tek seferde kopyalamak da mmkndr.
Bunun iin flash_erase ile ilgili MTD blm silindikten sonra, nandwrite ile imajn
yazlmas salanr:
flash_erase /dev/mtd8 0 0
nandwrite -p /dev/mtd8 /tmp/jffs.image

Ardndan ilgili blm mount edildiinde, imaj ierisinde yer alan verilere ulalabilecektir:

JFFS2 Dosya Sistemi

111

Gml Linux

mount -t jffs2 /dev/mtdblock8 /mnt

maj Oluturma
Gelitirme yaplan bilgisayardaki bir dizin hiyerarisini jffs2 imajna evirmek iin, mtd-utils
paketinden kan mkfs.jffs2 uygulamas kullanlr. rnek kullanm:
mkfs.jffs2 -p -n -e 128 -d /dizin -o /tmp/jffs.img

-p parametresi ile eraseblock'larn sonuna dek padding yaplmas salanr.


-n parametresi cleanmarker'larn konmamas gerektiini belirtir. Cleanmarker zel bir

JFFS2 node'udur ve blok silme ileminin dzgn tamamlandn tutmak iin kullanlr.
NAND flash tiplerinde bu bilgi OOB alannda tutulduundan cleanmarker node'larn
istemiyoruz, NOR flash tiplerinde ise bu gereklidir.
-e parametresi ile eraseblock bykln belirtiyoruz, kullanlan flash tipine gre

doru deerin ne olduu renilmelidir. Burada 128 KB verilmitir.

Erase Block Summary


EBS hesaplamasnn temel amac mount sresinin ksaltlmasdr.
Temel mantk, zet (summary) bilgilerinin her eraseblock sonunda tutulmasndan ibarettir.
Bu sayede mount esnasnda tm node'larn taranmasna gerek kalmaz ve sadece zet
bilgiler okunur.
mkfs.jffs2 ile oluturulan imaj dosyasna summary bilgilerini eklemek iin mtd-utils

paketinden kan sumtool uygulamas kullanlr. rnek:


sumtool -p -n -e 128 -i /tmp/jffs.img -o /tmp/jffs-summed.img

Bu yntem hem NOR hem de NAND tipi flash'lar ile almaktadr. NAND flash tiplerinde hz
art daha ok olur.

Loopback Mount

JFFS2 Dosya Sistemi

112

Gml Linux

Gelitirme yaplan PC mimarisindeki bilgisayarda muhtemelen raw flash aygt


bulunmayacandan tr, jffs2 imajn bilgisayarmzda mount etmek iin, MTD emlasyon
modln kullanabiliriz. zlenmesi gereken admlar srasyla:
Eraseblock bykl bulunur ve byte cinsine evrilir (128 Kb = 131072 byte)
losetup ile imaj dosyasndan bir loopback device oluturulur:

$ sudo losetup /dev/loop0 /tmp/jffs.image

mtdblock modl yklenir:


$ sudo modprobe mtdblock

block2mtd modl aadaki ekilde yklenir:


$ sudo modprobe block2mtd block2mtd=/dev/loop0,131072

Oluan mtdblock aygt mount edilir:


$ sudo mount -t jffs2 /dev/mtdblock0 /mnt

JFFS2 Dosya Sistemi

113

Gml Linux

YAFFS2 Dosya Sistemi


Yet Another Flash Filesystem'in ikinci versiyonu olup, raw flash aygtlar zerinde alan
bir dosya sistemidir.
Charles Manning tarafndan Yeni Zelanda kurululu Aleph One firmas iin gelitirilmitir.
Kk ve kolay port edilebilir bir yapya sahip olduundan, Linux dndaki ortamlarda ve
zellikle eitli kapal kodlu gml sistemlerde de kullanm alan bulmutur. Kapal kodlu
sistemlerde kullanlabilmesi iin ikinci bir lisanslama opsiyonu sunmaktadr.
JFFS2'ye gre tek eksii sktrlm dosya sistemi modunda alamyor olmasdr.
Bununla birlikte dier tm alanlarda JFFS2'den daha iyi performans verir.
Gnmzde yerini UBIFS'e brakmaya balamtr.

Kullanm
Bir MTD blm YAFFS2 formatnda veri iermese dahi, blok tipi aygt ismi zerinden yaffs2
trnde dorudan mount edilmeye alldnda ilem baarl olur, ancak bu yntem
nerilmez.
ncelikle ilgili MTD blmnn flash_erase ile silinmesi gereklidir:
flash_erase /dev/mtd8 0 0

Sonra mount ilemi aadaki gibi gerekletirilebilir:


mount -t yaffs2 /dev/mtdblock8 /mnt

Mount ilemi sonras /mnt dizini altna kopyalama yapmak suretiyle ilgili blme yazlabilir.

Dosya Sistemi majnn Yazlmas


Bir MTD blmn flash_erase ile silip yaffs2 trnde mount ettikten sonra standart
yntemlerle dosyalar kopyalayarak ilerlemek yerine, dosya sistemini baka bir yerde (kendi
bilgisayarmzda) oluturup, yaffs2 imajn hazrlayp tek seferde bu hazrlanan dosya sistemi
imajn kopyalamak da mmkndr.

YAFFS2 Dosya Sistemi

114

Gml Linux

Bunun iin flash_erase ile ilgili MTD blm silindikten sonra, nandwrite ile imajn
yazlmas gerekletirilebilir.
flash_erase /dev/mtd8 0 0
nandwrite -a -o /dev/mtd8 /tmp/yaffs.image

Ardndan ilgili blm mount edildiinde, imaj ierisinde yer alan verilere ulalabilecektir:
mount -t yaffs2 /dev/mtdblock8 /mnt

maj Oluturma
Gelitirme yaplan bilgisayardaki bir dizin yapsn yaffs2 imajna evirmek iin, yaffs2utils
paketinden kan mkyaffs2 uygulamas kullanlr. rnek kullanm:
mkyaffs2 /work/dir /tmp/yaffs.img

lk parametre olarak imaj oluturulacak olan dizin belirtilir.


kinci parametre ise imajn nereye kartlacan gsterir.
yaffs2utils: http://code.google.com/p/yaffs2utils

YAFFS2 Dosya Sistemi

115

Gml Linux

UBIFS Dosya Sistemi


UBIFS (Unsorted Block Image File System), JFFS2 gibi raw flash aygtlar zerinde alan
bir dosya sistemidir.
Nokia mhendisleri ve Szeged niversitesi'nin (Macaristan) katklaryla gelitirilmitir.
Kernel 2.6.27 versiyonundan itibaren Linux kaynak kodu ile birlikte datlmaya balanmtr.
JFFS2'den farkl olarak dorudan MTD aygtn zerinde deil, Unsorted Block Images
aygtlar zerinde alr.
UBI ise MTD aygtnn zerinde almaktadr.

Tasarm Prensipleri
UBIFS'in tasarmndaki temel hedefler:
Artan flash kapasiteleriyle byk dosya sistemleriyle performansl almak
Mount sresinin ksaltlmas
Yazma hznn artrlmas
Byk dosyalara hzl eriim
eklinde zetlenebilir.

Kullanm
Oluturulan bir UBI volume birimi, ierisinde dosya sistemi henz olmasa dahi ubifs trnde
mount edilebilir:
mount -t ubifs ubi0:test1 /mnt

Mount ileminde etiketler kullanlabildii gibi, volume birim numaralar da kullanlabilir:


mount -t ubifs ubi0:1 /mnt

UBIFS maj Oluturma


UBIFS Dosya Sistemi

116

Gml Linux

Mevcut bir dizinden UBIFS imaj oluturmak iin mtd-utils paketinden kan mkfs.ubifs
uygulamas kullanlr.
mkfs.ubifs -m 512 -c 100 -e 128KiB -x lzo -r /work/dir /tmp/ubifs.img

-m parametresi minimum IO ilem bykln gsterir


-c parametresi ile maksimum logical eraseblock adedi belirlenir.
-x parametresi ile sktrma algoritmas seilir.
-r parametresi ile imaj oluturulacak olan dizin belirtilir.

maj oluturulmas tamamlandktan sonra ubiupdatevol uygulamas ile bu volume imaj,


volume birimi zerine yazlr:
ubiupdatevol /dev/ubi0_0 /tmp/ubifs.img

UBI maj Oluturma


Mevcut bir UBI aygt (/dev/ubi0) bir veya birden fazla UBI volume biriminden oluabilir.
Bu durumda bir UBI aygtnn imaj oluturulacak olursa, ubiformat uygulamas ile baka bir
UBI aygt zerine yazldnda, ayn volume birimleri de oluturulmu olacaktr.
ubiformat /dev/mtd0 -f /tmp/ubi.img

UBI imaj oluturmak iin mtd-utils paketinden kan ubinize uygulamas kullanlr.
Ubinize uygulamasn altrmadan nce, INI formatnda bir konfigrasyon dosyas
oluturulmaldr.
rnek kullanm:
ubinize -o /tmp/ubi.img -m 512 -p 128KiB ubinize.cfg

Konfigrasyon dosyas ierii:

UBIFS Dosya Sistemi

117

Gml Linux

# ubinize.cfg
[rootfs_volume]
mode=ubi
image=rootfs.ubifs
vol_id=1
vol_type=static
vol_name=rootfs
vol_alignment=1
[data_volume]
mode=ubi
image=data.ubifs
vol_id=2
vol_type=dynamic
vol_name=data
vol_alignment=1
vol_flags=autoresize

Root Dosya Sistemi Olarak UBIFS


Root dosya sistemi olarak UBIFS kullanlmak istendiinde, kernel al parametrelerine
aadaki deerler eklenmelidir:
ubi.mtd=0
root=ubi0:rootfs_label
rootfstype=ubifs
rootfs_label ilgili UBI aygt zerindeki volume birim etiketini gstermektedir.

UBIFS - Write-Back Destei


JFFS2 dosya sistemi write-through modunda alr ve deiiklikler senkron biimde NAND
flash'a yazlr.
UBIFS ise write-back destei sayesinde, asenkron modda almaktadr.
Her tr write sistem ars ile yaplan yazma ilemleri, Linux'te ncelikle page cache'lere
yazlr.
Page Cache, genel bir bellek ynetim mekanizmasdr.
Bir dosyaya yazmaya altnzda veriler aslnda bellekteki page cache'e yazlr ve ilgili
page'ler dirty olarak iaretlenir. Bu aamada sistem baarl bir deer dndrr ama
gerekte veriler fiziksel olarak henz yazlm deildir. Asl yazma ilemi, baz parametrelere
bal olarak daha sonra gerekleir.

UBIFS Dosya Sistemi

118

Gml Linux

Yazma Operasyonlar ve Page Cache


Yazma ilemlerinde Page Cache kullanmndan kaynaklanan bu durumla ilgili write sistem
arsnn aklamalarnda yer alan nemli notu tekrar vurgulamamz, uygulama gelitirme
srecinde tespiti zor hatalarla karlamamamz iin yerinde olacaktr:
$ man 2 write
...
NOTES
A successful return from write() does not make any guarantee that data
has been committed to disk. In fact, on some buggy implementations,
it does not even guarantee that space has successfully been reserved
for the data. The only way to be sure is to call fsync(2) after you
are done writing all your data.

Linux write-back Konfigrasyonu


Linux sistemlerde /proc/sys/vm dizini altnda write-back mekanizmasn
ayarlayabileceimiz dosyalar bulunur. Bu deerler UBIFS'e zg olmayp sistemdeki tm
dosya sistemlerini etkiler.
dirty_writeback_centisecs : write-back thread'inin hangi sklkta alp dirty page

cache'leri yazacan belirtir. (rnek: 500)


dirty_expire_centisecs : verinin maksimum ne kadar sre dirty olarak kalabileceini

gsterir, sre bitiminde periyodik alan write-back thread'i gerekli ilemleri yapacaktr.
(rnek: 3000)
dirty_background_ratio : Toplam bellek alannn maksimum ne kadarlk ksmnn dirty

page cache tutmak iin kullanlacan belirtir. Bu deer alrsa periyodik write-back
thread'i ayarlanan oran salayabilmek iin gerekli ilemleri yapar. Soft-Limit olarak
dnlebilir. (rnek: 40)
dirty_ratio : dirty page-cache oluturabilecek srelerin, yazma ilemi ncesinde

toplam bellek alannn ne kadarnn bu amala kullanlabileceini gsteren orandr.


Yazma ncesinde yaplan kontrolde bu deere eriildii tespit edilirse, ncelikle mevcut
dirty page cache'ler commit edilir ve bu oran salanmaya allr. Hard-Limit olarak
dnlebilir. (rnek: 60)

UBIFS Write-Buffer
Genel Linux write-back mekanizmasna ek olarak, UBIFS'in kendine zg write-buffer
mekanizmas da bulunmaktadr.

UBIFS Dosya Sistemi

119

Gml Linux

UBIFS write-buffer alanlar, UBIFS kodu ierisinde, page cache ve flash alan arasnda
durur. Dolaysyla write-back mekanizmas verileri flash'a deil, UBIFS write-buffer alanna
yazar.
Write-buffer alan page cache ile karlatrdmzda ok kktr ve genellikle NAND page
size deerine eittir. (512 byte, 2Kb, 4Kb vb.)
NAND page size deeri, NAND aygt zerinde yaplabilecek minimum okuma/yazma
miktarn gsterir. Dolaysyla dirty veriler dirty_expire_centisecs'lik sre sonrasnda commit
edilir ancak verinin son ksmlar write-buffer yznden ekstra bir 3-5 saniyelik gecikmeye
tabi tutulabilir.

write-back ve Senkronizasyon
Write-back ve write-buffer mekanizmalar karsnda verilerin commit edilme zamann
kontrol iin aadaki yntemler kullanlabilir:
lgili blm -o sync parametresi ile mount edilecek olursa tm yazma ilemleri senkron
olarak yaplr (JFFS2'deki gibi) ancak performans ok ciddi biimde der.
fsync(int fd) ars ile sadece belirli bir file descriptor'a ait verilerin commit edilmesi

salanabilir.
fdatasync(int fd) ars ile dosyann meta-data bilgilerinin commit edilmemesi

salanr, sadece dosya ierii commit edilir.


open() arsnda O_SYNC bayra kullanlmas durumunda ilgili file descriptor iin

yaplan tm write ilemleri senkron olarak gerekleir. (fsync ve fdatasync rneinde


pek ok write ileminin bir defada commit edilebileceini unutmayn)

Ve Daha ok Senkronizasyon Problemi...


Write-Back mekanizmas ve asenkron alma yntemiyle ilgili pek ok detay daha
bulunmaktadr ve Kernel gelitiricileri ile uygulama gelitiriciler arasnda bir atmaya yol
amaktadr. (Bkz: http://lwn.net/Articles/326471)
Konuyla ilgili uzun tartmalar genelde Linux ekirdeinin duruma gre baz ince ayarlara
otomatik karar vermesi ve yapmas ile kullanc adna byle bir karar vermeyip, zaten
halihazrda kullanc seviyesinden sysctl mekanizmasyla yaplabilmekte olan bu ince
ayarlarn, kullancnn sorumluluuna braklmas noktasnda yaanmaktadr.
Fikir vermesi asndan aada konuyu zetleyen bir mail ve Torvalds'n yorumu yer
almaktadr. lgili kiiler:
Andrew Morton : 1959 doumlu ana Linux gelitiricilerinden, halihazrda Ext3 ve blok

UBIFS Dosya Sistemi

120

Gml Linux

tabanl aygtlar iin journaling desteiyle ilgili ksmlardan sorumlu


Theodore Y. Ts'o : 1968 doumlu ana Linux gelitiricilerinden, ext2 ve ext3 ierisinde

alm, halihazrda ext4 kodundan sorumlu


Linus Benedict Torvalds : 1969 doumlu, fazla sze gerek yok, Linux'un yan sra Git

versiyon kontrol sistemini de gelitiren kii


From: Linus Torvalds <torvalds-AT-linux-foundation.org>
To: Andrew Morton <akpm-AT-linux-foundation.org>
Subject: Re: Linux 2.6.29
Date: Thu, 26 Mar 2009 20:38:43 -0700 (PDT)
On Thu, 26 Mar 2009, Andrew Morton wrote:
>
> Why does everyone just sit around waiting for the kernel to put a new
> value into two magic numbers which userspace scripts could have set?
>
> My /etc/rc.local has been tweaking dirty_ratio, dirty_background_ratio
> and swappiness for many years. I guess I'm just incredibly advanced.
.. and as a result you're also testing something that nobody else is.
Look at the complaints from people about fsync behavior that Ted says he
cannot see. Let me guess: it's because Ted probably has tweaked his
environment, because he is advanced. As a result, other people see
problems, he does not.
That's not "advanced". That's totally f*cking broken.
Having different distributions tweak all those tweakables is just even
_more_ so. It's the anti-thesis of "advanced". It's just stupid.
We should aim to get it right. The "user space can tweak any numbers they
want" is ALWAYS THE WRONG ANSWER. It's a cop-out, but more importantly,
it's a cop-out that doesn't even work, and that just results in everybody
having different setups. Then nobody is happy.

UBIFS Dosya Sistemi

121

Gml Linux

Cramfs Dosya Sistemi


Cramfs Linus Torvalds ve Daniel Quinlan tarafndan yazlan, write destei olmayan, gml
sistemlerde kullanlmaya uygun basit bir read-only dosya sistemidir.
Blok tabanl aygtlar iin gelitirilmi olmakla birlikte, yazma ilemi tanml olmadndan
mtdblock srcs zerinden raw flash tabanl sistemlerde kullanlabilmektedir.
Bozuk blok ynetimi bulunmadndan bozuk bloklarla karlalmas halinde sorunlar
yaanabilir.
Zlib ktphanesi ile sktrma destei sunmaktadr. Maksimum dosya boyutu 16 MB,
maksimum dosya sistemi boyutu 272 MB'tr.
SquashFS dosya sistemi ncesinde youn bir kullanm alan bulmu olsa da gnmzde
nadir olarak kullanlmaktadr. SquashFS benzer balklarda daha iyi performans
sunmaktadr.

maj Oluturma
Cramfs imaj oluturmak iin cramfstools paketinden kan mkcramfs uygulamas kullanlr.
mkcramfs /work/dir cram.img

Oluturulan imaj dosyas dd uygulamas ile MTD aygt zerine yazlr:


dd if=cram.img of=/dev/mtdblock3

Aadaki ekilde mount edilir:


mount -t cramfs /dev/mtdblock3 /mnt

Cramfs Dosya Sistemi

122

Gml Linux

SquashFS Dosya Sistemi


Write destei olmayan, read-only bir dosya sistemidir.
Blok tabanl aygtlar iin gelitirilmi olmakla birlikte, yazma ilemi tanml olmadndan
mtdblock srcs zerinden raw flash tabanl sistemlerde kullanlabilmektedir.
Bozuk blok ynetimi bulunmadndan bozuk bloklarla karlalmas halinde sorunlar
yaanabilir.
Sktrma oran ve performans nedeniyle, read-only dosya sistemleri arasnda en ok
kullanlan tercih olmutur.

maj Oluturma
SquashFS imaj oluturmak iin mtd-utils paketinden kan mksquashfs uygulamas
kullanlr.
mksquashfs /work/dir squash.img

Oluturulan imaj dosyas dd uygulamas ile MTD aygt zerine yazlr:


dd if=squash.img of=/dev/mtdblock3

Aadaki ekilde mount edilir:


mount -t squashfs /dev/mtdblock3 /mnt

Squashfs Dosya Sistemi

123

Gml Linux

Minix Dosya Sistemi

Minix Dosya Sistemi

124

Gml Linux

FAT Dosya Sistemi

FAT Dosya Sistemi

125

Gml Linux

Ext2, Ext3, Ext4 Dosya Sistemleri

Ext2,3,4 Dosya Sistemi

126

Gml Linux

Watchdog Kullanm
Watchdog mekanizmalar, alan ana yazlmlarn beklenmedik bir ekilde sonlanmas
sonrasnda sistemin yeniden balatlabilmesine imkan tanr.
Bu mekanizma genellikle donanm tabanl bir zamanlayc (Watchdog Timer - WDT) ile
gerekletirilir.
Sistemin genel alma prensibi olduka basittir:
WDT zamanlaycsn rnek olarak 60 saniye iin balat
60 saniyelik sre bitmeden hayatta olduunu ispat et ve yeni bir 60 saniye kazan
Periyodik olarak zamanlaycya hayatta olduunuzu sylediiniz mddete sorun
olmayacaktr. Ancak bu ilemi yapamaz hale gelirseniz (uygulamanz bir SEGFAULT ile
sonlanmsa vb.) zamanlaycnn sresi dolduunda sistem otomatik olarak yeniden
balatlacaktr.
Buradaki yeniden balatma ilemi kontroll (reboot) deil, reset eklindedir.

Kernel Panic Sistemi le Fark


Watchdog haricinde grece benzer bir ilevi Linux ekirdei ierisindeki panic handler ile
de yapabildiimizi hatrlaynz. Eer ekirdek ierisindeki yer alan kodlarda herhangi bir kritik
hata olumas nedeniyle tm ekirdek alamaz hale gelirse, sistemin panic parametresi
ile alm olmas halinde otomatik yeniden balatma (reset) ilemi ekirdek tarafndan
yaplmaktadr.
Ancak bu yntem sadece ekirdek seviyesindeki hatalarda ie yaramaktadr. Watchdog ise
kullanc kipi hatalarn da yakalamaya ve bir eyler ters gittiinde en azndan sisteminizi
yeniden balatabilmenize imkan tanmaktadr.

ekirdek Destei
Sistemdeki watchdog donanmnn kullanm iin ekirdek seviyesinde src destei
salanm olmaldr.
Linux ekirdeinde watchdog donanm srcleri iin genel bir Watchdog Driver API mevcut
olup, tm donanmlar tarafndan ayn arayz, yetenekleri dorultusunda salanr. Detaylar
iin https://www.kernel.org/doc/Documentation/watchdog/watchdog-api.txt belgesini
inceleyebilirsiniz.
Watchdog Kullanm

127

Gml Linux

Temel Kullanm Modu


Tm watchdog srclerinin en az bu modu desteklemesi beklenir, dolaysyla watchdog
donanmzn desteklenmesi halinde her durumda bu alma yntemini kullanabilirsiniz.
alma mant u ekildedir:
Uygulama katmannda /dev/watchdog aygt dosyas yazma modunda alr
ntanml olarak 60 saniyelik bir zamanlayc balar
60 saniye dolmadan, bu dosyaya herhangi bir veri yazlr (tek karakter de olabilir) ve
zamanlaycnn yeniden balatlmas salanr
Uygulama, kendi iinde bir dngde kalp zamannda watchdog dosyasna yeni bir veri
yazamaz ise, sre dolumunda sistem yeniden balatlr
Ak durumdaki /dev/watchdog dosyas kapatlr ise, watchdog sistemi devre d
braklr
Grlecei zere Unix sistemlerde hemen her eyin dosya arayz ile kullanc katmanna
sunumu yaklam burada da benimsenmitir. Uygulamanz ierisinde yukardaki i akn
dosya ilemleriyle kolaylkla gerekleyebilirsiniz.
Yalnz burada dikkat edilmesi gereken husus, /dev/watchdog dosyasnn yazma modunda
almas ile balayan zamanlaycnn dosyann kapatlmas halinde devre d kalyor
oluudur. lk bata nemli bir problem olarak grnmeyebilir, ancak Linux ekirdei herhangi
bir yntemle sonlanan kullanc kipi uygulamalar iin, ak halde bulunan tm dosyalar da
kapatr. Bu nedenle watchdog mekanizmasn iletmek iin uygulamanzda /dev/watchdog
ak halde iken uygulamanz kontrolsz biimde sonlanacak olursa, dosya kapatld iin
watchdog da devre d kalacak ve beklediiniz zamanlayc sresi dolumundaki yeniden
balatma ilemi gereklemeyecektir.
Peki o halde watchdog ne ie yarayacak diye sorabilirsiniz. Endieye mahal yok.
Bu dizayn ile temelde 3 zm ynteminiz bulunuyor:
1. Ana uygulama(lar)nz ierisinde watchdog ynetmek yerine, watchdog'u yneten ayr
bir uygulama yazmak (veya hazr bir watchdog daemon kullanmak)
2. Magic Close zellii destekleniyorsa kullanmak
3. ekirdek derleme srecinde CONFIG_WATCHDOG_NOWAYOUT opsiyonu seerek, srcnzn
de desteklemesi halinde watchdog dosyasnn kapanmasyla zamanlaycnn
durdurulmasn engellemek

Watchdog Kullanm

128

Gml Linux

Magic Close zellii


Baz srcler Magic Close ad verilen bir zellii desteklemektedir. Bu destek sayesinde,
watchdog dosyas kapatlmadan nce V karakteri dosyaya yazlmaz ise, dosya kapatlsa
dahi zamanlayc almaya devam etmekte ve zaman dolduunda sistemi yeniden
balatmaktadr.
Eer zellikle watchdog zamanlaycsn durdurmak istiyorsanz, dosyay kapamadan nce V
karakterini yazabilir ve sonra kapama ilemini gerekletirebilirsiniz.
Magic Close destei daha rahat bir kontrol salyor olmasna karn sisteminizde
desteklenmiyor olmas ihtimali kuvvetle muhtemeldir. Bu zelliin desteklenip
desteklenmediini ioctl arayz zerinden WDIOC_GETSUPPORT opsiyonuyla sorgulayabilirsiniz.
Aadaki rnek uygulama ile watchdog srcnzn Magic Close, Set Timeout ve Keep
Alive Ping zelliklerini destekleyip desteklemediini renebilirsiniz:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/watchdog.h>
#define WATCHDOG_DEVICE "/dev/watchdog"
int main(void)
{
struct watchdog_info info;
int fd;
if ( (fd = open(WATCHDOG_DEVICE, O_RDWR)) < 0) {
perror("open failure");
exit(EXIT_FAILURE);
}
if (ioctl(fd, WDIOC_GETSUPPORT, &info) < 0) {
perror("ioctl");
exit(EXIT_FAILURE);
}
printf("Magic Close Feature : %s\n", (info.options & WDIOF_MAGICCLOSE) ? "Yes" : "No"
printf("Set Timeout Feature : %s\n", (info.options & WDIOF_SETTIMEOUT) ? "Yes" : "No"
printf("KeepAlivePing Feature: %s\n", (info.options & WDIOF_KEEPALIVEPING) ? "Yes" :
close(fd);
}

Watchdog Kullanm

129

Gml Linux

ioctl Arayz
Tm watchdog srcleri, destekledikleri zellikler iin ioctl arayz de salamaktadrlar.
Watchdog zamanlaycy beslemek ve yeni bir tur daha sre kazanmak iin WDIOC_KEEPALIVE
ile aadaki gibi bir ioctl ars yapabilirsiniz. 3. parametrenin ne olduunun bir nemi
yoktur:
ioctl(fd, WDIOC_KEEPALIVE, 0);

Src tarafndan desteklenmesi halinde 60 saniyelik ntanml watchdog zamanlayc


deerini deitirmek isterseniz, WDIOC_SETTIMEOUT ile aadaki gibi bir ioctl ars
yapabilirsiniz:
int timeout = 20; /* saniye */
ioctl(fd, WDIOC_SETTIMEOUT, &timeout);

Benzer ekilde, zamanlaycda kalan zaman WDIOC_GETTIMEOUT ile aadaki gibi


sorgulayabilirsiniz:
int remaining;
ioctl(fd, WDIOC_GETTIMEOUT, &remaining);

Sistemin son defa yeniden balatlmas ileminin watchdog yznden olup olmadn
WDIOC_GETBOOTSTATUS ile sorgulayabilirsiniz:

int bootfromwatchdog;
ioctl(fd, WDIOC_GETBOOTSTATUS, &bootfromwatchdog);

Daha detayl zellikler iin ekirdek ierisindeki dokmantasyonu inceleyebilirsiniz.

Watchdog Kullanm

130

Gml Linux

CPU Frequency Scaling


Cpu Frequency Scaling katman, Linux ekirdeinin g tketimini azaltmak iin ilemci
alma frekansn azaltp artrmasna imkan verir.
Frekans ynetimini salayan conservative, ondemand, userspace, powersave ve
performance adnda 4 farkl governor (ynetici) opsiyonu bulunmaktadr.
Linux ekirdei versiyon 3.4 ve yukarsnda gerekli modller otomatik olarak yklenmekte ve
ondemand governor aktif edilmektedir.

Cpufreq Governor
Her bir governor basite CPU alma frekansnn ne olmas gerektiine dinamik olarak
karar veren algoritmalar olarak dnlebilir.
Governor algoritmalar, belirlenen minimum ve maksimum deerler ierisinde kalmak
artyla, istatistiki olarak seilen politikaya uygun olarak kararlar vermeye alrlar.

Performance Governor
Bu governor sistemden srekli maksimum performans istendii durumda kullanlr.
Seilen alma frekans, scaling_max_freq deerini geemez.

Powersave Governor
Sistemde g tketimini minimuma getirmeye alr.
Anlk cpu kullanm isteklerine tepkisi daha yava olur.
Seilen deerler scaling_min_freq ve scaling_max_freq arasnda olur.
G tketiminin ok nemli olduu senaryolarda nerilir.

Ondemand Governor
Bu governorda CPU frekans ihtiya dorultusunda anlk olarak deitirilir.
Seim algoritmas cpu kullanmna dair aralklarla rnekler alr ve bu rneklemi karar
mekanizmasnda kullanr.

CPU Frequency Scaling

131

Gml Linux

Algoritma, sysfs zerinden optimize edilebilir.


ondemand/sampling_rate dosyas zerinden ka mikrosaniyede bir rnek alnaca
belirtilebilir.
Bunun yan sra up_threshold, ignore_nice_load, sampling_down_factor, powersave_bias
parametreleriyle algoritmann karar retme sreci daha hassas biimde ayarlanabilir.

Conservative Governor
Ondemand governor'un zelletirilmi bir hali olarak dnlebilir.
Ondemand'dan farkl olarak, Cpu frekansn azaltmak veya artrmak gerektiinde bu ilemi
kademeli olarak yapmaktadr.
freq_step, down_threshold ve sampling_down_factor parametreleriyle algoritmann
davrannda bir takm zelletirmeler yapmak mmkndr.

Userspace Governor
Bu governor sistemdeki root kullancsnn CPU frekansn spesifik olarak belirli bir deere
ayarlayabilmesini salar.
Governor yklendikten sonra, sysfs zerinden scaling_setspeed dosyas araclyla istenen
alma frekans ayarlanabilir.
Herhangi bir cpu hzn semek mmkn deildir. lgili CPU iin kullanlabilecek CPU hz
deerleri sysfs zerinde scaling_available_frequencies dosyasnda belirtilmitir:
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
300000 600000 800000 1000000

Aktif Governor Seimi


Sistemde o anda aktif olan governor scaling_governor dosyas zerinden renilebilir:
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
performance

Aktif governor bu dosyaya ilgili governor ismi yazlmak suretiyle deitirilebilir. rnek olarak
userspace governor kullanmak iin:

CPU Frequency Scaling

132

Gml Linux

# echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

rnek Uygulama - 5000 Asal Say Bulma


Aadaki rnek uygulamay prime.c adyla kaydedip farkl cpu governor'lar aktif iken test
edelim.
/* prime.c */
#include <stdio.h>
int main()
{
int n = 5000;
int i = 3, count, c;
for (count = 2; count <= n;) {
for (c = 2; c <= i - 1; c++) {
if (i % c == 0) {
break;
}
}
if (c == i) {
count++;
}
i++;
}
printf("found %d prime numbers\n", count);
return 0;
}

Uygulamay u ekilde derleyebilirsiniz:


$ gcc -o prime prime.c

Ardndan sistemdeki farkl cpu governor veya saat frekanslar iin toplam zamanlar time
komutu yardmyla ltmzde aadakine benzer bir sonu alnmaktadr:

CPU Frequency Scaling

133

Gml Linux

Aktif Governor

lem Sresi

Powersave

15.91 s

Conservative

6.84 s

Ondemand

5.05 s

Performance

4.70 s

Userspace - 300 Mhz

15.91 s

Userspace - 1000 Mhz

4.70 s

cpufreq-utils
Frekans deiimi ilemlerini kolaylatrmak amal cpufreq-utils paketinden kan
uygulamalar kullanlabilir.
cpufreq-utils paketini,

http://ftp.sunet.se/pub/Linux/kernel.org/linux/utils/kernel/cpufreq/cpufrequtils.html adresinden
indirip derleyebilirsiniz. Paket ierisinden kan cpufreq-info ve cpufreq-set uygulamalar
ile ilemleri kolay bir ekilde gerekletirmek mmkndr.

cpufreq-info
$ sudo cpufreq-info
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009
Report errors and bugs to cpufreq@vger.kernel.org, please.
analyzing CPU 0:
driver: generic_cpu0
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: 300 us.
hardware limits: 300 MHz - 1000 MHz
available frequency steps: 300 MHz, 600 MHz, 800 MHz, 1000 MHz
available cpufreq governors: conservative, ondemand, userspace, powersave, performance
current policy: frequency should be within 300 MHz and 1000 MHz.
The governor "powersave" may decide which speed to use
within this range.
current CPU frequency is 300 MHz (asserted by call to hardware).
cpufreq stats: 300 MHz:nan%, 600 MHz:nan%, 800 MHz:nan%, 1000 MHz:nan%

cpufreq-set

CPU Frequency Scaling

134

Gml Linux

-d parametresi ile minimum frekans, -u parametresi ile maksimum frekans, -g

parametresi ile governor seilir.


Minimum 300 Mhz, maksimum 600 Mhz ve ondemand governor semek iin:
$ sudo cpufreq-set -d 300000 -u 600000 -g ondemand

userspace governor aktif iken -f parametresi ile spesifik bir frekans seimi yapmak
iin:
$ sudo cpufreq-set -g userspace
$ sudo cpufreq-set -f 600000

CPU Frequency Scaling

135

Gml Linux

Buildroot
Gml Linux sistemlerinin kullanmnda temel olarak 3 alternatif yntem bulunmaktadr:
nceden hazrlanm bir datm kullanmak (Debian, ngstrm vb.)
Desteklenen mimari says az
zelletirmek ve ihtiya duyulmayan bileenlerin kartlmas zor
Kaynak kodlardan yeniden ina etmek ok g
Elle zel bir datm hazrlamak
Uzun ve yorucu bir sre
apraz derlemeyle ilgili sorunlu uygulamalara dair detaylarn renilmek zorunda
olmas
Uygulamalarn birbirine olan bamllklarnn ynetilmesi g
Elle zel bir datm hazrlarken otomatik ina sistemi kullanmak
Her iki yntemin kt yanlarn bertaraf edip iyi yanlarn biraraya getirmeye alr
Buildroot projesi, benzer ilemleri sklkla yapmak zorunda kalan gml Linux sistem
gelitiricilerinin hayatn kolaylatrmay, bunu yaparken de ok karmak ve renilmesi
bal bana problem olan yeni bir sistem daha retmek yerine, geleneksel aralarla sreci
ynetmeyi hedefler.

Tarihe
Buildroot, 2001 ylnda uClibc gelitiricileri tarafndan test amal gelitirilmeye baland.
2005 ylnda gelitirici says biraz daha artt, ancak profesyonel bir ara olmann halen
uzanda idi.
2009 ylna kadar grece kontrolsz bir yapda proje deien hzlarda bymeye devam etti.
2009 ylndan itibaren Peter Korsgaard projenin yeni sorumlusu oldu. Bu gelimenin
ardndan nemli dizayn deiiklikleri, dzenli kan versiyonlar ve buildroot kullanan
sistemlerdeki art projeyi bugnk haline getirdi.
2015 Ocak ay itibariyle, Buildroot projesi toplam 35 MB kaynak kodundan olumakta olup,
ierisinde 1415 adet uygulama paketi yer almaktadr. 300'den fazla gelitirici projeye eitli
seviyelerde katkda bulunmaktadr.

Buildroot

136

Gml Linux

Yaklam
Buildroot temel olarak Makefile sistemi zerine ina edilmitir. Sistem yaklak olarak 1500
adet Makefile dosyasndan ( .mk uzantl) oluur.
Tm sre ncelikle ana dizinde yer alan Makefile dosyasnn okunmasyla balar. Yaplan
ilemlere gre gerektiinde ilgili dier .mk uzantl Makefile dosyalar include edilerek
ilerlenir.
Not: Projede alrken make hedeflerini ( make strace , make rootfs-clean vb.) TAB
tuu ile otomatik tamamlattrmak mmkndr, ancak otomatik tamamlama
fonksiyonunun tm dosyalar ilemesi gerektiinden Makefile saysnn okluu
nedeniyle bu ilem biraz zaman almaktadr. Byle bir durumla karlarsanz sabrla
bekleyin (5-20 saniye) ve bu zellii imdilik fazla kullanmamaya bakn.

Konfigrasyon
Buildroot projesinde konfigrasyon ilemleri iin, Linux kernel ve Busybox gibi projelerde
kullanlan Kconfig sistemi kullanlmaktadr.
Kaynak: https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt
Kconfig sistemiyle kolay bir ekilde
Seenekler arasndaki bamllklar
Farkl trlerde deikenler
artl aklar ve ntanml deerler
Sistem ii yardm metinleri
kolayca tanmlanabilmektedir.

Konfigrasyon Seenekleri
Kconfig sistemi ile yaplacak konfigrasyon ileminin sonucunda yaplan seimler kayt
edilirse, ana dizinde .config dosyas oluacaktr
Temel ama bu dosyay oluturmak olduundan, daha nce oluturulmu olan farkl bir
.config dosyas kopyalanmak suretiyle de ayn seim kmesine ulalr
Buildroot altnda ntanml gelen config dosyalar, configs/ dizini altnda bulunur
(rnek: beaglebone_defconfig)

Buildroot

137

Gml Linux

Konfigrasyon ileminde kullanacamz GUI arac iin birden fazla seenek mevcuttur:
Yntem

Aklama

htiya Duyulan Ktphaneler

xconfig

Qt-4 backend

qt4-dev

gconfig

Gtk-2 backend

gtk-2-dev, libglade-2-dev

nconfig

Ncurses backend

libncurses-dev

menuconfig

curses backend

libncurses-dev

xconfig
Kullanm: make xconfig
Qt4 tabanl bir arayz sunar.

nconfig
Kullanm: make nconfig
ncurses tabanl bir arayz sunar.

Buildroot

138

Gml Linux

menuconfig
Kullanm: make menuconfig
curses tabanl bir arayz olup, kullanmn nermekteyiz.
Tm arayzlerde ilgili seenek iin girilmi yardm bilgisine ulalabilmektedir (curses
arayznde h ksayolu ile)

Buildroot Kodunun ndirilmesi


Buildroot

139

Gml Linux

buildroot kararl srmler her 3 ayda bir yaynlanmakta olup,


http://buildroot.uclibc.org/download.html adresinden gncel kararl srm indirilebilir.
zellikle buildroot arivine projenize zg eklemeler yapacaksanz, bu durumda git
zerinden projeyi klonlayp, farkl bir branch oluturarak, deiikliklerinizi de versiyon
takibine alabilirsiniz.
Bu ekilde buildroot projesindeki yenilikleri de pull edip, kendi altnz branch
ierisine merge etmek mmkn olacaktr.
$ git clone git://git.buildroot.net/buildroot

Out-Of-Tree alma Modeli


Buildroot out-of-tree alma modelini destekler
Bu ekilde ayn buildroot alma dizinini temel alarak, farkl konfigrasyonlarda, farkl
cpu aileleri iin build ilemini yapmak mmkndr
Bu sayede firma ierisinde ayn veya farkl projelerde buildroot iin hazrlanm ek
paketler, konfigrasyonlar var ise, tek bir kaynak kod dizininde bulundurulabilir bu
dizinde yer alan buildroot araclyla, farkl alma dizinlerinde farkl profillerde ktlar
retilebilir
Bu model kullanlmadnda oluan ktlar, buildroot kaynak kodlarnn bulunduu yerde
output/ dizini altnda oluturulur (bu yntemi nermemekteyiz)

Hazr Konfigrasyon Kullanm


Buildroot ierisinde Linux kernel projesinde olduu gibi, nceden tanmlanm hazr
konfigrasyon dosyalar bulunur
Bu dosyalar ierisinde genellikle bir paket seim kmesi ve temel dosya sistemi ayarlar
yer almaktadr
Mevcut bir konfigrasyonu kullanmak iin:
$ make pandaboard_defconfig
Mevcut konfigrasyon dosyalar configs/ alt dizininde yer almaktadr.
Temel konfigrasyon bu ekilde hzlca yapldktan sonra, make menuconfig komutu
yardmyla toolchain vb. dier ayarlar da yaplp ina srecine geilebilir

Buildroot

140

Gml Linux

Bo Konfigrasyon le Balamak
Eer hazr bir konfigrasyon dosyas kullanmak istemiyorsanz, aadaki komutla bo
bir konfigrasyon dosyas ile de ileme balayabilirsiniz:
$ make menuconfig
Bu ekilde ileme balandnda, mevcut paketler arasndan sadece busybox 'n ve
mimari olarka i386 'nn seii olduu temel bir konfigrasyon karnza gelecektir.
Srasyla buradaki menlerden gerekli seimleri yapp oluturduunuz konfigrasyonu
kaydedip, ina srecine geebilirsiniz.

Out-Of-Tree Modeli le Balamak


Out-of-tree modeli alma yntemini kullanmak istiyorsak, O deikenine deer
atamak suretiyle make uygulamasn altrmalyz
Hazr bir konfigrasyon dosyasn baz alacaksak:
$ make O=/path/to/project_dir pandaboard_defconfig
Bo bir konfigrasyon ile balayacaksak:
$ make O=/path/to/project_dir
Bu komutun ardndan parametre olarak verdiimiz dizine gemeli ve geri kalan tm
ilemleri, ilgili dizin altnda iken yapmalyz.

Target Options Blm


Konfigrasyon ekranndaki ilk men Target options eklindedir
Burada temel olarak ilemci ailesine ilikin seimlerin yaplmas gereklidir
Yaplan seimlere bal olarak ina srecinin devamnda derlenecek olan tm
uygulamara, -march, -mcpu, -mtune gibi mimari spesifik doru derleyici parametreleri
geirilecektir
rnek bir seim kmesi u ekilde olabilir:

Buildroot

141

Gml Linux

Balk

Deer

Target Architecture

ARM (little endian)

Target Architecture Variant

cortex-A8

Target ABI

EABI

Floating point strategy

VFPv3-D16

ARM instruction set

ARM

Build Options Blm


Bu blmde temel olarak ina srecinin genelini ilgilendiren ayarlar yaplr
Burada yer alan ayarlarn ou ntanml halinde braklabilir
zerinde durulmas gereken balklar ise:
Download dir
gcc optimization level
location of a package override file

Build Options Blm : Download Dir


Download dir seimi ile, ina srecinde otomatik olarak indirilecek dosyalarn hangi
dizinde tutulaca belirtilir
Bir seim yaplmamas halinde, ntanml olarak buildroot ina srecinde kullandnz
ana dizin altnda (Out-of-tree modelini kullanp kullanmadnza gre deikenlik
gsteren) dl/ alt dizinde tutulacaktr
Buildroot ile alrken download ilemlerini buildroot alma dizinlerinin dnda, ortak
bir dizin altna yapmakta fayda vardr
Bu ekilde birden fazla buildroot projesinde alrken ayn dosyalar tekrar tekrar
download etmek zorunda kalmaz ve hz kazanrsnz
Birden fazla alann olduu veya internet eriiminin snrland alma ortamlarnda
da yerel ada bir NFS veya http sunucusu zerinden ortak bir download dizini
kullanmak tercih edilebilir

Build Options Blm : gcc optimization


Buildroot

142

Gml Linux

Bu blmde ina srecinde tm uygulamalar iin gcc derleyicisine geirilecek


optimizasyon seviyesi parametresi genel olarak belirlenmektedir
Merkezi bir noktada bu ekilde optimizasyon seviyesinin belirlenebilmesi, sisteminizde
yer alacak tm uygulamalarn istediiniz optimizasyon seviyesinde retilmesini garanti
eder
ntanml deeri optimize for size olmakla birlikte, gnmzde gml sistemler iin de
ana depolama birimi kapasitelerinin arttn gz nnde bulunduracak olursak,
optimizasyon seviyesi 2 veya 3' de semek anlaml olmaktadr.

Build Options Blm : package override file


Buildroot ierisindeki ileri dzey konulardan biri olan OVERRIDE mekanizmas iin
package override dosyasnn nerede aranaca burada belirtilir
Package override dosyas temel olarak, buildroot ierisinde tanml paketlere ilikin baz
kurallar deitirmenize olanak salamaktadr
zellikle gelitirme yapmakta olduunuz bir yazlm iin buildroot paketi araclyla
derleme yapmak istediinizde kullanm zorunlu olmaktadr
Konu ayrntlarna ilerleyen blmlerde deilinecek olup, bu deer ntanml olarak
braklabilir veya sistem ierisinde ortak bir dizine yer alan ve dier buildroot projelerinde
de kullanlmas istenen bir dosya yolu seilebilir.

Toolchain Seimi
Bu blm ierisinde ina srecinde apraz derleme ileminde kullanlacak toolchain
seimi ve detayl konfigrasyonu yaplacaktr
Temel olarak 2 tip toolchain bulunmaktadr:
Buildroot toolchain
External toolchain
Buildroot toolchain tipi seildiinde, ncelikle toolchain'in kendisi ina edilecektir
Bu sre olduka uzun vakit almakta ve buildroot'tan bamsz olarak, toolchain ina
srelerinin genel anlamda skntl olmas sebebiyle baarszlkla da
sonulanabilmektedir

Buildroot

143

Gml Linux

zel bir nedeni yok ise toolchain'in kendisini retme srecinden kanlmasn
nermekteyiz

Toolchain Seimi : External Toolchain


Toolchain tipi olarak External Toolchain seilmesi durumunda Toolchain ve Toolchain
origin balnda 2 yeni seenek belirecektir
Burada Sourcery CodeBench, Arago, Linaro tarafndan retilen eitli toolchain
versiyonlar listelenmektedir
Bu versiyonlardan biri seildiinde, Toolchain origin olarak to be downloaded or installed
opsiyonu seilerek internet zerinden download edilebilir veya daha nceden
sisteminizde zaten var ise ilgili dizin beliritilebilir
Custom toolchain opsiyonun seilmesi halinde ise sisteminizde nceden mevcut olan
bir toolchain dizinini semeniz mmkndr

System Configuration
Bu blmde oluturulacak olan dosya sistemiyle ilgili baz temel ayarlar
yaplabilmektedir
Balk

Ayar

System hostname

Sistemin ad, hostname

System banner

Login ilemi sonras grnecek metin

Password encoding

Parole kripto algoritmas

/dev management

/dev dizini ynetim metodolojisi

Init system

Sistem alnda kullanlacak init metodolojisi

Root FS skeleton

Sistemde kullanlacak iskelet dosya sistemi

Root password

Root parolas

Port to run getty

Seri konsol login iin kullanlacak port

read-write remount

Al sreci sonras dosya sistemi yazma konumu

Root filesystem overlay


dirs

Dosya sistemi retimi ncesinde kopyalanmas istenen


dizinler

Custom scripts

Dosya sistemi retimi ncesi ve sonras altrlacak


betikler

Buildroot

144

Gml Linux

System Configuration

/dev management
nemli seimlerden biri, /dev aygt dosya sisteminin nasl ynetileceinin
belirlenmesidir
Gemi yllarda statik /dev ynetimi genel olarak kullanlmaktayd. Halen daha bu
seenein anlaml olduu projeler olabilir
Ancak /dev dizinini kernel zerinden gelen event'ler ile dinamik olarak oluturan
zmlerin tercih edilmesini nermekteyiz
Bu amala userspace'de alan, udev veya mdev yardmc aralarn
kullanabileceiniz gibi, kernel seviyesinde alan devtmpfs yntemini de
kullanabilirsiniz
zellikle sistemin al hzna olumlu etkisi dnldnde, udev veya mdev yerine,
sadece devtmpfs yntemini kullanmanz neririz
Bu kullanm ekli iin kernel derleme srecinde, CONFIG_DEVTMPFS ve
CONFIG_DEVTMPFS_MOUNT seenekleri seilmi olmaldr

Kernel
Buildroot

145

Gml Linux

Buildroot zerinden kernel derlemek mmkndr


Bunun iin Kernel bal altnda aadaki seenekler ayarlanmaldr:
derlenecek version
hangi yntemle download edilecei
varsa uygulanacak patch'lerin bulunduu dizin
derleme ileminde kullanlacak kernel konfigrasyon dosyas
kernel binary format
Bununla birlikte, bir ok board iin standart kernel yerine retici tarafndan gelen
zelletirilmi kernel kullanldndan, derlemeyi buildroot altndan yapmak ok fazla ek
i yk gerektirebilir. Bu durumlarda kernel derleme srecini buildroot dnda halletmek
anlaml olacaktr.

Paket Seimi : Target Packages

Paket Seimi
Sistemde yer alacak tm paket seimleri bu blm ve alt menlerinden
gerekletirilmektedir

Buildroot

146

Gml Linux

Paketler gruplanm olarak, eitli balklar altna yer alr


Birbirine baml olan paketler, Kconfig yaps araclyla bamllk ilikileri
dorultusunda listelenir
Busybox paketi sistemde temel bir nem arzettiinden, hangi versiyonunun
derlenecei ve derleme srasnda kullanlacak busybox konfigrasyon dosyas da
seenek olarak sunulmaktadr

Filesystem images
Derleme ilemleri bitiminde retilecek olan dosya sistemi imaj bu blmden
belirlenmektedir
squashfs, cramfs gibi read-only compressed dosya sistemi imajlarndan, jffs2, ubifs
gibi NAND flash aygtlar iin uygun dosya sistemlerine kadar geni bir seenek kmesi
yer almaktadr
Seilen dosya sistemi imaj trne gre alan ek menlerden parametre geirmek de
mmkndr. zellikle ubifs dosya sistemi iin aadaki parametrelerin doruluu teyit
edilmelidir:
UBI logical eraseblock size
UBI minimum IO size
Maximum LEB count
UBI physical eraseblock size
UBI sub-page size

Bootloaders
Buildroot zerinden aadaki bootloader uygulamarn mimariniz iin derlemeniz
mmkndr:
U-Boot
Barebox
X-Loader
Freescale mxs
grub, syslinux
Buildroot

147

Gml Linux

Gml sistemler iin youn biimde U-Boot kullanlmakta olsa da, kod kalitesi ve build
karmakl nedeniyle gelecekte yerini yeni nesil u-boot olarak adlandrabileceimiz
barebox'a brakaca dnlmektedir

Derleme lemi - Hazrlk


Konfgrasyon ilemi tamamlandktan sonra make komutu ile derleme ilemi balatlr
ncelikle halihazrda mevcut olmayan gerekli dizinler yaratlr (target, stamps, host vb.)
Hedef dosya sistemi iskeleti, target dizini altna kopyalanr
Bu blmde kopyalanacak olan iskelet dosya sistemi, konfigrasyon srasnda
deitirilebilir

Derleme lemi - Toolchain


Dizinler hazrlandktan sonra toolchain seimine gre aadaki yntemlerden biri
izlenir:
Buildroot toolchain seimi yaplm ise, toolchain retimi gerekletirileceinden
binutils, glibc, gcc gibi eitli toolchain bileenleri download edilir ve toolchain
retilir
External toolchain seimi yaplm fakat belirli bir versiyonun internet zerinden
download edilmesi istenmise download ilemi gerekletirilir
Her iki yntem sonrasnda, retilen, download edilen veya zaten sistemde belirli bir
dizinde mevcut olan toolchain, host/usr/toolchain-type/sysroot dizini altna kopyalanr

Paketler
Dosya Sistemi retimi
Buildroot Paketi Oluturma
Yardmc Adresler
Web: http://buildroot.org

Buildroot

148

Gml Linux

Eposta Listesi: buildroot@uclibc.org (http://buildroot.org/lists.html)


IRC kanal: Freenode zerinde #buildroot
Hata takip sistemi: https://bugs.uclibc.org

Buildroot

149

Gml Linux

Android Platformu
Bu blmde AOSP (Android Open Source Project) projesi kapsamnda retilmi olan yazlm
bileenlerinin kullanlarak gml Linux sistemimiz iin zelletirilmi bir Android imaj
oluturulmas ve Android gelitirme srecinin temel bileenlerinin incelemesi yaplacaktr.

Android Platformu

150

Gml Linux

Gelitirme Ortamnn Hazrlanmas


Gerekli Bileenler
Gelitirme ortam Google tarafndan Ubuntu LTS 12.04 versiyonu iin test edilmi olup, hi
bir sorunla uramak zorunda kalmak istemiyorsanz bu datmn kullanlmas nerilir. Biz
burada Debian Wheezy ve Debian Jessie datmlarn kullanyor olacaz.
Ubuntu tabanl sistemleri Google sadece nermiyor, ayn zamanda kendileri de Android
gelitirme ve build ilemlerinde kullanyorlar.
Dier gereklilikler u ekilde sralanmaktadr:
4 GB Bellek
Minimum 100 GB bo alan
Python versiyon 2.6 veya 2.7 versiyonu
GNU make 3.81 veya 3.82 versiyonu
JDK 7
Git versiyon 1.7 veya yukars
JDK 7 versiyonunu aadaki gibi kurup:
$ sudo apt-get install openjdk-7-jdk

sonrasnda sisteminizde birden fazla JDK versiyonu bulunuyor ise ntanml olacak olan
versiyon 7 olacak ekilde aadaki komutlarla gncelleyin:
$ sudo update-alternatives --config java
$ sudo update-alternatives --config javac

Sonrasnda aadaki paketleri yklemelisiniz:


$ sudo apt-get install git gnupg flex bison gperf build-essential \
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
libgl1-mesa-dev g++-multilib mingw32 tofrodos \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386

Gelitirme Ortamnn Hazrlanmas

151

Gml Linux

Not: Debian datmnda 64 bitlik sisteminizde bu paketleri kurabilmek iin Multi-Arch


desteini ayarlam olmanz gerekir. zet olarak sudo dpkg --add-architecture i386 ve
ardndan sudo apt-get update komutlarn vermeniz gereklidir. Ayrntlar iin:
https://wiki.debian.org/Multiarch/HOWTO
Ubuntu 12.04 iin kurulum sonras aadaki komutla libGL ktphanesi iin sembolik link
oluturuyoruz:
$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

Ubuntu 14.04 kullanyorsanz aadaki ek paketleri de kurmanz gerekmektedir:


$ sudo apt-get install bison g++-multilib git gperf libxml2-utils

USB Eriimlerinin Ayarlanmas


Modern Linux datmlarnda USB veriyolundaki aygtlar zerinde normal kullancnzla
dorudan eriiminiz olmadndan, srekli root kullanc haklaryla almak zorunda
kalmamak iin, USB veriyoluna taklan ilgilendiimiz aygt tipleri iin oluturulacak aygt
dosyalarnn sahibini kendi kullancmz olacak ekilde deitirebiliriz.
Bunun iin USB hotplug srecini yneten udev servisine, kullanacamz cihazlarn Vendor
ID ve Product ID bilgileri dorultusunda aadaki gibi bir ek kural dosyas tanmlamalyz.
Dosya ierisinde ilgilenmediiniz aygtlarla ilgili satrlar kaldrabilirsiniz.
Aadaki rnek dosyay sisteminizde /etc/udev/rules.d/51-android.rules adyla oluturup,
dosya ierisindeki <username> eklinde olan ksmlar kendi kullanc adnzla
deitirmelisiniz.

Gelitirme Ortamnn Hazrlanmas

152

Gml Linux

# adb protocol on passion (Nexus One)


SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
# adb protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
# fastboot protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"
# adb protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>"
# fastboot protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>"
# adb protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"
# fastboot protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", MODE="0600", OWNER="<username>"
# fastboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="<username>"
# adb protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER="<username>"
# fastboot protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER="<username>"
# adb protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0600", OWNER="<username>"
# fastboot protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER="<username>"

Kullanacanz cihaza ait kural burada yer almyorsa, USB kablosunu bilgisayarnza
taktktan sonra, lsusb komutunu altrn. Komut ktsnda yeni taktnz cihaz tahmin
edip, 8087:0024 formatndaki gibi Vendor ID : Product ID ksmlarn not ederek, udev
kurallarna bu aygt da eklemelisiniz.

Repo Aracnn Kurulumu


Android gelitirme ortamnda yaplacak ilemleri kolaylatrmak adna repo adl bir ara
kullanlmaktadr. Bu arac kendi ev dizininizde bin alt dizinine kurmanz neriliyor.
PATH 'inizde bulunan herhangi bir baka dizine de kurabilirsiniz.

Gelitirme Ortamnn Hazrlanmas

153

Gml Linux

$ mkdir -p ~/bin
$ export PATH=~/bin:$PATH
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

Not: Baz datmlarda ~/bin dizini kullanclarn ntanml PATH 'inde bulunuyorken
bazlarnda bulunmamaktadr. Byle bir durumda kolaylk olmas iin yukardaki
export komutunu, ~/.bashrc dosyanzn sonuna ekleyebilirsiniz.
repo aracn kurduktan sonra, almalarmz yapacamz ana dizini belirleyip oluturalm,

sonrasnda ilgili dizine geelim. rnek olarak tm almalar ~/embedded/android dizini


altnda yapacaksak:
$ mkdir -p ~/embedded/android
$ cd ~/embedded/android

Ardndan repo uygulamas ile master branch'i aadaki komut ile ilklendiriyoruz:
$ repo init -u https://android.googlesource.com/platform/manifest

Komutun bitmesine yakn size isim ve e-posta adresi sorulacaktr. Bu esnada e-posta adresi
olarak bir Google hesab girilmelidir:
...
* [new tag] studio_1.0.0 -> studio_1.0.0
* [new tag] studio_1.0.1 -> studio_1.0.1
Your Name [Murat Demirten]:
Your Email [demirten@debian]: mdemirten@yh.com.tr
Your identity is: Murat Demirten <mdemirten@yh.com.tr>
is this correct [y/N]? y
Testing colorized output (for 'repo diff', 'repo status'):
black red green yellow blue magenta cyan white
bold dim ul reverse
Enable color display in this user account (y/N)? y
repo has been initialized in /home/demirten/embedded/android

Android Kaynak Kodlarnn ndirilmesi

Gelitirme Ortamnn Hazrlanmas

154

Gml Linux

Yukardaki ilemleri yaptktan sonra, repo aracnn sync komutuyla kaynak kodlarnn
indirilmesi salanr:
$ repo sync

Bu ilem bir miktar uzun srebilir (bazen ok uzun, belki 1 gn kadar). Ocak 2015 itibariyle
yaklak toplam 20 GB' bulan kaynak dosyalar indirilecektir.

Kullanc Otorizasyonu
Google repo'larnda IP adresi baznda yaplacak isteklere ynelik bir kstlama mevcuttur.
Tek kii alyorken bu bir sknt oluturmasa da, ayn public IP adresinin paylald ve
birden fazla kiinin bu repo'lara eritii durumlarda sorun yaayabilirsiniz. Ortak IP kullanyor
olmaktan kaynaklanacak sorunlar bertaraf edebilmek iin,
https://android.googlesource.com/new-password adresindeki ynergeleri izleyerek kendinize
ait bir parola oluturabilir ve aadaki komutla repo init ilemini tekrar edebilirsiniz. Bu ilem
sonrasnda yaptnz istekler IP bazl kontrol edilmek yerine sizin kullancnza gre kontrol
edilecektir.
$ repo init -u https://android.googlesource.com/a/platform/manifest

Gelitirme Ortamnn Hazrlanmas

155

Gml Linux

Build Sistemi
Android build sistemi, ak kaynak dnyasnda kendisinden nceki projelerden nemli
farkllklar iermektedir. yi ve kt yanlarn bir kenara brakp bu sistemin genel olarak
renilmesinde fayda vardr.
Build sreci geleneksel make uygulamas ile alr. Bu ynyle bir benzerlik tad
dnlebilirse de, esasen tek benzerlik bundan ibaret olup, make sistematii allagelmiin
dnda kullanlr.
Ak kaynak dnyasnda bu denli byk projelerde genellikle en st dizinde bir ana Makefile
bulunur. Build srecinin bileenlerinin seimi ve dier zelletirmeler, ana dizinde yer alan bir
konfigrasyon dosyasnda tutulur ( .config ). Konfigrasyon dosyasnn retimi grece uzun
ve detayl bir ilem olduundan, bu sreci kolaylatracak eitli aralar sunulur
(menuconfig, xconfig, sistem ii yardm vb.). Ana dizindeki Makefile, .config dosyasn iler,
alt dizinleri recursive olarak dolar ve yaplan seimler dorultusunda alt dizinlerde yer alan
Makefile dosyalarn da make ile iler.
Android build sisteminde ise ana dizinde genel bir Makefile ve konfigrasyon dosyas
bulunmaz. Alt dizinler dolalp her birindeki Makefile dosyalar zerinden make de
iletilmeye allmaz. Bunun yerine, dizin ve alt dizinlerde, Android.mk dosyas aranr. Bu
make uygulamas iin hazrlanm bir Makefile dosyasdr. Eer bir dizinde Android.mk
bulunur ise make ile ilenir ve bu noktadan sonra, dosyann bulunduu dizinin alt
dizinlerinde arama ilemi devam etmez. Yani Android.mk bulunduunda, daha derinlerdeki
dizinlere inilmez. Bir st seviyedeki dizinlerin aranmasna ve oralarda bulunan Android.mk
dosyalarnn ayn ekilde ilenmesine devam edilir.

Konfigrasyon
Build ilemine balarken ncelikle envsetup.sh betii allan kabuk ierisinde iletilir:
$ source build/envsetup.sh

Daha sonra lunch komutuyla retilecek hedef imaja ait parametreler belirtilir. Girilecek
parametrenin format BUILD-BUILDTYPE eklinde olup aadaki tabloya gre belirlenebilir:

na Sreci

156

Gml Linux

Build smi

Cihaz

Aklama

aosp_arm

ARM
emlator

Tm uygulamalar, diller ve giri yntemleri aktif bir


imaj

aosp_maguro

maguro

Galaxy Nexus GSM/HSPA+ ("maguro") imaj

aosp_panda

panda

PandaBoard zerinde alacak imaj

Build tipleri ise aadakilerden biri olabilir:


Build Tipi
user
userdebug
eng

Kullanm Amac
Nihai rn kullanmna uygun, kstl eriim
Root eriimin ve debug imkann eklendii "user" tipi
Ek debug aralaryla zenginletirilmi gelitiricilere ynelik

imdi gelitiricilere ynelik ARM emlator zerinde alacak imajmz retmeye


balayalm:
$ lunch aosp_arm-eng

Yukardaki komutun almas bittiinde, ayarlanan deikenlerle ilgili aadaki gibi bir kt
verilecektir:
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=5.0.50.50.50.50
TARGET_PRODUCT=aosp_arm
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.16.0-4-amd64-x86_64-with-debian-jessie-sid
HOST_BUILD_TYPE=release
BUILD_ID=AOSP
OUT_DIR=out

Not: Herhangi bir parametre verilmediinde lunch uygulamas seim yapabilmemiz


iin bizi ynlendirecektir.

na Sreci

157

Gml Linux

Derleme
Derleme sreci olduka fazla zaman alacaktr. Bu nedenle ccache gibi bir compiler cache
sistemi kullanlmasnda fayda vardr.
Bunun iin USE_CCACHE ortam deikeninin deerini 1 olarak atamalyz:
$ export USE_CCACHE=1

Bu ilemin kalc olmas iin ~/.bashrc dosyasnn sonuna yazabilirsiniz.


Not: ccache ntanml olarak ~/.ccache dizinini kullanacaktr. Farkl bir dizin kullanmak
istiyorsanz (ortak bir dizin de olabilir) CCACHE_DIR ortam deikenini de benzer ekilde
tanmlamanz yeterlidir.
Sonrasnda bir defaya mahsus, ccache iin kullanlacak maksimum disk alann
limitleyebiliriz:
$ prebuilts/misc/linux-x86/ccache/ccache -M 50G
Set cache size limit to 50.0 Gbytes

Derleme srecinde GNU make'in -j parametresiyle paralel derleme yeteneklerinden


mutlaka faydalanlmaldr. Genel bir kural olarak CPU core saysnn 2 kat olacak ekilde bir
deer verilmesi nerilir. rnein 4 core'lu bir sistemde, -j 8 parametresinin kullanlmas
uygun olacaktr.
Derleme ilemi, standart make komutuyla aadaki gibi balatlr:
$ make -j8

na Sreci

158

Gml Linux

Sistem arlar
Modern iletim sistemlerinde, ekirdek kipinde alma ve kullanc kipinde alma modlar,
sert bariyerlerle birbirinden ayrlm durumdadr.
Bu ekildeki bir tasarm, sistemin salkl almas iin elzemdir.
Kullanc kipinde alan bir uygulamann, sistem arlar araclyla iletim sistemi
ekirdeinden ihtiya duyduu servisleri alabilmesi salanr.
Bununla birlikte, sistem arlar normal fonksiyon arlarna oranla olduka yksek
maliyetli ilemlerdir.
Her sistem arsnda uygulamann o anki durumunun saklanmas, ekirdein ilemcinin
kontroln ele almas ve ilgili sistem ars ile ekirdek kipinde talep edilen ilemleri
gerekletirmesi, sonra ilgili uygulamann tekrar alma sras geldiinde, uygulamann
saklanan durumunun yeniden retilip ilemlerin kald yerden devamnn salanmas
gereklidir.

Sistem arlar

159

Gml Linux

Sistem ars Nasl Gerekleir?


Sistem arlarnn kernel tarafndaki gerekletirimi mimariden mimariye deikenlik
gsterir. Linux ekirdeinin farkl bir mimariye port edilirken yaplan temel ilem admlarndan
biri, sistem arlarnn en verimli ekilde yapacak ekilde uygun bir kodlamann mimari
spesifik olarak yaplmasdr.
Her sistem arsnn 1, 5, 27 gibi ilikili bir numaras vardr. Bu numaralar da mimariden
mimariye deikenlik gstermektedir. Temel sistem arlar tm mimarilerde bulunmakla
birlikte, tm mimarilerde eit sayda sistem ars bulunmaz.
Konunun devamnda aksi belirtilmedike verilen rnekler 32 bit Intel mimarisi iin
geerlidir.
Kullanc kipindeyken herhangi bir sistem ars yapldnda INT 0x80 makine dili kodu ile
trap oluturulur.
Ayn zamanda talep edilen sistem arsnn numaras, EAX yazmacna yazlr.
Talep edilen sistem arsnn parametreleri var ise, bu parametrelerin dier yazmalar
kullanlarak belirtilmesi gerekir. Ancak her mimaride bu amala kullanlabilecek yazma
says limitlidir. Bazlarnda daha ok genel amal yazma var iken bazlarnda daha az
olduu grlmektedir.
32 bitlik Intel platformu iin Linux ekirdek versiyonu 2.3.31 ve sonras, maksimum 6 sistem
ars parametresini desteklemektedir. Bu parametreler srasyla EBX , ECX , EDX , ESI ,
EDI ve EBP yazmalarnda saklanr.

Sistem ars iin 6'dan fazla parametre gerekli olduunda, bellekteki bir veri yaps
hazrlanarak parametrelar burada saklanr, sonrasnda ilgili bellek adresi sistem arsna
parametre olarak geirilir.

Mimari Bamll
Sistem arlarnn dorudan ilemci mimarisine baml olduuna deinmitik.
rnek olarak Intel 32 bitlik ilemcilerde INT 0x80 ile trap oluturulurken, ARM mimarisinde
ayn ilem supervisor call SVC ile yaplr
Benzer ekilde Intel mimarisinde EAX yazmacna yazlan sistem arsnn numaras, ARM
mimarisinde R8 yazmacna koyulur.

Sistem arlar

160

Gml Linux

ARM mimarisinde sistem arsna ait 4 adede kadar parametre, R9 , R10 , R11 ve R12
yazmalarna aktarlr. 4 adetten fazla parametre geilmesi gerektiinde, bellek zerinde veri
yaps hazrlanarak bu blmn adresi geirilir.
Genel olarak sistem arlar performansnn ARM mimarisinde x86'ya gre daha dk
olduunu syleyebiliriz (yazma/register saysnn azl bunda etken olabilir mi dnnz).

Sistem ars Nasl Yaplr?


Sistem arlarn daha zor bir yoldan dorudan yapmak mmkn olsa da bu nerilen bir
durum deildir.
Sistem arlar, glibc ktphanesindeki wrapper fonksiyonlar zerinden kullanlr.
glibc ktphanesi, zerinde alt ekirdek versiyonuna gre, hangi Linux sistem

arsn yapacan belirler.


Baz durumlarda ise bundan daha fazlasn yaparak, zerinde allan ekirdek
versiyonunda hi desteklenmeyen bir zellii de sunuyor olabilir. rnek olarak, Linux 2.6
versiyonuyla birlikte gelen POSIX Timer API'nin olmad Linux 2.4 versiyonu zerinde
alan ve ayn anda pek ok timer kullanan bir uygulamanz var ise, glibc ekirdek
tarafndan alamad destei kullanc kipinde her timer iin bir thread aarak salar. Elbette
timer saynz fazla ise bu ok yava bir zm olur ancak uygulamann almasn da
mmkn klar.

Sistem arlar Glibc Fonksiyonlar likisi


Pek ok sistem ars, ayn isimdeki glibc wrapper fonksiyonlar zerinden
arlmaktadr.
Not: Bu duruma strace ktlarn okurken de dikkat etmemiz gereklidir.
rnek olarak strace ktsndaki open() arsna bakalm:
open("/tmp/index.jpeg", O_RDONLY) = 3

Burada kastedilen glibc ierisindeki open() fonksiyonu deil, open sistem arsdr.
Strace zerinden sistem arsna geirilen argmanlar ve geri dn deerini (3)
grmekteyiz.

Sistem arlar

161

Gml Linux

artc Bir Durum: Performans


Genel olarak bu dahil pek ok dokmanda sistem arlarnn ok yava olduunu
okuyabilirsiniz. Her sistem arsnda kullanc kipinden kernel kipine gei ve context switch
nemli bir yk getirir. Dolaysyla bu sre ne kadar verimli bir ekilde ynetilebilirse genel
sistem performans da ayn ekilde dorudan etkilenecektir.
2002 ylnda Linux Kernel eposta listelerine Mike Hayward'n aknln ieren bir eposta
dt. Hayward elindeki Pentium 3 - 850 Mhz dizst bilgisayaryla Pentium 4 - 2 Ghz ve
Xeon - 2.4 Ghz sistemlerinin, sistem arlar asndan performansn lmek iin bir test
uygulamas yazd ve 1K'lk buffered dosya okuma testinde aadaki artc sonular elde
etti:
Sistem

Saniyedeki IO

Pentium 3 - 850 Mhz

149

Pentium 4 - 2 Ghz

108

Xeon - 2.4 Ghz

69

Ayn testi dosya okuma yerine farkl sistem arlaryla da test ettiinde benzer sonularn
alndn tespi etti.
Bunun sebebi, baz x86 serisi ilemcilerde ekirdek kipine daha hzl gei iin
SYSENTER/SYSEXIT zel instruction'nn bulunmasyd. Pentium 3 serisinde varolan bu destek,

Pentium 4 ve Xeon ilemcilere yeterince olgunlamadndan konulmamt. Pentium 3'teki


bu imkan iyi deerlendiren Linux ekirdei, kendisinden daha stn Xeon ilemcilerden bile
daha iyi performans gstermekteydi.
Benzer zamanlarda AMD de benzer ekilde SYSCALL/SYSRET zel instruction'nn sunmaya
balamtr.
Linux ekirdei de bu yeni imkanlar kullanarak geleneksel INT 0x80 kesme yntemine gre
nemli oranda performans iyilemesi salanmtr.
Gnmz x86 ve x86_64 ilemcilerinde bu mekanizma tmyle desteklenmektedir.

Performans Problemi - Detayl Bak


zellikle x86 tabanl mimarilerde SYSENTER zel yolu sayesinde sistem arlarnn
hzlanmasn saladk. Ancak bu yeterli olacak mdr?
Bir ok uygulamada, zellikle gettimeofday() gibi sistem arlarnn ok sk kullanldn
grrrz.

Sistem arlar

162

Gml Linux

Uygulamalarnz strace ile incelediinizde, bilginiz dahilinde olmayan pek ok farkl


gettimeofday() arsn yapldn grebilirsiniz.
glibc ktphanesinden kullandnz baz fonksiyonlar, internal olarak bu fonksiyonaliteyi

kullanyor olabilir.
Java Virtual Machine gibi bir VM zerinde alan uygulamalar iin de benzer bir durum
sz konusudur.
Grece basit bir ilem olmasna ramen sk kullanlan bu operasyon yznden sistemlerde
nasl bir sistem ars yk olumaktadr? sorusunu kendimize sorabiliriz.

Linux Dynamic Linker/Loader: ld.so


Paylaml ktphaneler kullanan uygulamalarn altrlmas srasnda, Linux Loader
tarafndan gereken ktphaneler yklenerek uygulamann alaca ortam hazrlanr. En
basit Hello World uygulamamz bile libc ktphanesine baml olacaktr.
ldd ile uygulamann linklenmi olduu ktphanelerin listesini alabiliriz:

$ ldd hello
linux-vdso.so.1 (0x00007fff7d88a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2fb43a0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2fb476d000)

Grld zere libc ve ld.so bamllklar listelendi. Fakat linux-vdso.so.1


ktphanesi nedir?
find komutu ile tm sistemimizi arattmzda neden bu ktphaneyi bulamyoruz?

Virtual DSO: linux-vdso.so.1


linux-vdso.so.1 sanal bir Dnamically Linked Shared Object dosyasdr. Gerekte byle bir
ktphane dosya sistemi zerinde yer almaz. Linux ekirdei, ok sk kullanlan baz sistem
arlarn, bu ekilde bir hile kullanarak kullanc kipinde daha hzl gerekletirmektedir.
rnek olarak, sistem saati her deiiminde sonucu tm alan uygulamalarn adres
haritalarna da eklenmi olan zel bir bellek alanna koyarsa, gettimeofday() ilemi
gerekte bir sistem arsna yol amadan kullanc kipinde tamamlanabilir.
imdi bu konular biraz daha detaylandralm.

Sistem arlar

163

Gml Linux

Not: Konunun bundan sonras merakllar iin olup, ok gerekli olmayan bu blmn
yeni balayan kullanclar iin atlanmas nerilir.

/proc/self/maps
Linux proc dosya sisteminde /proc/<PID>/maps dosyasnda ilgili PID (process id) iin
ekirdek tarafndan yaplm olan adres haritalamas gsterilir.
zel bir durum olarak, <PID> yerine self ibaresi kullanldnda, o an bu dosya eriimini
yapan process ile ilgili dizinde ilem yaplm olur.
$ cat /proc/self/maps
00400000-0040c000 r-xp 00000000 08:02 1703938 /bin/cat
0060b000-0060c000 r--p 0000b000 08:02 1703938 /bin/cat
0060c000-0060d000 rw-p 0000c000 08:02 1703938 /bin/cat
024de000-024ff000 rw-p 00000000 00:00 0 [heap]
7ff7033c5000-7ff70369f000 r--p 00000000 08:02 2362900 /usr/lib/locale/locale-archive
7ff70369f000-7ff70383e000 r-xp 00000000 08:02 393230 /lib/x86_64-linux-gnu/libc-2.19
7ff70383e000-7ff703a3d000 ---p 0019f000 08:02 393230 /lib/x86_64-linux-gnu/libc-2.19
7ff703c69000-7ff703c6a000 rw-p 00000000 00:00 0
7fff8cd95000-7fff8cdb6000 rw-p 00000000 00:00 0 [stack]
7fff8cdfc000-7fff8cdfe000 r-xp 00000000 00:00 0 [vdso]
7fff8cdfe000-7fff8ce00000 r--p 00000000 00:00 0 [vvar]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]

vsyscall
/proc/self/maps dosyasna cat uygulamas ile bir ka defa baktnzda, vsyscall

(Virtual System Call Page) haricindeki blmlerin balang adreslerinin deitiini


grmekteyiz.
vsyscall blm, sadece bir uygulama iin deil, sistemdeki tm uygulamalar iin ayn

statik yeri gstermektedir.


Bu sayede dinamik linkleme (dolaysyla paylaml ktphane) kullanmayan, tamamen
statik uygulamalarn da bu statik adres zerinden vsyscall blmne eriimi mmkn
olmaktadr.
Bu blgenin uzunluu kstl olduundan, sadece belirli sayda girdiye sahiptir:
vgettimeofday(), vtime(), vgetcpu()
Tm uygulamalar iin ayn adrese haritalanmas, zellikle return to libc tr ataklaryla
sistem ars yaplabilmesine neden olmaktadr.

Sistem arlar

164

Gml Linux

Linux 3.0 versiyonuna kadar vsyscall tablosu kullanlm olmakla birlikte, 3.1 ve sonrasnda
bu yntem artk nerilmiyor. vDSO mekanizmas hem daha gvenli hem daha hzl.

vdso Blmn Dar kartmak


nceleme amacyla uygulamann adres haritasndaki [vdso] biiminde iaretlenmi alan
diske kartmaya alalm.
rneimizde bu blmn 7fff8cdfc000 ile 7fff8cdfe000 adresleri arasnda, 2 adet Page
byklnde olduunu gryoruz.
Acaba dd komutu ile bu blm dar kartabilir miyiz:
$ dd if=/proc/self/mem of=dso.out bs=1 skip=$((0x7fff8cdfc000)) count=8192

Maalesef bu yntem artk almyor. Bunun 2 nedeni var:


1.

/proc sanal dosya sistemi altndaki girdiler normal bir dosya gibi grnmesine karlk,
stat() ile bakldnda st_size deeri 0 olmaktadr. Bu durum dd uygulamasnn

ilgili offset adresine seek yaplamayacan sylemesine neden oluyor. zm iin ufak
bir yama gerekiyor
2. Yeni Linux ekirdek versiyonlarnda buradaki balang deer adresi, 7fff8cdfc000 her
uygulama iin ayn deildir. Return to libc tarz ataklar zorlatrmak iin bu deer
ancak alan uygulama ierisinden renilebilir. Bunun iin dd kodunun deitirilmesi
veya ufak bir test uygulamas yazlmas gerekiyor.

extract_region.c
Bu ilemi yapabilmek iin extract_region adn verdiimiz aadaki gibi bir uygulama
hazrlayalm:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define _FILE_OFFSET_BITS 64
int main (int argc, char *argv[])
{
if (argc != 3) {
fprintf(stderr,
"Kullanm: %s <cikti> <section>\n"
"\t<cikti>\t\t: export edilecek dosya\n"

Sistem arlar

165

Gml Linux

"\t<section>\t: export edilecek map region\n\n", argv[0]);


return 1;
}
off_t start_addr, end_addr;
char buf[4096];
const char *out = argv[1];
const char *region = argv[2];
int found = 0;
FILE *fp = fopen("/proc/self/maps", "r");
while (fgets(buf, sizeof(buf), fp)) {
printf("%s", buf);
if (strstr(buf, region)) {
found = 1;
break;
}
}
fclose(fp);
if (!found) {
fprintf(stderr, "%s blm bulunamad\n", region);
return 1;
}
end_addr = strtoull((strchr(buf, '-') + 1), NULL, 16);
*(strchr(buf, '-')) = '\0';
start_addr = strtoull(buf, NULL, 16);
printf("\nkartlacak Alan Balang: 0x%llx, Biti: 0x%llx\n\n", start_addr, end_addr);
FILE *dst = fopen(out, "w+");
if (dst == NULL) {
fprintf(stderr, "%s alamad\n", out);
return 1;
}
FILE *src = fopen("/proc/self/mem", "r");
char *tmp = malloc(end_addr - start_addr);
fseeko(src, start_addr, SEEK_SET);
fread(tmp, end_addr - start_addr, 1, src);
fwrite(tmp, end_addr - start_addr, 1, dst);
fclose(src);
fclose(dst);
return 0;
}

Test Uygulamamz altralm

Sistem arlar

166

Gml Linux

$ ./extract_region vdso.out vdso


...
7ff6db951000-7ff6dbaf0000 r-xp 00000000 08:02 393230 /lib/x86_64-linux-gnu/libc-2.19.so
7ff6dbf19000-7ff6dbf1a000 r--p 00020000 08:02 393236 /lib/x86_64-linux-gnu/ld-2.19.so
7ff6dbf1a000-7ff6dbf1b000 rw-p 00021000 08:02 393236 /lib/x86_64-linux-gnu/ld-2.19.so
7ff6dbf1b000-7ff6dbf1c000 rw-p 00000000 00:00 0
7fffc477d000-7fffc479e000 rw-p 00000000 00:00 0 [stack]
7fffc47fc000-7fffc47fe000 r-xp 00000000 00:00 0 [vdso]
kartlacak Alan Balang: 0x7fffc47fc000, Biti: 0x7fffc47fe000

lem bitiminde 8192 byte uzunluunda vdso.out dosyas oluacaktr.


file komutu ile dosyann tipine baktmzda standart bir ktphane gibi grnecektir:

$ file vdso.out
vdso.out: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID
[sha1]=538bea2738a229413dcc98af8f4f7127f9bca874, stripped

vdso ine Bakalm


objdump ile dar karttmz bu blme bir bakalm:

$ objdump -T vdso.out
vdso.out: file format elf64-x86-64
DYNAMIC SYMBOL TABLE:
0000000000000418 l d .rodata 0000000000000000 .rodata
0000000000000970 w DF .text 000000000000057d LINUX_2.6 clock_gettime
0000000000000000 g DO *ABS* 0000000000000000 LINUX_2.6 LINUX_2.6
0000000000000ef0 g DF .text 00000000000002b9 LINUX_2.6 __vdso_gettimeofday
00000000000011d0 g DF .text 000000000000003d LINUX_2.6 __vdso_getcpu
0000000000000ef0 w DF .text 00000000000002b9 LINUX_2.6 gettimeofday
00000000000011b0 w DF .text 0000000000000015 LINUX_2.6 time
00000000000011d0 w DF .text 000000000000003d LINUX_2.6 getcpu
0000000000000970 g DF .text 000000000000057d LINUX_2.6 __vdso_clock_gettime
00000000000011b0 g DF .text 0000000000000015 LINUX_2.6 __vdso_time

Basit Bir Test Uygulamas


100.000 defa gettimeofday() fonksiyonunu aran ve ilem bitiminde balang ve biti
zamanlarn gsteren rnek bir uygulama yapalm:
Sistem arlar

167

Gml Linux

#include <stdio.h>
#include <sys/time.h>
int main ()
{
int i;
struct timeval now;
struct timeval before;
struct timeval after;
gettimeofday(&before, NULL);
for (i = 0; i < 100000; i++) gettimeofday(&now, NULL);
gettimeofday(&after, NULL);
printf("Before: %li.%li\n", before.tv_sec, before.tv_usec);
printf("After : %li.%li\n", after.tv_sec, after.tv_usec);
return 0;
}

X86_64 ve ARM zerinde Test


100.000 defa gettimeofday ars yapan time_test rnek uygulamasn, 1 Ghz hzna
drlm X86_64 i5 ilemcili platform ile 1 Ghz saat frekansndaki ARM BeagleBoneBlack
platformunda karlatralm
(X86_64) $ ./time_test
Before: 1419786575.719463
After : 1419786575.722560
(ARM) $ ./time_test
Before: 1419786909.186960
After : 1419786909.252160

Grld zere X86_64'te 3-4 milisaniyede gerekleen ilem, ARM sistemimizde 70


milisaniyelerde gereklemektedir.
imdi test uygulamammz bir de strace kontrolnde her iki platformda altralm:

Sistem arlar

168

Gml Linux

(X86_64) $ strace ./time_test


...
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff4ee1f1000
write(1, "Before: 1419787456.897162\n", 26Before: 1419787456.897162) = 26
write(1, "After : 1419787456.904669\n", 26After : 1419787456.904669) = 26
exit_group(0)
##########################
(ARM) $ strace ./time_test
...
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x400b3000
gettimeofday({1419787571, 234967}, NULL) = 0
gettimeofday({1419787571, 235064}, NULL) = 0
gettimeofday({1419787571, 235142}, NULL) = 0
gettimeofday({1419787571, 235257}, NULL) = 0
gettimeofday({1419787571, 235394}, NULL) = 0
...
...
write(1, "Before: 1419787571.234967\n", 26) = 26
write(1, "After : 1419787571.976285\n", 26) = 26
exit_group(0) = ?

X86_64 platformunda strace ile yaptmz incelemede, herhangi bir gettimeofday()

sistem ars gremedik


Beklediimiz ekilde linux-vdso.so mekanizmas sayesinde, ilem tamamen kullanc
kipinde gerekletirildi, herhangi bir sistem ars yaplmad
Sadece printf() fonksiyonu nedeniyle write() sistem ars kullanlarak son kt
konsola gnderildi
ARM mimarisindeki rneimize baktmzda, benzeri bir mekanizma olmad iin, her

defasnda karlk gelen bir gettimeofday() sistem ars yapldn gryoruz (rnek
ekran ktmzda ... olarak belirttiimiz blmde 100000 adet benzer ar
bulunmaktadr)

Sistem arlarnn Kesintiye Uramas


Kendimize u soruyu soralm: uygulamamz bir sistem ars yaparak ekirdek kipinde kod
iletiliyor durumunda iken sinyal (software interrupt) gelirse ne olur?
Bu durumda sistem ars sona erecek ve EINTERRUPTED hatas dnecektir.

Sistem arlar

169

Gml Linux

Sistem arlarn glibc zerinden kullandmz iin, glibc tarafnda sistem arsndan
EINTR hatas geldiinde, uygulamaya geri dn deeri olarak -1 dnlr fakat errno

global deikeni EINTR eklinde ayarlanr.


Bu aslnda hata olmayan istisnai durum, zaman zaman pek ok uygulama kodunda gzard
edilmektedir.
Baz kullanm senaryolarnda yukardaki senaryo istisnai olmaktan kp, ilgili yazlmn
doas gerei srekli veya sklkla da (read, write, open, connect vb.) oluabilir.
Uygulama perspektifinden baktmzda tm sistem arlarn sarmalayan fonksiyonlar iin
aadaki kural geerlidir:
Eer bir sistem arsnn geri dn deeri 0 'dan kkse ve errno deikeni
EINTR sabitine eitse, herhangi bir hata sz konusu deildir.

Bahsedilen senaryo olutuunda ilgili fonksiyonun (yani sistem arsnn) yeniden


arlmas gerekir.
Bu sre, ilgili sinyallerin oluturulmasnda SA_RESTART bayrann iaretlenmesi suretiyle
otomatik hale getirilebilir. Peki neden ntanml olarak bu ekilde deil?
Esasen bir zamanlar yleydi. Ancak sistem arsnn otomatik olarak yeniden balatlmasn
istemeyeceimiz durumlar da olabilir. Bu yzden ntanml olarak bir aksiyon alnmyor.

Sistem arlar

170

Gml Linux

Strace Kullanm
Nasl alr?
Unix tabanl sistemlerde strace gibi bir uygulamann varolabilmesi iin gereken ptrace
sistem ars uzun yllardr (SVr4 ve 4.3BSD) bulunmaktadr.
Sistem ars ismini process trace kavramndan alr. ptrace sistem ars zerinden bir
uygulama baka bir uygulamann durumunu takip edebildii gibi deiiklikler yapma
imkanna da sahip olmaktadr.
ptrace sistem ars temel olarak gdb gibi debug uygulamalarnda, strace, ltrace gibi

sistem veya ktphane arlarn takip uygulamalarnda, code coverage aralarnda,


alan yazlm koduna dokunmadan baz hatalarn giderilmesinde veya gvenlik
kontrollerinden geirilmesinde kullanlr.
ptrace arsyla bir uygulamann kontrol tamamen baka bir uygulamaya verilmektedir.

Buradaki kontrolden kastmz, uygulamann kulland tm bellek alanna eriim, sinyallerin


alnmas, deitirilmesi, file descriptor'larn ynetimi hatta uygulamann kod segmentinin
deitirilerek yamalar yaplmas dahil aklmza gelebilecek hemen her trden tehlikeli
deiikliklere izin veriliyor olmasdr.
Bahsettiimiz bu zelliklerinden tr, bir uygulamann baka bir uygulamay ptrace ile
kontrol edebilmesi iin, ilgili uygulamaya sinyal gnderme yetkisinin bulunmas gerekir.
Dolaysyla zel durumlar haricinde her kullancnn kendi sahibi olduu dier uygulamalar
ptrace ile kontrol edebileceini, root kullancsnn da sistemdeki tm uygulamalar kontrol
edebileceini syleyebiliriz.
Linux Capabilities API sisteminin gelitirilmesinden sonra yukarda koullardan bamsz
olarak, CAP_SYS_PTRACE zellii sayesinde de ptrace izni verilebilmektedir.

Tipik Kullanm
Uygulamanz strace ile aadaki biimde balatmanz yeterlidir:
$ strace ls /tmp

Strace Kullanm

171

Gml Linux

Ancak ou zaman ok daha nceden balatlm ve almaya devam eden, bununla


birlikte herhangi bir sorun nedeniyle ek bilgi toplamak istediiniz durumlar oluur. strace ile
herhangi bir alan uygulamaya, -p parametresine <PID> deerini vermek suretiyle
attach olabiliriz:
$ strace -p $(pidof mysqld)
Process 26829 attached - interrupt to quit
select(13, [10 12], NULL, NULL, NULL) = 1 (in [10])
fcntl64(10, F_SETFL, O_RDWR|O_NONBLOCK) = 0

accept(10, {sa_family=AF_INET, sin_port=htons(33033), sin_addr=inet_addr("192.168.0.15")}, [16]) = 34


fcntl64(10, F_SETFL, O_RDWR) = 0
rt_sigaction(SIGCHLD, {SIG_DFL, [CHLD], SA_RESTART}, {SIG_DFL, [CHLD], SA_RESTART}, 8) = 0

getpeername(34, {sa_family=AF_INET, sin_port=htons(33033), sin_addr=inet_addr("192.168.0.15")}, [16])


...

-f Parametresi
Strace'in uygulamann tm thread'lerini ve uygulamadan fork() edilen dier ocuk srelerini
takip edebilmesi iin -f parametresi verilmelidir.
$ strace -f ./example
$ strace -f -p $(pidof mysqld)

-e Parametresiyle Filtreleme
Strace kts zaman zaman takip iin olduka kalabalk olabilir.
Sadece belirli sistem arlarn takip etmek istiyorsanz e parametresi ile bunu
yapabilirsiniz:
$ strace -f -e trace=open,write,close,connect,select -p 3245

Sadece dosya ilemleriyle ilgili sistem arlarn takip etmek iin -e trace=file
kullanlabilir:
$ strace -e trace=file 4535

Sadece network ile ilgili sistem arlarn filtrelemek iin -e trace=network kullanlabilir:
$ strace -e trace=network 23232

Strace Kullanm

172

Gml Linux

Zaman Bilgisi Alma: -tt


Sistem arlarnn kts alnrken saniye hassasiyetinde zaman bilgisi de almak istiyorsak
-t parametresini kullanabiliriz.

ou zaman saniye hassasiyeti yeterli olmayacaktr. Mikrosaniye hassasiyetinde zaman


bilgisi almak iin -tt parametresini kullanabiliriz:
$ strace -tt ls /tmp
...
00:07:10.595807 openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
00:07:10.595885 getdents(3, /* 6 entries */, 32768) = 176
00:07:10.595977 getdents(3, /* 0 entries */, 32768) = 0
00:07:10.596041 close(3)

statistiki Bilgi Alma: -c


-c parametresi ile istediimiz sre boyunca sistem arlaryla ilgili istatistik toplayabiliriz:

$ strace -f -c -p $(pidof mysqld)


% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ---------------42.89 0.592035 275 2149 151 read
28.11 0.388024 2587 150 18 futex
27.82 0.384023 1352 284 select
1.16 0.016001 3200 5 rt_sigtimedwait
0.01 0.000154 0 1457 write
0.01 0.000152 22 7 accept
0.00 0.000007 0 9478 time
0.00 0.000000 0 108 open
0.00 0.000000 0 136 close
0.00 0.000000 0 40 unlink
0.00 0.000000 0 5 alarm
0.00 0.000000 0 9 access
0.00 0.000000 0 21 ioctl
0.00 0.000000 0 2409 gettimeofday
................

-o le ktlarn Kayt Edilmesi


strace uzun sreli altrlp oluan loglar daha detayl olarak geni zaman aralnda

incelenecekse, loglarn kayt edilmesi gerekecektir.


-o parametresi ile loglarn kayt edilecei dosyay belirtebilirsiniz:

Strace Kullanm

173

Gml Linux

$ strace -f -o /tmp/strace.log -e trace=file ls /tmp

Ptrace Engelleme
Linux altnda bir uygulamann, kendisinin root harici kullanclar tarafndan ptrace sistem
ars ile kontrol edilmesini engelleyebilmesine imkan verilmitir.
Bu ilem iin prctl zel sistem ars kullanlr. Uygulama prctl araclyla kendisi iin
PR_SET_DUMPABLE bayran temizleyecek olursa root haricindeki kullanclarn uygulamaya

sinyal gnderme hakk olsa dahi bu uygulamay ptrace ile kontrol etme anslar olmaz.
Bu zelliin en tipik kullanmlarndan biri, OpenSSH authentication agent yazlmnda
grlr. Bylelikle kullanclarn parola girme aamasnda uygulamann ptrace ile baka bir
uygulama tarafndan kontrol engellenmi olur.

Gvenlik
Linux kullanmnn yaygnlamasyla birlikte zararl yazlmlara rastlanma skl da
artmaktadr. Geleneksel Linux process modelindeki ptrace imkan seti sebebiyle,
sisteminizde kendi kullancnzla altrdnz herhangi bir yazlm ierisine zararl bir kod
enjekte edilmi ise (en basit xterm aracndan gelimi web tarayc uygulamalarna kadar),
ptrace sistem ars sayesinde alan dier tm uygulamalarnzn kontrolnn bu zararl

yazlm tarafndan devralnmas ve siz hi bir ey farketmeden nemli bilgilerin


kopyalanmas mmkndr.
Pek ok kullancnn farknda olmad bu duruma karlk, Linux ekirdei ierisindeki Yama
kod adl gvenlik modlyle bir koruma mekanizmas gelitirilmitir. (Ayrntl bilgiler iin:
https://www.kernel.org/doc/Documentation/security/Yama.txt)
Yama modl olan Linux ekirdeinde, /proc/sys/kernel/yama/ptrace_scope dosyas
zerinden ptrace sistem arsna verilecek tepki kontrol altna alnabilmektedir. ntanml
olarak bu dosyada 0 deeri yazmaktadr. Dosyada yazan deer aadaki tablo
dorultusunda yorumlanr:

Strace Kullanm

174

Gml Linux

Deer

Anlam

Geleneksel davran: nceki blmde anlatlanlar dorultusunda ptrace


yapabilme hakknn bulunduu tm uygulamalar kontrol edilebilir

Kstlandrlm ptrace : sadece uygulamann dorudan parent


process'lerine veya PR_SET_PTRACER opsiyonuyla uygulama tarafndan izin
verilen debug uygulamalarna ait PID deerlerinin eletii uygulamalara
kontrol izni verilir. Bylece gdb program_adi ve strace program_adi
eklindeki kullanmlar almaya devam eder ancak alan bir uygulamaya
sonradan attach olmaya izin verilmeyecektir (dolaysyla strace -p PID
yntemi de almayacaktr). Dier opsiyon da zellikle KDE, Chromium,
Wine gibi uygulamalarn kulland, debug/crash handler'a ait PID deerinin
PR_SET_PTRACER ile uygulama ierisinden belirtilmesi ve bu sayede spesifik bir
uygulamann ptrace yapabilmesi eklindedir

Sistem yneticisine ptrace : sadece CAP_SYS_PTRACE zellii tanmlanm


uygulamalar veya prctl ile PTRACE_TRACEME opsiyonunu tanmlayan ocuk
process'ler kontrol edilebilir

Tamamen devre d: hi bir art altnda ptrace yaplmasna imkan


tannmaz. Bu zellik bir defa tanmland takdirde alma annda tekrar
deiiklik yaplamaz

Her ne kadar uygulamalar prctl zerinden kendilerinin ptrace yaplabilmesini root


kullancs dnda devre d brakabiliyor olsalar da, pek ok yazlmc bu detaylarn
farknda deildir. OpenSSH agent' gibi dorudan gvenlikle ilgili yazlmlar bu ilemleri
yapyor olmasna karn, sistemde alan tm yazlmlardan ayn davran beklemek doru
olmaz. Bu nedenle sistem genelinde yazlmdan bamsz zmlerin retilmesi nem tar.
Son zamanlarda baz Linux datmlar (Ubuntu vb.) yukarda tariflediimiz ptrace_scope
dosyasnn ntanml deerini 1 yapmaya balamlardr. Bylelikle ptrace ilemleri
kstlandndan sistem genelinde daha gvenli bir alma ortam salanmaktadr.
Android kullanan sistemler de dnldnde bu gibi gvenlik konularnda daha hassas
olunmas gerektii aktr.

rnek strace gerekletirimi


Aadaki rnek uygulamay ministrace.c adyla kaydedip
$ gcc -m32 -o ministrace ministrace.c

ile derleyebilirsiniz.
Not: rnek uygulama 32 bitlik sistemler iin yazlm olup mimari farkllklar gzard
edilmitir. Bu sebeple 32 bitlik bir sistemde veya gcc-multilib kurulu ise -m32
parametresi ile derlemelisiniz.

Strace Kullanm

175

Gml Linux

/* ministrace.c */
#include <sys/ptrace.h>
#include <sys/reg.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
int wait_for_syscall(pid_t child)
{
int status;
while (1) {
ptrace(PTRACE_SYSCALL, child, 0, 0);
waitpid(child, &status, 0);
if (WIFSTOPPED(status) && WSTOPSIG(status) & 0x80)
return 0;
if (WIFEXITED(status))
return 1;
}
}
int do_child(int argc, char **argv)
{
char *args [argc+1];
memcpy(args, argv, argc * sizeof(char*));
args[argc] = NULL;
ptrace(PTRACE_TRACEME);
kill(getpid(), SIGSTOP);
return execvp(args[0], args);
}
int do_trace(pid_t child)
{
int status, syscall, retval;
waitpid(child, &status, 0);
ptrace(PTRACE_SETOPTIONS, child, 0, PTRACE_O_TRACESYSGOOD);
while(1) {
if (wait_for_syscall(child) != 0) break;
syscall = ptrace(PTRACE_PEEKUSER, child, sizeof(long)*ORIG_EAX);
fprintf(stderr, "syscall(%d) = ", syscall);
if (wait_for_syscall(child) != 0) break;
retval = ptrace(PTRACE_PEEKUSER, child, sizeof(long)*EAX);
fprintf(stderr, "%d\n", retval);
}
return 0;

Strace Kullanm

176

Gml Linux

}
int main(int argc, char **argv)
{
if (argc < 2) {
fprintf(stderr, "Usage: %s prog args\n", argv[0]);
exit(1);
}
pid_t child = fork();
if (child == 0) {
return do_child(argc-1, argv+1);
} else {
return do_trace(child);
}
}

Uygulama derlendikten sonra herhangi bir komutu ministrace ile altrp kty
inceleyebiliriz:
$ ./ministrace date
syscall(11) = 0
syscall(12) = 21843968
syscall(21) = -2
syscall(9) = 164245504
...
syscall(9) = 164241408
syscall(1) = Tue Mar 3 13:44:52 EET 2015
29
syscall(3) = 0
...

rnek uygulamamzda 65 satrlk bir kod ile strace uygulamasnn temel alma prensibi
gsterilmeye allmtr. Daha gelimi bir rnekte sistem arlarnn numaralarndan
isimlerine ulamak, arda kullanlan parametreleri ve geri dn kodlarnn ilgili sistem
ars zelinde anlamlarn gstermek mmkn olabilir.

Strace Kullanm

177

Gml Linux

GNU Build Sistemi Aralar


Bu blmde uygulamalarn kaynak kodlarnn derlenmesi ve sisteme kurulmas srelerinde
yardmc olacak aralar ele alnmaktadr.
Linux sistemler zerinde yazlm gelitirme yaparken, sklkla bu aralar kullanmakta
olduumuzdan, bu konulardaki farkndaln artrlmasnn sonraki srelerde pek ok
faydas olacaktr.
Temel olarak make uygulamas ve Makefile dosyalar kullanm anlatlacak, daha sonra
kod tanabilirliini ve kurulum srelerini de hedefleyen autoconf & automake sistemiyle
ilgili genel bilgi verilmeye allacaktr.

GNU Build Sistemi Aralar

178

Gml Linux

Make
Uygulama gelitirirken sklkla obje dosyalarmz yeniden ve yeniden oluturmak zorunda
kalrz. Yerine gre gcc , ld , ar vb. uygulamalar tekrar tekrar ayn parametrelere
arrz. te make ugulamas, programlarn yeniden derlenme srecini otomatik hale
getirmek, sadece deien ksmlarn yeniden derlenmesini salamak suretiyle zamandan
kazanmak ve ilemleri her zaman otomatik olarak doru srada yapmak iin tasarlanmtr.

Temel Kurallar
make uygulamas altrldnda, bulunulan dizinde srasyla GNUmakefile , makefile ve
Makefile dosyalarn arar. Alternatif olarak -f seenei ile Makefile olarak kullanacanz

dosyay da belirlemeniz mmkn olsa da standartlarn dna kmamakta fayda var. make
neyi nasl yapacan bu dosyalardan renecektir. Eer bulunduunuz dizinde bir
Makefile dosyas yoksa aadaki gibi bir kt alacaksnz demektir:

$ make
make: *** No targets specified and no makefile found. Stop.

Genel kabul grml ve gz alkanl asndan dosya ad olarak alternatiflerin


yerine Makefile isminin kullanlmas nerilir
Bir Makefile aslnda ilemlerin nasl yaplacan gsteren kural tanmlamalarndan
olumaktadr. Genel olarak dosyann biimi aadaki gibidir:
hedef1: bamllklar
<TAB> komut
<TAB> komut
<TAB> ...
hedef2: bamllklar
...

Burada en sk yapacamz hata TAB tuuna basmay unutmak olacaktr. Makefile


dosyasn hazrladnz editrden kaynaklanan bir problem de olabilir. TAB ilemine dikkat
edilmediinde aadaki gibi bir uyar alabilirsiniz:
$ make
Makefile:6: *** missing separator (did you mean TAB instead of 8 spaces?)

Make

179

Gml Linux

Kurallar arasnda bir satr bo braklmas GNU make iin zorunlu olmamakla birlikte baz
Unix versiyonlaryla uyumluluk iin boluk braklmas gereklidir.
lk satrda hedef1 'in oluturulmasnda etkili olan, dolaysyla bamllk reten dosyalar
birbirinden boluk ile ayrlm olarak tek satrda listelenir. Eer bamllk ksmnda yer alan
dosyalardan en az birinin son deitirilme tarihi, hedef1 'den daha yeni ise, hedef1 yeniden
oluturulur. Dier durumda hedef1 'in yeniden oluturulmasna gerek olmad anlalr,
nk hedef1 'in baml olduu dosyalarda hedef1 retildikten sonra bir deiiklik
olmamtr.
NOT: Grld zere dosyalarn son deitirilme tarihleri zerinden ileyen bir
mekanizma bulunmaktadr. Sistem saatiniz ileri veya geri zplarsa kurallar doru
alamayacaktr. Bu durumda make clean ile nce tam bir temizlik yaplp yeniden
sreci balatabilirsiniz.
Eer sistem zamanndaki oynamalar nedeniyle, dosyalarn son gncellenme zamanlar,
o anki sistem saatinden daha ileride ise, make: warning: Clock skew detected. Your
build may be incomplete eklinde bir uyar alnacaktr.
Sonraki satrlarda bamllk yaratan bu dosyalardan hedef1 'in oluturulabilmesi iin gerekli
komutlar yer alr. imdi basit bir rnek iin nce yeni bir dizin oluturup ierisinde aadaki
Makefile dosyasn oluturalm:

bolgeler: marmara karadeniz ege


cat marmara karadeniz ege | sort -u > bolge_toplamlari
marmara: istanbul bursa
cat istanbul bursa | sort -u > marmara
karadeniz: samsun sinop
cat samsun sinop | sort -u > karadeniz
ege: izmir aydin
cat izmir aydin | sort -u > ege
clean:
rm -f ege karadeniz marmara bolgeler

Dosyamz hazrladktan sonra make komutunu altralm:


$ make
make: *** No rule to make target `istanbul', needed by `marmara'. Stop.

Yukardaki rnekte neler olduunu anlamaya alalm:


1.

make uygulamasna Makefile ierisindeki bir hedef kural ismini parametre olarak

Make

180

Gml Linux

vermediimizde ntanml olarak dosyada bulduu ilk hedefi gerekleme alr


2. Dosyamzdaki ilk hedefin bolgeler olduunu grdk
3.

bolgeler hedefinin bamllklar marmara , karadeniz ve ege dosyalar eklindeymi

4. Eer bulunduumuz dizinde bolgeler dosyas zaten mevcut ve son deitirilme tarihi,
bamllklar olan marmara , karadeniz ve ege dosyalarnn her nden de daha
gncel olsa idi, make yeni bir ilem yapmaya gerek olmadn dnecekti. Ancak
bizim dizinimizde henz bu dosyalarn hi biri yok
5. Bu nedenle bolgeler hedefini gereklemek iin ncelikle dizinde mevcut olmayan
marmara hedefini gereklemek iin ilemlere baland

6.

marmara hedefi de benzer ekilde istanbul ve bursa dosyalarna baml ve her iki

dosya da sistemde yok


7. Bir nceki durumdan farkl olarak, istanbul dosyas dizinde mevcut olmad gibi bu
dosyay retecek herhangi bir hedef de tanml deil.
8. Bu yzden marmara hedefini retebilmek iin gereken (dizinde mevcut olmayan)
istanbul hedefini retecek kural da yok eklinde bir hata mesaj ile make sreci
sonlanmtr
Eer bulunduumuz dizinde, istanbul ve bursa dosyalarn oluturacak olursak, make
sonras marmara hedefinin retildiini grebileceiz. Ayn ekilde dier blgeler iin de
Makefile dosyasnda tanmladmz kurallar dorultusunda gereken dosyalar

rettiimizde, onlar da make tarafndan oluturulacaktr.


Sonrasnda herhangi bir il dosyasn gncellediimizde, ona bal blge tm blgeleri ieren
dosya otomatik olarak gncellenecektir.
imdi de C dilinde yazlm basit bir uygulamann derlenmesi srecine ynelik rnek
Makefile dosyamza bakalm:

CC = gcc
CFLAGS = -O2 -Wall -pedantic
LIBS = -lm -lnsl
all: install
ornek: ornek.o
$(CC) $(CFLAGS) $(LIBS) -o ornek ornek.o
ornek.o: ornek.c
$(CC) $(CFLAGS) -c ornek.c
clean:
rm -f ornek *.o
install: ornek
cp ornek /usr/local/bin

Make

181

Gml Linux

Bu rnekte hedef olarak ornek uygulamas derlenecektir. Uygulamann baml olduu


dosya ornek.o eklinde olup bu dosya da ornek.c kaynak kod dosyasna bamldr.
lk satrda yer alan CC deikeniyle kullanacamz derleyiciyi belirliyoruz. Makefile
dosyalar ierisinde bu ekilde deiken tanmlamas yapp, deikeni dosya ierisinde
$(deiken) eklinde kullanabiliriz. kinci satrda ise derleyiciye vereceimiz baz

seenekleri CFLAGS deikenine atyoruz. nc satrda uygulamamzn linklenmesi


gereken ktphaleri -l parametresiyle listeledik. Ardndan ilk kuralmz geliyor: ornek
dosyas ornek.o dosyasna baml olarak belirtilmi ve ornek.o 'dan ornek 'in
oluturulabilmesi iin gerekli komut hemen altnda listelenmitir. Deikenlerin deerlerini
yerine koyduumuzda komutumuz gcc -O2 -Wall -pedantic -lm -lnsl -o ornek ornek.o
eklinde olacaktr.
kinci kuralmz ornek.o 'nun nasl oluturulacan belirtmektedir. ornek.c dosyasnda bir
deiiklik olduunda ornek.o dosyas hemen altnda listelenen komutla yeniden oluturulur:
$ gcc -O2 -Wall -pedantic -c ornek.c

nc kuralmzda altmz dizinde nasl temizlik yapacamz belirtiyoruz. make clean


komutunu altrdmzda ornek dosyas ve .o ile biten obje dosyalar silinecektir.
Drdnc kuralmz ise install eklinde. Bu kuralda da ornek dosyasnda bir deime
olduunda cp ornek /usr/local/bin komutu ile dosyay /usr/local/bin dizini altna
kopyalyoruz.
Makefile ierisindeki her bir kural make uygulamasna seenek olarak verilebilir ve ayrca
iletilebilir. Yukardaki gibi bir Makefile dosyasna sahipsek make ornek.o komutuyla sadece
ornek.o iin verilen kuraln altrlmasn salayabiliriz. Veya make install komutuyla
sadece install kuralnn almasn salayabiliriz. Ancak install hedefi ayn zamanda
ornek 'e baml olduundan ornek iin girilen kurallar da alacaktr. Ayn ekilde ornek

de ornek.o 'ya baml olduundan ornek.o kural da alacaktr.


imdi bu Makefile dosyasnn bulunduu yerde ornek.c kaynak dosyasn da
hazrladmz varsayarak aadaki ktlar inceleyelim:

Make

182

Gml Linux

$ make ornek.o
gcc -O2 -Wall -pedantic -c ornek.c
$ make clean
rm -f ornek *.o
$ make
gcc -O2 -Wall -pedantic -c ornek.c
gcc -O2 -Wall -pedantic -lm -lnsl -o ornek ornek.o
cp ornek /usr/local/bin

Yukardaki Makefile rneimize tekrar dnelim. make clean komutunu altrdmzda


derleme sonrasnda oluan dosyalar silinmektedir. Peki, bulunduumuz dizinde ismi clean
olan bir dosya mevcut ise ne olur?
$ touch clean
$ make clean
make: `clean' is up to date.

Grdnz gibi clean adnda bir dosya var olduu ve clean iin bamllk listesi
olmadndan dolay, kuraln gncelliini koruduunu ve alttaki komutlarn altrlmamas
gerektiini dnd. te bu gibi durumlar iin zel bir kural mevcuttur: .PHONY
Yukarda anlatlan problemi giderebilmek iin Makefile dosyamzn ieriine aadaki kural
da eklemeliyiz:
.PHONY: clean

Bylelikle make clean komutunun, bulunulan dizinde clean adnda bir dosya olsa bile
dzgn olarak almasn salam olduk, bir nevi clean hedefini korumaya alm olduk.

Soyut Makefile Kurallar Tanmlamak


nceki blmde temel olarak make kullanm zerinde durduk. rnek bir Makefile hazrladk.
Ancak tek bir kaynak dosyasndan oluturulan bir uygulama iin make sistemi o kadar da
yararl bir ey deil. Zaten gerekte de en kk uygulama bile onlarca kaynak dosyasndan
oluur. imdi byle bir uygulama iin Makefile hazrlayalm.

rnek: Soyut kurallar kullanlmam Makefile


Aadaki bir ksm ortak kullanlan az sayda kaynak dosyadan oluan 2 adet uygulamann
derleme srecini yneten Makefile rneini inceleyiniz:

Make

183

Gml Linux

LIBS = -lm \
-lrt \
-lpthread \
$(shell pkg-config --libs openssl)
INCLUDES = -I/usr/local/include/custom
all: server client
server: common.o server.o list.o
$(CC) $(CFLAGS) $(LIBS) -o server common.o server.o list.o
client: common.o client.o
$(CC) $(CFLAGS) $(LIBS) -o client common.o client.o
common.o: common.c common.h
$(CC) $(CFLAGS) $(INCLUDES) -c common.c
server.o: server.c server.h common.h list.h
$(CC) $(CFLAGS) $(INCLUDES) -c server.c
client.o: client.c client.h ortak.h
$(CC) $(CFLAGS) $(INCLUDES) -c client.c
list.o: list.c list.h
$(CC) $(CFLAGS) $(INCLUDES) -c list.c
install: client server
mkdir -p /usr/local/bin
cp client /usr/local/bin/
cp server /usr/local/bin/
uninstall:
rm -f /usr/local/bin/client
rm -f /usr/local/bin/server
clean:
rm -f *.o server client
.PHONY: clean

Kullandmz derleyici, derleyici seenekleri, ktphaneler gibi deerleri deikenlere


atamakla neler kazandmza bir bakalm. Derleyici parametrelerini deitirmeye karar
verdiimizde deiken kullanmyor olsaydk 6 farkl yerde bu deiiklii el ile yapmak
zorunda kalacaktr. Fakat imdi ise sadece CFLAGS deikeninin deerini deitirmemiz
yeterli olacaktr.

Make

184

Gml Linux

Ancak gene de yukardaki gibi bir Makefile yazmak uzun srecek bir ilemdir. Eer
uygulamanz 60 adet .c dosyasndan oluuyorsa ve 60 farkl obje iin tek tek kurallar
yazmak zorunda kalyorsanz bu ho olmaz. nk tm .o dosyalarn retebilmek iin
vereceimiz komut ayn: $(CC) $(CFLAGS) $(INCLUDES) -c xxx.c Oysa biz 60 defa bu komutu
tekrar yazmak zorundayz. te bu noktada soyut kurallar (abstract rules) imdadmza yetiir.
Bir soyut kural genel olarak *.u1 uzantl bir dosyadan *.u2 uzantl bir dosyann nasl
retileceini tanmlar. Kullanm aadaki gibidir:
.u1.u2:
komutlar
komutlar
...

Burada u1 kaynak dosyann uzants iken, u2 hedef dosyann uzantsdr. Bu tr


kullanmda dikkat ederseniz bamllk tanmlamalar yer almamaktadr. nk
tanmladmz soyut genel kural iin bamllk belirtmek ok anlaml deildir. Bunun yerine
.u1 uzantl bir dosyadan .u2 uzantl dosya retmede istisnai olarak farkl bamllklar olan
kurallar da ileride vereceimiz rnekte olduu gibi belirtilebilir.
Soyut kurallar tanmlarken aadaki zel deikenleri kullanmak gerekecektir:
zel
Deiken

levi

$<

Deitii zaman hedefin yeniden oluturulmas gereken bamllklar


gsterir

$@

Hedefi temsil eder

$^

Geerli kural iin tm bamllklar temsil eder

Bu bilgiler nda hemen bir rnek verelim. Uzants .cpp olan bir kaynak kodundan obje
kodunu retebilmek iin aadaki gibi bir kural tanmlayabiliriz:
.cpp.o:
g++ -c $<

imdi konuya biraz daha aklk getirelim. Kaynak dosyamzn ad helper.cpp ve amacmz
helper.o obje dosyasn retmek olsun. Yukardaki kural kaynak dosyamz iin altnda
.cpp.o: satr yznden helper.cpp, oluacak helper.o iin bir bamllk durumunu alr. Bu

nedenle $< deikeni helper.cpp'yi gsterir. Bu sayede helper.o dosyas retilmi olacaktr.
imdi ayn mantkla obje dosyalarndan altrlabilir programmz retelim.

Make

185

Gml Linux

.o:
g++ $^ -o $@

Bu biraz daha kark nk altrlabilir dosyamzn uzants olmayacak. Eer tek bir
uzant verilmi ise bunun birinci uzant olduu ve ikincinin bo olduu dnlr.
Soyut kurallar tanmladmzda yapmamz gereken iki ilem daha bulunur. Bunlardan
birincisi kullandmz uzantlarn neler olduunu belirtmektir. Bu ilem iin .SUFFIXES zel
deikeni kullanlr:
.SUFFIXES: .cpp .o

Dier yapmamz gereken ilem ise retilecek altrlabilir dosyamzn hangi obje
dosyalarna, obje dosyalarmzn ise hangi kaynak dosyalarna baml olduunu belirtmek
olacaktr. in en g taraf da budur. Her zaman doru deerleri yazmak o kadar kolay
olmayabilir. Bu noktada gcc derleyicisinin -M , g++ derleyicisinin -MM seenekleriyle
bamllklar Makefile dosya biimine uygun ekilde hesaplatabiliriz. Aadaki ekran
ktsna bakalm:
$ gcc -M server.c
server.o: server.c /usr/include/stdio.h /usr/include/features.h \
/usr/include/x86_64-linux-gnu/bits/wordsize.h \
/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h \
/usr/include/x86_64-linux-gnu/bits/types.h \
/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \
/usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
/usr/include/x86_64-linux-gnu/bits/sys_errlist.h common.h list.h

Grld gibi server.o iin gerekli Makefile kuraln bizim iin hatasz olarak verdi. Tek
yapmamz gereken bu satrlar kopyalayp Makefile ierisine yaptrmaktr. Ancak
bamllklar hesaplandnda, esasen pek sk deimeyen sistem ktphaneleri iindeki
referans gsterdiimiz balk dosyalarnn da eklenmi olduunu gryoruz. Makefile
dosyasna her bir .o bamllk listesi iin bunlara yazarsak dosya bizim iin iyice okunmaz
hale gelecek. O yzden genel sistem balk dosyalarn atlayarak, Makefile dosyamz bu
yntemler eliinde soyut kurallarla yeniden yazmay deneyelim.

rnek: Soyut kurallarn kullanld Makefile

Make

186

Gml Linux

LIBS = -lm \
-lrt \
-lpthread \
$(shell pkg-config --libs openssl)
INCLUDES = -I/usr/local/include/custom
.SUFFIXES: .c .o
.c.o:
$(CC) $(CFLAGS) $(INCLUDES) -c $<
.o:
$(CC) $(CFLAGS) $(LIBS) $^ -o $@
all: server client
server: common.o server.o list.o
client: common.o client.o
common.o: common.c common.h
server.o: server.c server.h common.h list.h
client.o: client.c client.h ortak.h
list.o: list.c list.h
install: client server
mkdir -p /usr/local/bin
cp client /usr/local/bin/
cp server /usr/local/bin/
uninstall:
rm -f /usr/local/bin/client
rm -f /usr/local/bin/server
clean:
rm -f *.o server client
.PHONY: clean

Makro Ktphaneleri Kullanm


nceki rneimizde tm bamllk kurallarn gcc 'ye hesaplattmzda kan uzun listeden
pek memnun olmadk. El yordamyla ilerinden standart ktphane balk dosyalarn
karyor olmann pek uygulanabilir bir zm olmad ortada. stelik dosya says arttka
Makefile dosyamz ierisindeki karmaa da artacaktr. Bu sorunlar nasl zebiliriz?
zm yolu, ileri bizim iin kolaylatran Makefile makrolar yazmaktan veya hazr yazlm
olanlar kullanmaktan gemektedir.

Make

187

Gml Linux

nternet zerinde eitli Makefile makro ktphaneleri bulmanz mmkn. Bunlardan bizce
fonksiyon seti / kullanm kolayl / maksimum fayda dengesinde en iyilerinden biri, Alper
Akcan tarafndan hazrlanm olan Makefile.lib makro ktphanesidir. Ktphaneyi
https://github.com/alperakcan/libmakefile adresinden indirebilirsiniz.
Makefile.lib , apraz derleme ilemlerini CROSS_COMPILE_PREFIX deikeninin ayarlanmas

suretiyle ynetebilmektedir. Ayrca detayl kt vermesi iin make sistemlerinde


alageldiimiz haliyle verbose opsiyonu V deikeni zerinden V=1 eklinde bir atama
yapmak suretiyle aktifletirilebilmektedir.
Bu ekilde yazlm rnek bir Makefile dosyasna bakalm:

Make

188

Gml Linux

target-y = target1
target-y += target2
target1_files-y = \
target_file_shared.c \
target1_file_2.c \
target1_file_3.c
target1_includes-y = \
./ \
/opt/include
target1_libraries-y = \
./ \
/opt/lib
target1_cflags-y = \
-DUSER_DEFINED \
-O2
target1_ldflags-y = \
-luserdefined
target2_files-y = \
target_file_shared.c \
target2_file_2.c \
target2_file_3.c
target2_includes-y = \
./ \
/opt/include
target2_libraries-y = \
./ \
/opt/lib
target2_cflags-y = \
-DUSER_DEFINED \
-O2
target2_ldflags-y = \
-luserdefined
include Makefile.lib

Projenin github sayfasndan ve Makefile.lib dosya ieriinden kullanmyla ilgili yardm


alabilirsiniz.

Make

189

Gml Linux

Makefile.lib kullandnzda, tm bamllklar sistem ktphaneleri de dahil olarak detayl


biimde hesaplanr. Bamllklarn neler olduu ve hesaplanmasnda hangi komutun
kullanld gibi ek bilgiler, bulunulan dizinde nokta ile balayan (dolaysyla n tanml ls
komutunda listelenmeyen ve gz kalabal oluturmayan) bir dizin yaps altnda saklanr.
Derleme sreci daha salkl ve temiz bir ekilde ilerler. Aadaki Makefile.lib kullanlan bir
projedeki derleme zaman ktlar grnmektedir:
$ make
DEP /home/demirten/embedded/gateway/.gateway/base64.dep
DEP /home/demirten/embedded/gateway/.gateway/backend.dep
DEP /home/demirten/embedded/gateway/.gateway/database.dep
DEP /home/demirten/embedded/gateway/.gateway/common.dep
DEP /home/demirten/embedded/gateway/.gateway/ini.dep
DEP /home/demirten/embedded/gateway/.gateway/gateway.dep
CC /home/demirten/embedded/gateway/.gateway/gateway.o
CC /home/demirten/embedded/gateway/.gateway/ini.o
CC /home/demirten/embedded/gateway/.gateway/common.o
CC /home/demirten/embedded/gateway/.gateway/database.o
CC /home/demirten/embedded/gateway/.gateway/backend.o
CC /home/demirten/embedded/gateway/.gateway/base64.o
LINK /home/demirten/embedded/gateway/.gateway/gateway
CP /home/demirten/embedded/gateway/gateway
$ ls .gateway/
backend.dep backend.o.cmd base64.o common.dep.cmd
database.dep database.o.cmd gateway.dep gateway.o.cmd
ini.o backend.dep.cmd base64.dep base64.o.cmd
common.o database.dep.cmd gateway.dep.cmd ini.dep
ini.o.cmd backend.o base64.dep.cmd common.dep
common.o.cmd database.o gateway.cmd gateway.o
ini.dep.cmd

Grld zere make uygulamas altrldnda nce bamllklar hesaplanm,


hesaplama sonular ve kullanlan komutlar hedef uygulama ismi olan gateway 'den yola
klarak .gateway adyla oluturulan dizin altnda toplanm, tm derleme ilemleri sonucu
oluan obje dosyalar da .gateway altnda biriktirilmeye devam edilmi ve ilem sonucunda
ana dizinde gateway hedef uygulamas oluturulmutur.
Eer derleme srecinde daha detayl ekran kts almak istersek, make V=1 eklinde
komutu alamz yeterli olacaktr.
Daha karmak bir Makefile.lib rneine bakalm (gerek zamanl harita render
ktphanemizin demo uygulamas ksmndan alnmtr):
libmakefile rnek 2
-include ${PLATFORM}.config

Make

190

Gml Linux

include Makefile.config
MOC ?= moc
target_o-y = \
libnavigator.o
target_a-y = \
libnavigator.a
target-$(ENABLE_NAVIGATOR_DEMO) = \
navigator-demo
libnavigator.o_files-y = \
tag.h \
navigator.c \
../amalgamation/libamalgamation.o
libnavigator.a_files-y = \
libnavigator.o \
ifeq (${COMMON_POINT_TYPE}, int)
libnavigator.o_cflags-y += \
-DNAVIGATOR_COMMON_POINT_TYPE_INT=1
endif
ifeq (${COMMON_POINT_TYPE}, double)
libnavigator.o_cflags-y += \
-DNAVIGATOR_COMMON_POINT_TYPE_DOUBLE=1
endif
ifeq (${COMMON_BOUND_TYPE}, int)
libnavigator.o_cflags-y += \
-DNAVIGATOR_COMMON_BOUND_TYPE_INT=1
endif
ifeq (${COMMON_BOUND_TYPE}, double)
libnavigator.o_cflags-y += \
-DNAVIGATOR_COMMON_BOUND_TYPE_DOUBLE=1
endif
navigator-demo_depends-y = \
libnavigator.o
navigator-demo_files-y = \
navigator-qt.cpp \
navigator-qt-moc.cpp \
libnavigator.o
navigator-qt-moc.cpp: navigator-qt.h
${Q}$(MOC) ${navigator-demo_cflags-y} navigator-qt.h -o navigator-qt-moc.cpp
navigator-demo_cflags-y = \

Make

191

Gml Linux

$(shell pkg-config QtGui --cflags)


navigator-demo_cflags-${ENABLE_RENDER_CAIRO} += \
-DNAVIGATOR_ENABLE_RENDER_CAIRO=1
navigator-demo_cflags-${ENABLE_RENDER_FLOATING_SCALE} += \
-DNAVIGATOR_ENABLE_RENDER_FLOATING_SCALE=1
navigator-demo_ldflags-y = \

$(shell echo $(CC) | awk '{ if (/mingw/) { print "-Wl,-Bstatic -static-libgcc -L/mingw/Qt/lib -lm
$(shell pkg-config freetype2 --libs) \
-lexpat \
-lm \
-lz \
$(shell pkg-config QtGui --libs) \
-lpthread
navigator-demo_ldflags-${ENABLE_RENDER_CAIRO} += \
$(shell pkg-config cairo --libs)
navigator-demo_ldflags-${ENABLE_COMPRESS_SNAPPY} += \
-lsnappy
navigator-demo_ldflags-${ENABLE_INPUT_TIF} += \
-lgeotiff \
-ltiff
navigator-demo_ldflags-${ENABLE_RENDER_PNG} += \
$(shell pkg-config libpng --libs)
navigator-demo_ldflags-${ENABLE_RENDER_JPEG} += \
-ljpeg
include Makefile.lib

lk 2 satra dikkatlice tekrar bakalm:


-include ${PLATFORM}.config
include Makefile.config

Satr banda yer alan - karakteri, ilgili dosya include edilmek iin arandnda dizinde yer
almyorsa make srecinin hata vermeyip yoluna devam etmesini salamak iin konulmutur.
Eer make altrlrken PLATFORM deikenine atama yaplrsa, ncelikle ilgili dosya
include edilecektir.
Ardndan her koulda Makefile.config dosyasnn include edildiini grmekteyiz.

Make

192

Gml Linux

imdi PLATFORM deikenin Debian olarak atand rnek bir make kullanmn ve
Debian.config ile Makefile.config dosyalarnn ieriklerini grelim:

$ make ENABLE_INPUT_OSM=n PLATFORM=Debian -j 8

Yukardaki kullanmda ncelikle ENABLE_INPUT_OSM deikeninin deeri n olarak, PLATFORM


deikenin deeri Debian olarak atanmakta ve 8 paralel derleme srecine imkan verecek
ekilde uygulama balatlmaktadr.
# Debian.config
ENABLE_NAVIGATOR_DEMO ?= y
ENABLE_RENDER_COPYRIGHT ?= y
RENDER_COPYRIGHT_COLOR ?= 0x20ddbbcc
ENABLE_COMMON_CLIPPER ?= y
COMMON_FILE_CACHE_SIZE ?= 0x1400000
ENABLE_INPUT_TIF ?= y
ENABLE_INPUT_OSM ?= y
ENABLE_INPUT_JPEG_TURBO ?= n
ENABLE_INPUT_TILE ?= y
ENABLE_RENDER_CAIRO ?= n
ENABLE_RENDER_PNG ?= y
ENABLE_RENDER_JPEG ?= y
ENABLE_RENDER_JPEG_TURBO ?= n
ENABLE_RENDER_TEXT_ON_PATH ?= y
ENABLE_COMPRESS_SNAPPY ?= n
ENABLE_RENDER_FLOATING_SCALE ?= y
ENABLE_EXTERNAL_LOGGER ?= n
ENABLE_DEBUGF ?= n
ENABLE_ERRORF ?= y
ENABLE_INFOF ?= y
ENABLE_TODOF ?= n
ENABLE_ASSERTF ?= n
COMMON_POINT_TYPE ?= int
COMMON_BOUND_TYPE ?= int

Make

193

Gml Linux

# Makefile.config
ENABLE_NAVIGATOR_DEMO ?= y
ENABLE_RENDER_COPYRIGHT ?= y
RENDER_COPYRIGHT_COLOR ?= 0x202a77a3
ENABLE_COMMON_CLIPPER ?= y
COMMON_FILE_CACHE_SIZE ?= 0x2000000
ENABLE_INPUT_TIF ?= y
ENABLE_INPUT_OSM ?= y
ENABLE_INPUT_JPEG_TURBO ?= y
ENABLE_INPUT_TILE ?= y
ENABLE_RENDER_CAIRO ?= n
ENABLE_RENDER_PNG ?= n
ENABLE_RENDER_JPEG ?= y
ENABLE_RENDER_JPEG_TURBO ?= y
ENABLE_RENDER_TEXT_ON_PATH ?= y
ENABLE_COMPRESS_SNAPPY ?= y
ENABLE_RENDER_FLOATING_SCALE ?= y
ENABLE_EXTERNAL_LOGGER ?= n
ENABLE_DEBUGF ?= n
ENABLE_ERRORF ?= y
ENABLE_INFOF ?= y
ENABLE_TODOF ?= n
ENABLE_ASSERTF ?= y
COMMON_POINT_TYPE ?= double
COMMON_BOUND_TYPE ?= double

Bu ekildeki konfigrasyon dosyalar yardmyla, eitli deikenlerin hem ntanml


deerlerini atayabilmekte, hem de kullanc tarafndan zellikle belirtilmi ise, ilgili deeri
kullanabilmekteyiz. Bunun iin ?= tanmndan faydalanyoruz. Bu tanm Makefile ierisinde,
eer deikene atama yaplmam ise ata eklinde ilev grmektedir
Bu yap ile farkl konfigrasyon dosyalar kullanlabildii gibi, konfigrasyon dosyas
ierisinde ?= eklinde tanmlanm deikenleri aadaki ekilde ezmek de mmkn
olmaktadr:
$ make ENABLE_DEBUGF=y PLATFORM=Debian

Make

194

Gml Linux

Yukardaki komut, bir nceki Makefile rneiyle birlikte deerlendirildiinde, Debian.config


dosyas ierisinde yer alan ENABLE_DEBUGF ?= n eklindeki satrn geersiz olmasn
salayacaktr
Eer Debian.config ierisinde bu tanm ENABLE_DEBUGF = n eklinde dorudan eittir
karakteri ile yaplm olsayd, ncesinde atanan deerden bamsz olarak bu konfigrasyon
dosyas ilendiinde her zaman dosyann iindeki atama geerli olacakt. Buradaki kk
detaylar dikkatle kullanldnda, ayn kod zerinden farkl konfigrasyonlarda derleme
ileminiz kolaylaacaktr.

Make Alternatifleri
CMake
CMake, birden ok platformu destekleyen (Linux, Apple, Windows) gl bir ina aracdr.
Gelitirilmesi byk lde Kitware firmas tarafndan yaplmaktadr.
CMake kendi kural dosyalarn ileyerek, hangi platformda alyorsa o platform iin doal
ina sistemine ait kural dosyalar oluturur (*NIX sistemler iin Makefile).
Aadaki rnek CMake dosyasn inceleyiniz:

Make

195

Gml Linux

if (${UNIX})
set (DESKTOP $ENV{HOME})
else()
set (DESKTOP $ENV{USERPROFILE}/Desktop)
endif()
set (PRJ ${DESKTOP}/common/svn )
set (FILELIST ${PRJ}/src/source.txt )
message(STATUS "CMAKE_GENERATOR : ${CMAKE_GENERATOR}")
message(STATUS "DESKTOP : ${DESKTOP}")
message(STATUS "PRJ : ${PRJ}")
message(STATUS "FILELIST : ${FILELIST}")
message(STATUS "SYSTEM_NAME : ${CMAKE_SYSTEM_NAME}")
project(project_name)
include_directories(
${PRJ}/src
${PRJ}/includes
)
# Load SRC Variable from file
file(READ ${FILELIST} SRC)
string(REGEX REPLACE "#.*$" "" SRC ${SRC})
string(REPLACE "\n" ";" SRC ${SRC})
add_executable(${PROJECT_NAME} ${SRC} )
foreach (f ${SRC})
set_source_files_properties(${f} PROPERTIES LANGUAGE CXX)
endforeach(f)
if (${WIN32})
link_directories(
)
add_definitions(
-DDEFINE1
)
target_link_libraries(
${PROJECT_NAME}
wsock32.lib
)
endif()

SCons
SCons, Python dili ile gelitirilmi, birden ok platformu destekleyen dier bir ina aracdr.

Make

196

Gml Linux

Konfigrasyon betikleri Python dosyalarndan oluur


C, C++ ve Fortran iin dorudan kod bamllk analizi destei sunar.
Versiyon kontrol sistemlerine dorudan destek verir (SCCS, RCS, CVS, Subversion,
BitKeeper, Perforce).
Dosyalarn deiimindeki kontroller son deitirilme tarihi yerine MD5SUM deerleri
zerinden yaplr. Parametre vererek dosyann deitirilme tarihine bakacak hale de
getirmek mmkndr.
Aadaki rnek SCons dosyasn inceleyebilirsiniz:
env = Environment()
env.Append(CPPFLAGS=['-Wall','-g'])
env.Program('hello', ['hello.c', 'main.c'])

Rake
Ruby ile gelitirilmi ve daha ok Ruby projelerinde kullanlan bir ina aracdr.
Rubynin DSL tanmlama noktasndaki gl zelliklerini kullanr.
Kurallar Rakefile dosyalarnda tutulur.
Rakefile ierisinde Ruby dilinde grevler ve kurallar tanmlanabildii gibi, dilinden
kendisinden gelen ekstra zelliklerle rnein alma zamannda yeni snflar dahi retilebilir.
Aadaki rnek Rakefile dosyasn inceleyebilirsiniz:

Make

197

Gml Linux

namespace :cake do
desc 'make pancakes'
task :pancake => [:flour,:milk,:egg,:baking_powder] do
puts "sizzle"
end
task :butter do
puts "cut 3 tablespoons of butter into tiny squares"
end
task :flour => :butter do
puts "use hands to knead butter squares into 1{{frac|1|2}} cup flour"
end
task :milk do
puts "add 1{{frac|1|4}} cup milk"
end
task :egg do
puts "add 1 egg"
end
task :baking_powder do
puts "add 3{{frac|1|2}} teaspoons baking powder"
end
end

Make

198

Gml Linux

autoconf, automake Kullanm


GNU build sistemi iki temel amacn gerekletirilebilmesi iin gelitirilmitir: Programlar
platformlar aras daha rahat tanabilir hale getirmek ve kaynak koddan program
kurulumlarn mmkn olduu kadar basite indirgeyebilmek.
Tanabilir kod yazmak gerekten olduka zahmetli bir itir. Hedef mimarinin ayrntl olarak
zelliklerinin bilinmesi ou zaman mmkn deildir. Bir nceki blmde rnek olarak
yazdmz Makefile dosyasnda mkdir -p /usr/local/bin komutunu kullanmtk. Oysa
mkdir komutunun -p seenei tm Unix sistemlerinde ayn ekilde almaz. Bu ve

bunun gibi pek ok farkllk yznden her Unix sisteminde alabilecek bir Makefile
yazmak olduka gtr. Kullanlan ktphanelerin sistemler arasndaki farkllklar ise apayr
bir konudur. te GNU build sistemi tm bu zorluklarn stesinden gelebilmek iin
oluturulmutur.
Kdevelop gibi programlar yeni proje oluturduunuzda build sistemini de otomatik olarak
oluturmaktadrlar. Ancak oluan dosyalar fazlasyla kark olduundan bu blmde ok
daha basit rneklerle yapy anlatmaya alacaz. Buradaki temel bilgilerden
yararlandktan sonra Kdevelop vb. gibi programlarn rettii veya internetten indirmi
olduunuz herhangi bir uygulamann kaynak kodu ierisinde gezinerek farkl kullanmlar
inceleyebilirsiniz.

Gerekli Aralar
Gnu build sistemi iin gerekli aralar ve kullanm alanlar aadaki gibidir:
1. autoconf: konfigrasyon iin kullanlacak configure betik programn retir. Kodun
tanabilir olmasn etkileyecek zellikleri, zerinde alt platform iin denetler. Elde
ettii deerleri, daha nceden belirtilmi ablonlara uygun ekilde birletirerek
zelletirilmi Makefile, balk dosyalar vb. oluturur. Bu sayede program derleyecek
kullanc tek tek elle bu deiiklikleri yapmak zahmetinden kurtulur.
2. automake:, autoconf iin kullanlacak Makefile ablonlarn (Makefile.in) Makefile.am
dosyalarn temel alarak retir. Automake tarafndan retilen Makefile dosyalar GNU
makefile standartlarna uygun olup, kullancy elle Makefile dosyas oluturma
zahmetinden kurtarr. Autoconf'un alabilmesi iin ncelikle automake'in dzgn
olarak almas gereklidir.

Autoconf, Automake

199

Gml Linux

3. libtool: zellikle paylaml ktphanelerin tanabilir bir yapda oluturulabilmesi iin


gereken pek ok detay kullancdan soyutlar. Kullanm iin autoconf veya automake
gerekli deildir, tek bana da kullanlabilir. Automake ise libtool'u destekler ve onunla
birlikte alabilir.
4. autotools: GNU kodlama standartlarna uygun, tanabilir kod retmede yardmc
aralar ieriz.
GNU build sistemi tarafndan gerekletirilen temel grevler unlardr:
1. ok sayda alt dizin ieren kaynak kodlardan uygulamalar retebilir. Her bir dizin iin
ayrca make komutunu armak zahmetinden gelitiriciyi kurtarr. Bu sayede tm
kaynak kodlar ayn dizinde bulundurmak yerine daha hiyerarik bir dizin yaps
kullanabilirsiniz.
2. Konfigrasyon ilemini otomatik olarak yapar. Kullanclarn Makefile dosyalarn
dzenlemelerine gerek kalmaz.
3. Makefile dosyalarn otomatik olarak retir. Makefile yazm byk projelerde srekli
tekrar gerektirir ve ayn zamanda hata yapmaya elverili bir yapdr. GNU build sistemi
iin sadece Makefile.am ablonunun yazm yeterlidir. Bu sayede hata yapma olasl
azalr ve ynetimi kolay hale gelir.
4. Hedef platform iin zel testler yapabilme imkan sunar. Makefile.am dosyasna
eklenecek bir ka satrla hedef platformda programn derlenebilesi iin aranan
zelliklerin var olup olmad kontrol edilebilir.
5. Paylaml ktphanelerin oluturulmas statik ktphanelerin oluturulmas kadar kolay
hale gelir.
GNU build sistemi iin gerekli olan bu aralarn sadece gelitirmenin yapld sistemde
kurulu olmas yeterlidir. Bu programlar altktan sonra her platformda alabilecek betik
programlar retirler. Bu sayede uygulamanzn kaynak kodunu indirip kurmak isteyen biri,
autoconf , automake gibi aralar da sistemine kurmak zorunda kalmaz.

lemlere balamadan nce autoconf , automake ve libtool paketlerini sistemimize


kuralm:
$ sudo apt-get install autoconf automake libtool

Zorunlu olmamakla birlikte, configure.ac dosyalarmz ierisinde temel M4 makro seti


ierisinde yer almayan ancak muhtemelen kullanmak zorunda kalacamz ek makro arivini
ieren autoconf-archive paketini de kurmamz yerinde olacaktr:

Autoconf, Automake

200

Gml Linux

$ sudo apt-get install autoconf-archive

rnek Makro: AX_FUNC_MKDIR


mkdir() fonksiyonu baz platformlarda _mkdir() eklinde kullanlmaktadr.

Baz platfomlarda dizin eriim yetkileri iin 2. argman kullanlyorken dierlerinde tek
argman kullanld bilinmektedir.
Aakda mkdir() fonksiyonunun platformlar aras tanabilirliini bizim iin kolaylatran
AX_FUNC_MKDIR makro rnei verilmitir:

#if HAVE_MKDIR
# if MKDIR_TAKES_ONE_ARG
/* MinGW32 */
# define mkdir(a, b) mkdir(a)
# endif
#else
# if HAVE__MKDIR
/* plain Windows 32 */
# define mkdir(a, b) _mkdir(a)
# else
# error "Don't know how to create a directory on this system."
# endif
#endif

rnek Uygulama
imdi aadaki rnek uygulamamz iin GNU build sistemini nasl kullanacamz
renelim.

Autoconf, Automake

201

Gml Linux

#include <stdio.h>
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
int main (int argc, char *argv[])
{
printf("rnek alyor\n");
if (argc == 2) {
const char *target = argv[1];
int rc;
#ifdef HAVE_MKDIR
#ifdef MKDIR_TAKES_ONE_ARG
rc = mkdir(target);
#else
rc = mkdir(target, 0755);
#endif
if (rc == 0) {
printf("%s dizini oluturuldu\n", target);
} else {
fprintf(stderr, "%s dizini oluturulamad\n", target);
}
#else
fprintf(sdterr, "mkdir() desteklenmiyor\n");
#endif
}
return 0;
}

Programmz ornek.c olarak kaydedelim. imdi programn derlenmesi ilemlerini autoconf


ve automake ile yapmaya balayalm. Bunun iin ncelikle automake ile kullanlmak zere
aadaki gibi bir Makefile.am dosyasn oluturalm:
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = ornek
ornek_SOURCES = ornek.c

foreign opsiyonu sayesinde ilerleyen aamalarda GNU uygulamalarnda bulunmas

zorunlu dosya kontrollerini devre d brakyoruz (Bu seenei kullanmadmz durumdaki


senaryoyu test ediniz)
Ardndan aadaki gibi bir configure.ac dosyasn oluturalm (eski versiyonlarda dosya
ismi configure.in eklindeydi):

Autoconf, Automake

202

Gml Linux

AC_INIT([ornek], [0.1], [ornek-bugs@yh.com.tr])


AC_CONFIG_SRCDIR([ornek.c])
AM_INIT_AUTOMAKE
AC_CONFIG_HEADERS([config.h])
AC_PROG_CC
AC_CHECK_HEADERS([sys/time.h])
AC_CHECK_FUNCS([gettimeofday])
AX_FUNC_MKDIR
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

Dosyalar oluturup kaydettikten sonra imdi aclocal komutunu altralm:


$ aclocal
$ ls -l
-rw-r--r-- 1 demirten demirten 41928 Dec 27 01:04 aclocal.m4
drwxr-xr-x 2 demirten demirten 4096 Dec 27 01:04 autom4te.cache
-rw-r--r-- 1 demirten demirten 120 Dec 27 01:03 configure.ac
-rw-r--r-- 1 demirten demirten 45 Dec 27 00:51 Makefile.am
-rw-r--r-- 1 demirten demirten 87 Dec 27 00:26 ornek.c

aclocal altktan sonra bulunduumuz dizinde autom4te.cache dizini ve aclocal.m4

dosyas olutu.
Sonraki admda autoheader komutunu altryoruz. Eer configure.ac dosyasnda
AC_CONFIG_HEADERS belirtilmemise yaplacak kontroller sonras elde edilen deerler
config.h dosyasna yazlmayacak olduundan bu adm atlayabilirsiniz:

$ autoheader
$ ls -l config.h.in
-rw-r--r-- 1 demirten demirten 1825 Dec 27 02:43 config.h.in

lem bitiminde config.h dosyas iin kullanlacak config.h.in ablonu retildi.


Sradaki ilem autoconf komutuyla configure betiini oluturmak:
$ autoconf
$ ls -l configure
-rwxr-xr-x 1 demirten demirten 140829 Dec 27 01:04 configure

Autoconf, Automake

203

Gml Linux

lem sonrasnda bulununan dizinde configure adl tandk betik uygulamasn oluturmu
oluyoruz.
configure betii de olutuktan sonra automake -a komutuyla gereken dier dosyalar

oluturuyoruz:
$ automake -a
configure.ac:4: installing './compile'
configure.ac:3: installing './install-sh'
configure.ac:3: installing './missing'
Makefile.am: installing './depcomp'

Yazlmlarda olmas beklenen baz temel dosyalarn (ChangeLog, README vb.) alma
dizinimizde bulunmamas nedeniyle uyar mesajlarn grmekteyiz ama u aamada bunu
dikkate almamza gerek yok.
automake -a komutu sonras dizin ieriimiz aadaki hale gelmektedir:

$ ls
aclocal.m4
autom4te.cache
compile -> /usr/share/automake-1.14/compile
config.h.in
configure
configure.ac
depcomp -> /usr/share/automake-1.14/depcomp
install-sh -> /usr/share/automake-1.14/install-sh
Makefile.am
Makefile.in
missing -> /usr/share/automake-1.14/missing
ornek.c

Bu haliyle ./configure eklinde betik uygulamamz altrp sonucunu grelim:

Autoconf, Automake

204

Gml Linux

$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking whether gcc understands -c and -o together... yes
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking how to run the C preprocessor... gcc -E
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking sys/time.h usability... yes
checking sys/time.h presence... yes
checking for sys/time.h... yes
checking for gettimeofday... yes
checking for mkdir... yes
checking for _mkdir... no
checking whether mkdir takes one argument... no
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: executing depfiles commands

lem bitiminde hem Makefile hem de config.h dosyas oluacaktr:

Autoconf, Automake

205

Gml Linux

/* config.h. Generated from config.h.in by configure. */


/* config.h.in. Generated from configure.ac by autoheader. */
/* Define to 1 if you have the `gettimeofday' function. */
#define HAVE_GETTIMEOFDAY 1
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
/* Define to 1 if you have the `mkdir' function. */
#define HAVE_MKDIR 1
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Define to 1 if you have the `_mkdir' function. */
/* #undef HAVE__MKDIR */
/* Define if mkdir takes only one argument. */
/* #undef MKDIR_TAKES_ONE_ARG */
/* Name of package */
#define PACKAGE "ornek"
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "ornek-bugs@yh.com.tr"
/* Define to the full name of this package. */
#define PACKAGE_NAME "ornek"
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "ornek 0.1"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "ornek"
/* Define to the home page for this package. */
#define PACKAGE_URL ""
/* Define to the version of this package. */
#define PACKAGE_VERSION "0.1"
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Version number of package */
#define VERSION "0.1"

Autoconf, Automake

206

Gml Linux

Artk Makefile dosyamz hazr olduunda gre, make komutu ile derleme ilemini yapabiliriz:
$ make
make all-am
make[1]: Entering directory /tmp/deneme
gcc -DHAVE_CONFIG_H -I. -g -O2 -MT ornek.o -MD -MP -MF \
.deps/ornek.Tpo -c -o ornek.o ornek.c
mv -f .deps/ornek.Tpo .deps/ornek.Po
gcc -g -O2 -o ornek ornek.o
make[1]: Leaving directory /tmp/deneme

Uygulamamz altralm:
$ ./ornek dizin1
rnek alyor
dizin1 dizini oluturuldu

Uygulamann Kurulumu
autotools bileenleriyle yaptmz bu alma, uygulamann sadece derlenmesi srecini
deil, kurulum ve sistemden kaldrma srelerini de desteklemektedir. Bu noktada dilerseniz
uygulamay sisteme kurabilirsiniz. Bunun iin uygulamann kurulaca dizinler zerinde
yazma yetkinizin bulunmas gerekecektir.
Uygulamay sistemimize kurmak iin:
$ sudo make install
make[1]: Entering directory /tmp/deneme
/bin/mkdir -p /usr/local/bin
/usr/bin/install -c ornek /usr/local/bin
make[1]: Nothing to be done for install-data-am.
make[1]: Leaving directory /tmp/deneme

Sistemden kaldrmak iin:


$ sudo make uninstall
( cd /usr/local/bin && rm -f ornek )

autoreconf
Zaman ierisinde Makefile.am veya configure.ac dosyalarnda deiiklik yaptnzda,
autotools aralarn doru srada yeniden altrmanz gerekecektir.

Autoconf, Automake

207

Gml Linux

Alternatif olarak, bu ilemi kolaylatran autoreconf komutunu -vfi parametresi ile


kullanabiliriz. Bu ekilde deiiklik var ise gerekli bileenler doru srada alacaktr:
$ autoreconf -vfi
autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal --force
autoreconf: configure.ac: tracing
autoreconf: configure.ac: not using Libtool
autoreconf: running: /usr/bin/autoconf --force
autoreconf: running: /usr/bin/autoheader --force
autoreconf: running: automake --add-missing --copy --force-missing

Uygulamann Datma Hazrlanmas


Uygulamanzn artk hazr olduunu dndnzde make distcheck komutu ile onu paket
haline getirebilirsiniz (Ekran kts biraz uzun olduundan burada listelenmemitir). Bu
komut iini tamamladnda bulunduunuz dizinde ornek-0.1.tar.gz adnda bir dosya
oluacaktr. Artk bu dosya ile programnzn datmn yapabilirsiniz.
imdi biraz da yaptmz bu rnei biraz daha aklayalm.
Makefile.am ierisinde mantksal bir dil kullandk. Yazdmz hi bir satr altrlmad.
Dier yandan configure.in ierisinde kullandmz dil prosedreldir, yazdmz her satr
altrlacak bir komutu gstermektedir.
Makefile.am dosyas ierisindeki ilk satr programn ismini belirtirken ikinci satr
program oluturan kaynak kodlar belirtmektedir.
imdi daha kark olan configure.in ierisindeki komutlara srasyla bakalm:
AC_INIT komutu configure betii iin ilklendirmeleri yapar. Parametre olarak kaynak
dosyalarn adlarn alr.
AM_INIT_AUTOMAKE komutu, automake kullanacamz gsterir. Parametre olarak
programn ismini ve versiyonunu alr. Eer Makefile.in dosyalarn elle hazrlayacak
olsaydk bu komutu kullanmamza da gerek olmayacakt.
AC_PROG_CC komutu kullanlan C derleyicisinin ne olduunu belirler.
AC_PROG_INSTALL komutu BSD uyumlu install uygulamasna sahip olup
olmadmz denetler. Eer yoksa bu ilem iin install-sh' kullanr.
AC_OUTPUT komutu configure betik programnn Makefile dosyalarn Makefile.in
dosyalarndan retmesi gerektiini belirtir.

Autoconf, Automake

208

Gml Linux

rneimizdeki configure.in dosyas ierisinde yer almayan ama sklkla kullanacamz baz
komutlar da unlardr:
AC_PROG_RANLIB komutuyla bir ktphane gelitiriyorsak ranlib'in sistemde nasl
kullanlacan renebiliriz.
AC_PROG_CXX komutuyla sistemdeki C++ derleyicisinin ne olduunu renebiliriz.
AC_PROG_YACC ve AC_PROG_LEX komutlaryla kaynak kodlarmz lex veya yacc
dosyalar ieriyorsa bu uygulamalarn sistemde varln denetleyebiliriz.
Eer alt dizinlerde baka Makefile dosyalarmz da olacaksa bunu
AC_OUTPUT(Makefile \
dizin1/Makefile \
dizin2/Makefile \
)

komutlaryla belirtebiliriz.
Dosyalarn ieriinden bahsettikten sonra imdi de biraz nc yaptmz rnekte
altrdmz komutlardan sonra neler olduuna tekrar bakalm.
aclocal komutu altktan sonra aclocal.m4 dosyas retilir. Bu dosya ierisinde

autoconf tarafndan kullanlacak olan makrolar yer almaktadr (kendi zel makrolarmz
nasl hazrlayacamza ileride deinilecektir).
autoconf komutuyla aclocal.m4 ve configure.ac dosyalar ilenerek configure betik

program oluturulur.
automake komutu Makefile.am dosyasn temel alan bir Makefile.in oluturur. Ayrca

GNU kodlama standartlarna gre eksik olan dosyalar iin rnek birer kopya retir.
./configure komutuyla altrlan betik program daha nceden belirtilen zellikler iin

sistemimizi test eder ve Makefile.in dosyasn rnek alarak Makefile dosyalarn


oluturur. AC_OUTPUT() ile belirtilen tm dosyalardaki @FOO@ eklindeki kaytlar
FOO iin elde edilen deerlerle deitirir (rnein C derleyicisinin ne olduu gibi).

Konfigrasyon Balk Dosyalarnn Kullanm


ou zaman derleme annda baz makrolar tanmlamak isteriz. -D seenei ile derleyiciye
bildirilen bu deerleri programmz ierisinden kullanarak ilgili kod paracnn alma
eklini deitirebiliriz. autoconf kullandmz bir uygulama iin bylesi seenekleri
kullanmann yolu konfigrasyon balk dosyas, config.h kullanmaktan gemektedir.

Autoconf, Automake

209

Gml Linux

config.h mantn kullanabilmemiz iin test.c programmzn en bana aadaki satr

eklemeliyiz:
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

Burada unutulmamas gereken nemli bir nokta, config.h dosyasnn mutlaka ilk olarak
include edilmesidir.
Program kaynak kodunu bu ekilde deitirdikten sonra configure.ac dosyasna
AC_CONFIG_HEADERS([config.h]) satrn ve kontrol etmek istediimiz ilgili makrolar

eklemeliyiz.

Automake Deikenleri
Projemiz bydke kaynak kodlarn bulunduu yerler gittike karmaya balar. Bunlar
dzenleyebilmek amacyla daha hiyerarik dizin yaplar kurarz. Ancak bu defa da her bir
dizin iin uygun Makefile dosyalarn retmemiz gerekecektir. Bunun iin bu blmde
Makefile.am dosyalarndan daha detayl bir ekilde bahsedeceiz.
Makefile.am dosyalarnn genel biimi deiken = deer eklindedir. Ancak ayn zamanda,
geleneksel Makefile mantndaki gibi hedef ve soyut kural tanmlamalarn da destekler.
imdi Makefile.am dosyalarnda sklkla kullanacamz satrlara bir bakalm.
INCLUDES = -I/usr/local/include -I/usr/custom/include ...: Obje kodlarn
olutururken derleyiciye include edilen dosyalar hangi dizinlerde aramas gerektiini
belirtir. Ayrca proje kaynak kod yaps ierisindeki bir dizin seenek olarak verildi ise alt
dizinlerde yer alan kaynak programlarn hepsinin bu dosyalara eriebilmelerini
salamak amacyla tanmlama INCLUDES = -I$(top_srcdir)/src/libxxx eklinde
yaplmaldr. Buradaki $top_srcdir deikeni kaynak kod yaps ierisindeki en st
dizini tutar.
LDFLAGS = -L/usr/local/lib ...: Derleyici altrlabilir dosyalar retirken ihtiya
duyduu ktphaneleri hangi dizinlerde aramas gerektiini bu tanmla renecektir.
LDADD = test.o ... $(top_builddir)/lib/libfoo.a ... -lfoo ...: Tm oluacak altrlabilir
dosyalara linklemek istediiniz sisteme kurulu olan ve olmayan obje dosyalar burada
listelenir. Eer listelenen obje dosyas sistemde kurulu deilse dosyan tam adresi
verilmelidir ($top_builddir/lib/libfoo.a rneindeki gibi).
EXTRA_DIST = dosya1 dosya2 ...: Kaynak kod paketinizde bulunmasn istediiniz her
trl dosyay burada listeleyebilirsiniz.

Autoconf, Automake

210

Gml Linux

SUBDIRS = dizin1 dizin2 ...: Bulunulan dizin iin ilem yapmadan nce kurallarn
altrlmas gereken dizinlerdir. make uygulamas bulunulan dizinde ileme
balamadan nce, burada belirtilen dizinlerdeki Makefile kurallarn altrr ve
listelenen tm dizinler iin ilemleri bitirdikten sonra bu dizine geri dner.
bin_PROGRAMS = test test2 ...: make komutu altktan sonra retilecek ve make
install komutuyla belirli bir dizin altna kopyalanacak program adlar burada listelenir.
lib_LIBRARIES = libfoo1.a libfoo2.a ...: make komutu altktan sonra retilecek ve
make install komutuyla belirli bir dizin altna kopyalanacak ktphane dosyalarnn
adlar burada listelenir.
check_PROGRAMS = program1 program2 ... : make komutunun almas
esnasnda retilmeyip, sadece make check komutuyla retilecek, programnzn tmn
veya bir ksmn test edecek uygulamalarn altrlabilir dosya adlar listelenir.
TESTS = program1 program2 ...: make check komutu sonrasnda test amal
altrlacak dosya adlarn listeler. ou durumda TEST = $(check_PROGRAMS)
eklinde bir tanmlama yapabilirsiniz.
include_HEADERS = foo1.h foo2.h ... : /prefix/include dizini altna kurulmasn
istediiniz balk dosyalarn burada listelemelisiniz.
bin_PROGRAMS deikeninde listelediiniz her bir program iin aadaki
tanmlamalar da yapmalsnz (program kelimesi yerine programn adn yazmalsnz):
program_SOURCES = test.c test1.c test2.c test.h test1.h test2.h ...: Automake
program burada belirtmi olduunuz dosya adlar iin, C, C++ ve Fortran dillerine
zgn soyut Makefile kurallarn oluturur. Eer baka bir dil kullanlyorsa gerekli
kurallar siz vermelisiniz.
program_LDADD = $(top_builddir)/lib/libfoo.a -lnsl ...: Burada programnza
linklenmesi gereken ktphaneleri listelemelisiniz.
program_LDFLAGS = -L/dizin1 ...: program_LDADD ile belirttiiniz ktphanelerin
hangi dizinlerde aranmas gerektii burada listelenir.
program_DEPENDENCIES = dep1 dep2 ... : Programnzn derlenebilmesi iin baml
olduu dier hedefleri burada listelemelisiniz.

Autoconf, Automake

211

Gml Linux

Raspberry Pi

Raspberry Pi, Raspberry Pi Foundation tarafndan eitim amacyla gelitirilmi, tek kart,
mini bilgisayar serisidir. Model A, Model B ve eMMC flash'a sahip Compute Module olmak
zere trleri bulunmaktadr. Model A ve Model B serileri (Model B, Model B+, Model Pi 2)
srasyla $25-$35 aralnda fiyatlardan satlmaktadr.
Biz bu blmdeki incelemelerimizi Raspberry Pi 2 - Model B zerinde yapacaz. lk olarak
ksaca cihazn teknik zelliklerini ve cihazn al srecini inceleyecek, sonrasnda ise
gerekli aralar nasl edinebileceimize ve cihaz zerinde iletim sistemini nasl
altrabileceimize bakacaz.

Raspberry Pi

212

Gml Linux

Raspberry Pi 2 Teknik zellikleri


Cihazn temel teknik zelliklerini aadaki gibi listeleyebiliriz.
zellik

Aklama

SoC

Broadcom BCM2836 (CPU, GPU, DSP, SDRAM, and single USB port)

CPU

900 MHz quad-core ARM Cortex A7 (ARMv7 instruction set)

GPU

Broadcom VideoCore IV @ 250 MHz

RAM

1GB (GPU ve CPU paylaml)

Video
k

HDMI, composite video

Hafza

MicroSD

Giri/k

17 GPIO plus specific functions

Dier

OpenGL ES 2.0, 1080p30 h.264/MPEG-4 AVC high-profile decoder ve


encoder

Broadcom tarafndan retilen BCM2836 SoC (System-on-Chip), bnyesinde temel olarak


grafik ilemci (GPU), genel amal ilemci (ARM CPU), ROM (Read-Only-Memory) ve
SDRAM barndrmaktadr. Grafik ilemci olarak yine Broadcom tarafndan retilen
VideoCore IV kullanlrken, genel amal ilemci olarak 900 MHz quad-core ARM Cortex A7
kullanlmtr.
Not: lemci iin BCM2836 yerine BCM2709 kodu da kullanlabilmektedir. BCM2836
ilemci ailesini gsterirken BCM2709 ilemcinin gerek kodunu gstermektedir. Linux
tarafndan /proc/cpuinfo ktsnda ikinci kodun listelendiini grmekteyiz.
Cihazn d dnya ile iletiimini salayan GPIO (General Purpose Input/Output) pin dizilimi
aadaki gibidir. Baz pinlerin hem GPIO hem de baka bir amala kullanlabildiine dikkat
ediniz.
Not: Resimde yer alan boluun altndaki blmde, Model B+ ile gelen 14 yeni GPIO
bilgisi verilmitir. Daha eski modeller iin ise st ksm aynen geerlidir.

Raspberry Pi 2 Teknik zellikleri

213

Gml Linux

Seri Konsol Balants


Raspberry cihaznz ile birlikte seri konsol kablosu gelmemektedir. Yurt iinde bu kabloyu
temin etmekte glk ekebilirsiniz veya pahal olabilir. AliExpress zerinden tanesini 1-2$
aralnda getirtebilirsiniz. Arama yaparken PL2303HX USB to UART TTL anahtar
szcklerini kullanabilir veya u link zerinden gidebilirsiniz.
Konsol balants iin cihaz zerindeki 6 (Ground - Siyah), 8 (Transmit - Beyaz) ve 10
(Receive - Yeil) nolu pinleri kullanmalsnz. Aada doru bir balant rnei gsterilmitir:

Raspberry Pi 2 Teknik zellikleri

214

Gml Linux

Raspberry Pi 2 Teknik zellikleri

215

Gml Linux

Al Sreci
Raspberry Pi iin ARM ilemci ana ilemci olarak deil daha ok bir yardmc ilemci
(coprocessor) olarak tasarlanmtr. Ana ilemci ise VideoCore grafik ilemcisidir. Bu
sebeple cihazn al sreci gml cihazlarn genel olarak izledii yoldan bir miktar
ayrmaktadr.
Tipik bir ARM ilemcili cihaz (kitabmzda incelediimiz dier rnek cihazlar dahil olmak
zere) al srecinde genel olarak aadaki admlar izlemektedir:
Cihaza enerji verildikten sonra ARM ilemci alr.
ARM ilemci, ilk olarak, bnyesindeki ROM bellekteki ilk nykleyici (ROM bootloader)
altrr.
ROM bootloader kendinden sonraki iletim sistemini yklemekten sorumlu nykleyiciyi
ykler.
letim sistemi bellee yklenir ve ARM ilemci tarafndan altrr.
Cihaza enerji verilmesinden iletim sisteminin yklenmesine kadar geen tm aamalarda
ARM ilemcinin rol aldn grmekteyiz. Raspberry Pi iin ise al sreci temel olarak
aadaki gibidir.
Cihaza enerji verildiinde ARM ilemci reset modundadr, yani aktif olarak
almamaktadr.
ROM bellekteki ilk nykleyici (first-stage bootloader, ROM bootloader) VideoCore GPU
iindeki kk bir RISC (Reduced Instruction Set Computer) ilemci tarafndan
altrlr.
lk nykleyici tarafndan SD karttaki FAT32 boot blm mount edilir ve ikinci
nykleyici (second-stage bootloader) bootcode.bin, GPU iindeki L2 cache'e
ekilerek, altrlr. Bu aamada ARM ilemci hala reset durumundadr.
kinci nykleyici tarafndan aslnda GPU firmware'i olan son nykleyici (third-stage
bootloader) start.elf yklenir ve altrlr. Bu aamada ekrana gkkua logosu
bastrlmaktadr.
start.elf tarafndan SD kart boot blmndeki config.txt dosyas okunur. Bu ayar
dosyas ile baz sistem ayarlar deitirilebilmekte (ARM ve GPU frekanslar, RAM
paylamlar) ayrca nykleyiciye mdahale edilebilmektedir.
SD kart boot blmnde dtb (bcm2709-rpi-2-b.dtb) ve kernel (kernel.img) dosyalarnn
bulunmas durumunda start.elf tarafndan srasyla 0100 ve 08000 adreslerine
yklenmektedir. Ayrca cmdline.txt dosyasnn bulunmas halinde dosya ieriindeki
komut satr argmanlar ekirdee geirilmektedir.
Son olarak ARM ilemci reset durumundan karlr ve iletim sistemini altrmas

Al Sreci

216

Gml Linux

salanr.
Cihaza enerji verilmesinden, iletim sisteminin altrlmasna kadar geen sre aadaki
diagramda zetlenmitir.

Bu srece dier cihazlarn al srecinden aina olduumuz u-boot nykleyicisinin


karmadn grmekteyiz, kernel GPU firmware'i start.elf tarafndan yklenmekte ve
ardnda ARM ilemci reset durumundan karlmaktadr. config.txt dosyasna mdahale
ederek start.elf tarafndan iletim sistemi ekirdeinin deil u-boot nykleyicisinin
yklenmesini salayabilir, bu sayede sistemimizi u-boot zerinden aabiliriz. Bu ilemin nasl
yapldna daha sonra deineceiz.

Al Sreci

217

Gml Linux

Gerekli Aralarn Elde Edilmesi


Bu balk altnda, cihaz aabilmek iin gerekli olan aralar nasl edinebileceimize ve
retebileceimize bakacaz.

Gelitirme Aralar
Gelitirme aralar iin birden fazla seenek bulunmasna karn, dorudan donanm
salaycnn nerdii BCM2708 hedefli apraz derleyicileri aadaki gibi edinebilirsiniz:
$ git clone https://github.com/raspberrypi/tools

tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin dizin yolunu PATH evre


deikenine ekleyerek, arm-bcm2708hardfp-linux-gnueabi nekine sahip hard float
destei olan 32 bitlik derleyiciyi kullanabilirsiniz.
$ cd tools
$ export PATH=$PWD/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/:$PATH

GPU nykleyicileri
Cihazn al srecini incelerken bootcode.bin ve start.elf olmak zere iki adet
nykleyicinin gerekli olduunu grmtk. Raspberry Pi iin nykleyici ve GPU firmware
dosyalarnn derlenmi hallerini aadaki gibi edinebilirsiniz, bu dosyalara ilikin kaynak kod
eriimi verilmemektedir.
$ git clone https://github.com/raspberrypi/firmware

boot dizininde nykleyicilerle beraber rnek ekirdek imaj da bulunmaktadr.


Not: firmware git arivi 4 GB'n zerinde olup ounlukla boot dizini altndaki bir ka
kk dosyaya ihtiya duyacamzdan, web zerinden
https://github.com/raspberrypi/firmware/tree/master/boot adresinden de bu dosyalar
hzlca indirebilirsiniz.

Gerekli Aralarn Elde Edilmesi

218

Gml Linux

Kernel Derleme Sreci


Kaynak Kodun Edinilmesi
Raspberry Pi iin kernel patch'leri https://github.com/raspberrypi/linux adresinde
yaynlanmaktadr.
Kernel kodunu aadaki gibi git ile klonlayarak indirebilirsiniz:
$ git clone https://github.com/raspberrypi/linux

Yukardaki clone ilemi tm kernel kaynak kodunu gemi commit tarihesi ile birlikte
indireceinden 1 GB'n zerinde download gerektirecektir. Alternatif olarak commit
tarihesinden vazgeip son halini daha kk bir download gerekecek ekilde aadaki gibi
de indirmeniz mmkndr. Ancak bu ekilde indirme ilemi yaptnzda sonradan git pull
yapamazsanz.
$ git clone --depth=1 https://github.com/raspberrypi/linux

Derleme
Derleme srecine balamadan nce kullanacanz toolchain'in PATH ortam deikeni
ierisinde yer aldndan emin olunuz. Eer deilse ncelikle toolchain ana dizinine geip
aadaki komutlar uygulaynz:
$ cd tools
$ export PATH=$PWD/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/:$PATH

Sonraki admda Raspberry Pi 2 board'umuz iin kernel kodu ierisinden kan ntanml
konfigrasyonu uygulayalm:
$ make ARCH=arm bcm2709_defconfig

Kernel kodu ile birlikte gelen ntanml konfigrasyon dosyasnda ihtiya duyulmayacak pek
ok bileen bulunmaktadr (Kullanmayacamz network protokolleri, aygt srcleri, dosya
sistemleri gibi). Bu noktada mevcut kernel konfigrasyonu zerinde ek iyiletirme almalar
iin menuconfig aracn aadaki gibi altrp konfigrasyonu iyiletirebilirsiniz:

Kernel Derleme Sreci

219

Gml Linux

$ make ARCH=arm menuconfig

Konfigrasyon sreci tamamlandktan sonra derleme aamasna geebilirsiniz. ncelikle


sktrlm kernel imaj dosyas olan zImage 'i retelim:
$ make ARCH=arm CROSS_COMPILE=arm-bcm2708hardfp-linux-gnueabi- -j4 zImage

lem bitiminde aada dosya yolunda arch/arm/boot/zImage dosyas oluacaktr:


Sonrasnda Flattened Device Tree modeli iin kullanlacak olan dtb dosyasn retmek
amacyla aadaki komutu altrn:
$ make ARCH=arm CROSS_COMPILE=arm-bcm2708hardfp-linux-gnueabi- -j4 dtbs

lem tamamlandnda arch/arm/boot/dts/bcm2709-rpi-2-b.dtb dosyas oluacaktr.


Sradaki ilem konfigrasyon srecinde modl olarak derlenmesi seilen kernel modllerinin
derlenmesidir. Bunun iin aadaki komutu altrn:
$ make ARCH=arm CROSS_COMPILE=arm-bcm2708hardfp-linux-gnueabi- -j4 modules

Modllerin Kk Dosya Sistemine Aktarlmas


Derlenmi olan modllerin uygun bir dizin hiyerarisi altnda toplanmas gereklidir.
lerleyen blmde Raspberry Pi 2 board'umuz iin kendi kk dosya sistemimizi /opt/rpi
dizini altnda oluturacaz. Kernel modlleri ise alt sistemde /lib/modules dizini
altnda kernel versiyon numaras adyla oluturulan dizin ve alt dizinlerinde yer alacaktr.
Modlleri uygun dizin yapsyla kartmak iin gereken make hedefi modules_install
eklindedir. INSTALL_MOD_PATH deikenini gelitireceimiz kk dosya sistemini barndracak
olan ana dizini gsterecek ekilde ayarlamak suretiyle, modllerin kurulumunu
gerekletirebiliriz. Bunun iin kullanacamz komut aadaki gibi olacaktr:
$ make ARCH=arm CROSS_COMPILE=arm-bcm2708hardfp-linux-gnueabi- \
INSTALL_MOD_PATH=/opt/rpi modules_install

lem bitiminde /opt/rpi/lib/modules/4.0.5-v7+ ve /opt/rpi/lib/firmware dizin yaplar


oluacaktr. Derlemi olduunuz kernel versiyonuna gre ilkinin ismi deikenlik gsterebilir.
Derleme yaptnz kernel ierisine dahil etmi olduunuz ve kernel kodu ile datma uygun

Kernel Derleme Sreci

220

Gml Linux

firmware bileenleri ieren modllere ait firmware dosyalar da kendilerine zg dizin


hiyerarisi ierisinde oluturulacaktr.
lemler tamamlandktan sonra /opt/rpi/lib/modules/4.0.5-v7+ ve /opt/rpi/lib/firmware
dizinlerini incelemenizi neririz.

Kernel Derleme Sreci

221

Gml Linux

U-boot Derleme Sreci


Kaynak Kodun Edinilmesi
U-Boot kodunu aadaki gibi indirip derleyebilirsiniz.
$ git clone git://git.denx.de/u-boot.git

Yukardaki rnekte u-boot kodu mainline repo'dan ekildi. Alternatif olarak u-boot mainline
kodu ierisinde Raspberry Pi destei zerinde alan Stephen Warren'in repo'sunu da
kullanabilirsiniz. Yeni gelitirilen zellikleri henz mainline koda entegre edilmeden
denemeniz gerektiinde de buray kullanabilirsiniz:
$ git clone git://github.com/swarren/u-boot.git
$ cd u-boot
$ git checkout -b rpi_dev origin/rpi_dev

Derleme
Kaynak kodu indirmi olduunuz dizine getikten sonra aadaki gibi ntanml
konfigrasyonu baz alarak derleme yapabilirsiniz:
$ make rpi_2_defconfig
$ make CROSS_COMPILE=arm-bcm2708hardfp-linux-gnueabi- -j2

Not: apraz derleyicinizin yol ifadesinin PATH evre deikeninde tanml olduundan
emin olunuz. Baka bir derleyici kullanyorsanz CROSS_COMPILE evre deikenini,
derleyicinizin nekini gsterecek ekilde deitirmelisiniz.
lem tamamlandnda u-boot.bin dosyas ana dizinde oluacaktr.

U-boot Derleme Sreci

222

Gml Linux

Dosya Sisteminin Hazrlanmas


Bu blmde Raspberry Pi board'umuz iin busybox ile basit bir dosya sistemi
hazrlanmasna ynelik almalar anlatlacaktr. Dosya sistemi hazrlanmasyla ilgili daha
detayl bilgiler iin Kk Dosya Sistemi Oluturma balkl blmn de incelenmesini neririz.

Busybox
ncelikle gncel busybox kaynak kodlarn indirip diskimizde bir dizine amalyz:
$ wget http://www.busybox.net/downloads/busybox-1.23.2.tar.bz2
$ tar xf busybox-1.23.2.tar.bz2
$ cd busybox-1.23.2

Ardndan ntanml konfigrasyonunu oluturup, PATH ortam deikenimiz ierisinde daha


nce ayarlanm olan toolchain nekini kullanarak apraz derleme ilemimizi
gerekletirebiliriz:
$ make defconfig
$ make CROSS_COMPILE=arm-bcm2708hardfp-linux-gnueabi- -j4

Derleme ilemi tamamlandktan sonra busybox uygulamas ana dizinde oluacaktr. Daha
nce anlatld gibi busybox uygulamasn ierdii dier uygulamalara ait linkleri de
oluturmak suretiyle kullanmamz gereklidir. Bu linkleri oluturmak iin make install
komutunu verebiliriz ancak bu durumda ilgili linkler bulunduumuz yerde _install adl bir
dizinde retilecektir. Bunun yerine rnein /opt/rpi eklinde genel bir dizin ap oray kk
dosya sistemi olarak hazrlamak daha yerinde bir karar olacaktr. Aadaki gibi
CONFIG_PREFIX deikenine atama yapmak suretiyle linklerin ilgili dizinde oluturulmas

salanabilir:
$ sudo mkdir /opt/rpi
$ sudo chown -R $USER /opt/rpi
# Yukardaki 2 komutla /opt/rpi dizinini oluturup yazma yetkilerini
# kendi kullancmza vermi olduk. Bu amala herhangi baka bir dizini de kullanabilirsiniz
$ make CROSS_COMPILE=arm-bcm2708hardfp-linux-gnueabi- CONFIG_PREFIX=/opt/rpi install

Dosya Sisteminin Hazrlanmas

223

Gml Linux

lem baaryla tamamlandktan sonra /opt/rpi altnda aadaki dosya ve dizinlerin


olutuu grlecektir:
$ ls -l /opt/rpi/
total 8
drwxr-xr-x 2 demirten demirten 4096 Jun 23 15:59 bin
lrwxrwxrwx 1 demirten demirten 11 Jun 23 15:59 linuxrc -> bin/busybox
drwxr-xr-x 2 demirten demirten 4096 Jun 23 15:59 sbin
drwxr-xr-x 4 demirten demirten 27 Jun 23 15:59 usr

Yukardaki dizin yaps kk dosya sistemimizin temelini oluturmaktadr. Ancak bir ka ek


dokunua daha ihtiya olacaktr.
Sistemimizi yukardaki kk dosya sistemiyle amaya alacak olursa, kernel tarafnda
aadakine benzer bir hata alrz:
...
[ 2.492921] devtmpfs: error mounting -2
...

Yukardaki hata mesajnda devtmpfs dosya sisteminin mount edilemedii sylenmektedir.


Konuyla ilgili daha ayrntl bilgiye Devtmpfs Dosya Sistemi blmmzden eriebilirsiniz. Bu
srecin doru ilemesini salamak iin hazrladmz yeni kk dosya sistemi ierisinde
/dev dizinini aadaki komutla oluturmalyz:

$ mkdir /opt/rpi/dev

Ktphanelerin Tanmas
Busybox sayesinde tek bir uygulama ile pek ok komuta birden sahip olduk, ancak busybox
uygulamasnn alabilmesi iin gereken libc.so.6 , libm.so.6 ve libcrypt.so.1
ktphaneleri ile paylaml ktphane kullanan tm uygulamalar iin gerekli olan ldlinux.so.3 ktphanesi de kk dosya sistemimizde /lib dizini altnda yer almaldr.

Bunun iin ncelikle /lib dizinimizi oluturalm:


$ mkdir /opt/rpi/lib

Ardndan ilgili ktphanelerin kullandmz toolchain ierisinden kan versiyonlarn bu dizin


altna kopyalayalm. Bu noktada apraz Derleme ve Gerekli Ekipmanlar balndan da
faydalanabilirsiniz.

Dosya Sisteminin Hazrlanmas

224

Gml Linux

Raspberry Pi iin daha nce edindiimiz tools dizini altndaki arm-bcm2708/armbcm2708hardfp-linux-gnueabi toolchain'ini kullanmaktaydk. Buras toolchain ana dizinidir

(Raspberry Pi iin tools arivinden 4 adet toolchain kmaktadr, biz burada rneklerimizde
kullandmz versiyon ile ilerliyoruz, dier toolchain'leri kulland iseniz sonraki komutlar da
bu dorultuda deitirmeniz gerekecektir).
Toolchain ana dizini altnda arm-bcm2708hardfp-linux-gnueabi --> lib dizin yaps ierisinde
ihtiya duyduumuz ktphaneler bulunmaktadr. Toolchain ana dizininde iken aadaki
komutlarla bunlar kk dosya sistemimize kopyalayalm:
$ cd arm-bcm2708hardfp-linux-gnueabi/lib
$ cp libc.so.6 libm.so.6 libcrypt.so.1 ld-linux.so.3 /opt/rpi/lib/

Artk hem busybox uygulamamz hem de uygulamann almas iin gereken tm


bileenler hazr. imdi temel al ve kapan betiklerimizi hazrlayalm.

Al Betiinin Hazrlanmas
Linux sistemlerde al srecini yneten SysV Init uygulamasnn kk bir versiyonu
busybox ierisinden kmakta ve /sbin/init eklinde kk dosya sistemi zerinde linki
retilmektedir.
init uygulamas gml sistemimizde de ilk alacak uygulama olup, almaya

baladnda /etc/inittab dosyasn okumaktadr. Bu dosya mevcut deilse, kendisi


ntanml ayarlaryla alacaktr. Al ve kapan srecini tam kontrolmz altna almak iin
/etc/inittab dosyasn oluturmalyz. Dosyann bir rneine busybox kaynak kod dizini

altnda examples/inittab eklinde eriebilirsiniz.


Bizim kullanacamz temel inittab dosyas aadaki gibi olacaktr:
::sysinit:/etc/acilis
::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/etc/kapanis

Yukardaki dosya init uygulamas tarafndan okunduunda unlar anlalr:


Sistemde init tarafndan altrlacak ilk uygulama /etc/acilis olacaktr
Sistemin ekirdek tarafnda ayarlanm olan konsol aygt zerinde, askfirst yntemiyle
/bin/sh kabuu altrlacaktr

Sisteme dorudan bal bir klavye olmas halinde CTRL-ALT-DEL tu kombinasyonu

Dosya Sisteminin Hazrlanmas

225

Gml Linux

kullanldnda /sbin/reboot uygulamas altrlacaktr


Sistem kapan srecine getiinde /etc/kapanis uygulamas altrlacaktr
/etc/acilis betiinin kk bir rnei aadaki gibidir:

#! /bin/sh
echo "Sistem aciliyor..."
# Proc dosya sistemini mount edelim
mount -t proc none /proc
# Sysfs dosya sistemini mount edelim
mount -t sysfs none /sys
# Opsiyonel olarak /tmp dizinini bellek zerinde
# tmpfs dosya sistemiyle oluturalm
mount -t tmpfs none /tmp
# devtmpfs /dev zerine overwrite edeceinden
# mount etmeden nce dizini oluturalm
mkdir -p /dev/pts && mount -t devpts none /dev/pts

Yukardaki al betiine, kullanacanz dier servis ve uygulamalar balatacak komutlar


da ekleyerek nihai sisteminizi retebilirsiniz.
Kapan betiinde ise alan uygulamalarnza TERM sinyali yollayp biraz beklemek, halan
kapanmad iseler KILL sinyali gndererek uygulamalar sonlandrmak ve son admda
yazlabilir olarak kullandnz disk blmlerini unmount etmeli veya read-only (salt okunur)
modda yeniden mount (remount) etmelisiniz. Yazlabilir modda mount edilmi olan bir
blm read-only remount etmek, Linux ekirdei tarafndan fiziksel olarak diske yazlmak
iin bekletilen tm verilerin yazlmasn tetikler, bylelikle kapanta veri kayb yaamam
olursunuz. Bu ilemi yapmamanz halinde, cihazn kontrolsz kapatlmasndakine benzer
sorunlarla karlarsnz. Aada basit bir /etc/kapanis betik rnei verilmitir:

Dosya Sisteminin Hazrlanmas

226

Gml Linux

#! /bin/sh
echo "Sistem kapaniyor"
# Tm uygulamalara TERM sinyali gnder
kill -s SIGTERM -1
# 3 saniye bekle
sleep 3
# Halen uygulama kald ise KILL sinyali gnder
kill -s SIGKILL -1
# Tm mount edilmi blmlerin unmount edilmesini salayalm
# -r parametresi, umount ilemi baarsz olursa
# read-only modda remount edilmesini salar
umount -a -r

quiet Parametresi
ekirdek boot parametreleri arasna (bir sonraki blmde cmdline.txt dosyasna
yazacamz) quiet parametresini eklemeniz halinde al srasnda sistem konsoluna ok
daha az mesaj kartlr.
Bu ilem al sresinin de bir miktar ksalmasn salamaktadr. Sistemi ilk ayaa
kaldrrken tm ekirdek al mesajlarn konsolda grmek yerinde olacaktr. Ancak sistem
kararl hale geldikten sonra quiet parametresini eklemek suretiyle sreci hzlandrmanz
nerilir. Bu parametre ile alta gremediiniz mesajlara sonraki bir anda dmesg komut
ktsndan gene eriebilirsiniz.
Bu parametrenin mevcut ekirdek konfigrasyonumuzdaki etkisini test etmek iin yle bir
yntem izleyebiliriz. Eer kullanc kipinde altrlan ilk uygulama ( init ) zerinden
yukardaki rnekte altrdmz /etc/acilis betiimizde ilk i olarak ekirdek mesajlar
tampon blgesine bir mesaj gnderecek olursa, quiet parametresinin olduu ve olmad
allar karlatrabiliriz.
ekirdek mesajlarnn tutulduu tampon alanna, /dev/kmsg zel aygt dosyasna yazmak
suretiyle biz de bir mesaj koyabiliriz. Yukardaki rneini verdiimiz /etc/acilis betii
ierisinde dier komutlar altrmadan nce aadaki satr ekleyelim:
echo "quiet test mesaji" > /dev/kmsg

Ardndan quiet parametresinin olduu ve olmad durumlarda, dmesg | grep "test


mesaji" komutu ile mesajlarn kartlma zamanlarna bakarak karlatralm:

Dosya Sisteminin Hazrlanmas

227

Gml Linux

quiet olmadnda:

dmesg | grep "test mesaji"


[ 2.698438] quiet test mesaji

quiet olduu durumda:

dmesg | grep "test mesaji"


[ 1.615022] quiet test mesaji

Grld zere 1 saniyenin zerinde bir zaman kazanc sz konusudur.


Kullandnz ekirdek konfigrasyonu, GPU tarafna ayrlan bellek (16 MB olduunda
GPU'daki baz fonksiyonlar devre d kalmaktadr, Sistem Konfigrasyonu sayfasnda
detayna bakabilirsiniz), ARM CPU overclock ve turbo parametrelerinin durumuna gre
bu sreler deikenlik gsterebilir. Yaptmz testlerde kullanc kipinde uygulama
altrmaya minimum 1.1 saniye ierisinde gelebildiimizi grdk.

Dosya Sisteminin Hazrlanmas

228

Gml Linux

Cihazn Almas
Raspberry Pi 2 yalnz microSD zerinden alabilmektedir. Bu sebeple SD kart zerinde, biri
boot dosyalar dieri ise dosya sistemi iin gerekli, iki adet blmlendirme (partition)
bulunmaldr. FAT32 formatl boot blmlendirmesinde nykleyiciler, ekirdek ve gerekli
dier dosyalar bulunurken, dier blm cihazn tanyabilecei formatta bir dosya sistemini
iermektedir.
SD kart zerine gerekli dosyalar kendimiz yazabileceimiz gibi Raspberry Pi destei olan bir
datm da kullanabiliriz. imdi srayla bu yntemlere bakalm.

SD Karta Gerekli Dosyalarn Kopyalanmas


lk olarak, SD kart zerinde boot dosyalarn alabilecek byklkte (FAT32 dosya sisteminde
minimum disk blm 32MB olabilir bununla birlikte boot ykleyici FAT16 ile de
almaktadr) bir FAT32 blm ve dosya sistemi iin ext4 blm oluturmalyz. Bu
amala Linux altnda fdisk veya gparted gibi uygulamalar kullanabilirsiniz.
Linux altnda SD kartlar /dev/mmcblk0 , /dev/mmcblk1 vb. eklinde tannmaktadr. lk tanna
SD kart zerinde oluturularak birinci disk blmnn aygt ismi de /dev/mmcblk0p1 eklinde
olacaktr (0 deil 1'den baladna dikkat ediniz).
Disk blmlendirmek genel olarak konumuzun dnda olsa da, rnek olmas asndan
aada disk blmlendirme tablosu (partition table) tamamen bo olan ve /dev/mmcblk0
eklinde alglanm bir SD kart iin gereken fdisk komutlarnn pipe yntemiyle verilip
FAT32 trnde formatlanmas gsterilmektedir:
$ echo "n
p
1
+64M
t
c
w
" | sudo fdisk /dev/mmcblk0 && sudo mkfs.vfat /dev/mmcblk0p1

FAT32 boot blmnde asgari aadaki dosyalara ihtiya duymaktayz.

Cihazn Almas

229

Gml Linux

Dosya

Grevi

bootcode.bin

Alt seviye nykleyici

start.elf

GPU firmware

fixup.dat

SDRAM'in GPU ve CPU arasnda blmlendirilmesinde kullanlyor

kernel.img

Kernel imaj

config.txt

start.elf tarafndan okunan ayar dosyas

cmdline.txt

Kernel'a geirilecek komut satr argmanlarn barndran dosya

Daha nce de sylediimiz gibi config.txt dosyas ile sistem ayarlar deitirilebilmekte (ARM
ve GPU frekanslar, RAM paylamlar) ayrca nykleyiciye mdahale edilebilmektedir. Bu
dosyann ieriini BIOS ayarlarna benzetebiliriz. config.txt iinde yklenecek ekirdee
ilikin herhangi bir atf bulunmad srece start.elf, kernel.img dosyasn yklemekte ve
ARM ilemciyi reset modundan karmaktadr. ekirdek imaj olarak nykleyicilerle beraber
gelen kernel.img dosyasn kullanabileceiniz gibi daha nce derlediimiz zImage dosyasn
da kernel.img olarak kopyalayp kullanabilirsiniz.
rnek bir config.txt ierii aadaki gibidir:
kernel=kernel.img

rnek bir cmdline.txt dosyasnn ierii ise aadaki gibidir:

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator

NEML NOT: Raspberry Pi iin dier kaynaklarda da yukardaki gibi bir rnek
cmdline.txt dosyas ile karlaacaksnz. Burada verilen ekirdek al

parametrelerinde console blmnn 2 defa yer aldna dikkat ediniz. rneimizde


console ncelikle seri konsola atanm, sonra bir de tty1 aygt zerine atanm. Bu

ekilde boot edilen bir ekirdek konsola gidecek mesajlar her iki aygta da gnderir
(rneimizde seri port ve HDMI zerindeki tty konsolu) ancak sonuncu console
parametresi olarak hangi aygt belirtilmise sadece oradan girdi alr. Yani yukardaki
argmanlarla boot edecek olursanz konsol ktlar hem seri portta hem de bal ise
HDMI monitorde grnecek, Linux aldktan sonra ise seri konsoldan giri
yapamayacak, sistemdeki USB portuna takacanz bir USB klavye ile giri yapmak
durumunda kalacaksnz. Giri ilemleri iin de seri konsolu kullanmak istiyorsanz
cmdline.txt ierisinde sralamay uygun ekilde deitirebilir veya console=tty1

blmn tamamen kaldrabilirsiniz.

Cihazn Almas

230

Gml Linux

Temel bir dosya sisteminin nasl oluturulduunu kitabmzn Kk Dosya Sistemi Oluturma
blmnde bulabilirsiniz.

Kk Dosya Sisteminin SD Karta Aktarm


Cihaz SD kart zerindeki bir kk dosya sistemi ile amak iin, nceki aamalarda hazrlam
olduumuz kk dosya sistemini SD kartn ilgili blmne kopyalamamz gerekiyor.
Bunun iin eer henz yoksa fdisk vb. bir disk blmlendirme arac ile SD kart zerinde
Linux tipinde (83) ikinci bir disk blm oluturmal, bu blm kullanmak istediimiz dosya
sisteminin trne gre biimlendirmeli ve sonrasnda ilgili blm sistemimize mount edip
hazrlam olduumuz kk dosya sistemini bu alana kopyalamalyz.
Disk blmnn /dev/mmcblk0p2 ismiyle oluturduumuzu ve kk dosya sistemini
/opt/rpi dizininde oluturduumuzu, geici mount dizini olarak da /mnt/tmp 'yi

kullanacamz varsayarsak komutlarmz u ekilde olacaktr:


$ sudo mkfs.ext4 /dev/mmcblk0p2
$ sudo mount /dev/mmcblk0p2 /mnt/tmp
$ sudo cp -a /opt/rpi/* /mnt/tmp/
$ sudo umount /mnt/tmp

Artk sistemimiz SD kart zerindeki kk dosya sistemi zerinden almak iin hazr.

Cihazn U-Boot zerinden Almas


config.txt iine aadaki gibi bir giri eklediimizde start.elf kernel yerine u-boot'u
ykleyecek ve sonrasna ARM ilemciyi altracaktr. ncesinde, SD kartn boot blmne
daha nce derlediimiz zImage ve u-boot.bin dosyalarn kopyalamalyz.
kernel=u-boot.bin

u-boot komut satrna dtkten sonra ekirdek ve ilgili dtb dosyasn bellein gvenli bir
alanna ekip, ekirdee kk dosya sistemi ve konsolla ilgili deerleri geirdikten sonra
aadaki gibi altrabiliriz.
mmc dev 0
fatload mmc 0:1 0x01000000 zImage
fatload mmc 0:1 0x02000000 bcm2709-rpi-2-b.dtb
setenv bootargs earlyprintk console=ttyAMA0 console=tty1 root=/dev/mmcblk0p2 rootwait
bootz 0x01000000 - 0x02000000

Cihazn Almas

231

Gml Linux

DKKAT: 20 Haziran 2015 itibariyle Raspberry Pi 2 modeli iin hazrlanm u-boot


uygulamas ile SD kart zerinden okuma ilemi 80 KB/s gibi olduka dk bir hzda
almaktadr. Bu nedenle ekirdek imajnn yklenmesi 40-50 saniye arasnda zaman
almakta olup yakn gelecekte sorunun giderilmi olmas beklenmektedir.

U-Boot Ortam Deikenlerinin Dzenlenmesi


Bir nceki rneimizde u-boot konsolu zerinden komutlar girerek sistemin almas
gsterildi. Eer her defasnda komutlar girmek yerine ntanml aln bu ekilde
gereklemesini istiyorsak, u-boot ortam deikenlerini dzenleyerek non-interactive al
srecini ynlendirebiliriz.
Buraya kadar olan almalarnzda dikkatinizi ekti ise, u-boot ilk alrken aadaki gibi
mesajlar kmaktayd:
reading uboot.env
** Unable to read "uboot.env" from mmc0:1 **
Using default environment

Grlecei zere ilk altrmada uboot.env adl bir dosya aranmakta ve bulunamad iin
ntanml ortam deikenlerinin kullanlacana dair bilgi verilmektedir.
uboot.env dosyasnn format basit olmakla birlikte, bir metin dosyas olarak hazrlanmas

mmkn deildir (NULL deerler ve padding yaplmas gerekecektir)


Bununla birlikte u-boot kodu ierisindeki tools dizini altnda mkenvimage adl yardmc bir
uygulama kmaktadr. Bu uygulama ile istenen uboot.env dosyasn oluturabiliriz.
ncelikle istediimiz ortam deikenlerini bir metin dosyasn yazmalyz. Bunun iin
aadaki satrlar /tmp/uboot.env.txt adl yeni bir geici dosya oluturup ierisine
kopyalayn:

Cihazn Almas

232

Gml Linux

arch=arm
baudrate=115200
board=rpi_2
board_name=rpi_2
bootargs=earlyprintk console=ttyAMA0 console=tty1 root=/dev/mmcblk0p2 rootwait
bootcmd=run mmcboot

mmcboot=setenv devnum 0; mmc dev 0; fatload mmc 0:1 ${kernel_addr} zImage; fatload mmc 0:1 ${fdt_addr
bootdelay=2
cpu=armv7
fdt_addr=0x2000000
fdtfile=bcm2709-rpi-2-b.dtb
kernel_addr=0x1000000
loadaddr=0x00200000
scriptaddr=0x00000000
soc=bcm283x
stderr=serial,lcd
stdin=serial,lcd
stdout=serial,lcd
usbethaddr=b8:27:eb:4c:66:85
vendor=raspberrypi

Ardndan mkenvimage komutunu u-boot kaynak kod ana dizininde bulunduunuzu


varsayacak olursak aadaki gibi altrn:
$ tools/mkenvimage -s 0x4000 -o /tmp/uboot.env /tmp/uboot.env.txt

rneimizdeki -s parametresi oluacak dosyann boyutunu belirlememizi salamaktadr.


Dosyann 4 KB ve katlar eklinde olmas beklenir. Biz burada 16 KB (0x4000) eklinde
belirtmi olduk. Ortam deikenlerimiz bu kadar yer kaplamyor, kalan alan 0xFF ile
doldurulacak ve uygun checksum deeri hesaplanacaktr.
lem bitiminde oluan uboot.env dosyasn SD kartmzn u-boot'u barndran ilk blmne
kopyaladmzda bir sonraki alta yeni deerlerin aktifletiini ( printenv komutuyla uboot ekrannda teyit edilebilir) greceksiniz.

Cihazn Bir Datm zerinden Almas


Raspberry Pi, Raspbian, Ubuntu MATE, Ubuntu Snappy Core, OpenELEC ve RISC OS
olmak zere birok srm tarafndan desteklenmektedir. Biz incelememizde Debian tabanl
Raspbian datmn kullanacaz. Aadaki balantdan Rasbian veya baka bir datm
indirebilirsiniz.
https://www.raspberrypi.org/downloads/

Cihazn Almas

233

Gml Linux

Sonrasnda elde ettiimiz 2015-05-05-raspbian-wheezy.zip dosyasn amal ve iletim


sistemi imajn SD karta yazmalyz. Sisteminizde SD karta ilikin dosya dmn
belirledikten sonra yazma ilemini dd ile yapabilirsiniz. Sistemimiz iin rnek bir yazma
aadaki gibidir.
Not: sudo fdisk -l ile sisteminizdeki blmlendirme tablosunu listeleyebilirsiniz.
Yazma ileminden nce SD kartnzn dosya sisteminize mount edilmemi olduundan emin
olunuz.
dd bs=4M if=2015-05-05-raspbian-wheezy.img of=/dev/sdb

Not: dd ile yaplan kopyalama ileminin ilerleyiini izlemek iin baka bir terminalde
aadaki komutu girebilirsiniz.
pkill -USR1 -n -x dd
Bu ilem sonrasnda SD kartnzda daha nce bizim elle kopyaladmz dosyalar da ieren
bir boot blm ve dosya sistemine ilikin ikinci bir blm olumu olmaldr. SD kart cihaza
takp altrdmzda iletim sistemi almaldr.
Benzer ilem Raspberry Pi iletim sistemi ykleyicisi NOOBS ile de yaplabilmektedir.
NOOBS, Raspbian datmnn iermekte ayrca internet zerinden indirdii baka
datmlar da cihaz zerine kurabilmektedir. NOOBS ykleyicisini yine aadaki adresten
indirip, .zip dosyasn atktan sonra bir nceki admda yaptmz gibi dd ile SD karta
yazabilirsiniz.
https://www.raspberrypi.org/downloads/

SD kart cihaza takp enerji verdiinizde cihaz recovery modda alacaktr. Cihaz HDMI
zerinden bir ekrana baladktan sonra, GUI zerinden istediiniz datm seebilir ve
cihaza ykleyebilirsiniz.

Cihazn Almas

234

Gml Linux

NFS Root alma


Kk dosya sisteminin cihazn zerindeki bir depolama biriminde deil de a zerindeki bir
NFS paylamnda yer ald senaryo NFS Root olarak adlandrlmakta olup, NFS Root
alma balkl blmde ayrntlaryla ilenmitir.
Bu blmde Raspberry Pi 2 zelinde NFS Root alma detaylarn inceleyeceiz.
NFS Root alma yntemleriyle ilgili destekler ( CONFIG_ROOT_NFS=y )kernel imaj ierisine
statik olarak eklenmi olmaldr.

Start.elf zerinden NFS Root Al


Raspberry Pi cihazlarnda GPU tarafndan yklenen bootcode.bin ve start.elf adl boot
ykleyiciler bulunmaktadr. Geleneksel u-boot ykleyicisi ile karlatrldnda olduka farkl
olan bu ykleyiciler, nfs root alma senaryosu iin benzer imkanlar salamaktadr.
Cihazla birlikte gelen start.elf boot ykleyicisi, cmdline.txt adl bir dosya olmas halinde
burada yer alan kernel commandline parametrelerini ATAGS yntemiyle altrlacak
kernel'a iletmektedir (ARM Mimarisinde Al Sreci blmne bakabilirsiniz).
NFS zerinden kk dosya sistemini balayabilmek iin cmdline.txt dosyasna aadaki
satrn girilmesi yeterli olacaktr:

console=ttyAMA0,115200 root=/dev/nfs rw nfsroot=192.168.0.5:/opt/rpi ip=192.168.0.6:::::eth0 rootwait

Eer DHCP zerinden ip alnacak ise, ip=dhcp eklinde de belirtebilirsiniz. Bu senaryonun


almas iin kernel ierisinde CONFIG_IP_PNP_DHCP=y eklinde seilmi olmaldr.

U-Boot zerinden NFS Root Al


Raspberry Pi 2 zerinde u-boot altrmak, Haziran 2015 itibariyle halen eitli nemli
sorunlara yol amaktadr. U-boot ierisinde ethernet kartnn alr hale getirilmesi her
zaman mmkn olmamakta ve cihaz resetleyip yeniden denemek veya u-boot iindeyken
dhcp komutuyla ip almay denemek gerekmektedir. Kernel imajn adan yklemek yerine
SD karttan okumak istediimizde okuma performans ok dk olmaktadr.

NFS Root alma

235

Gml Linux

Bahsettiimiz olumsuzluklara ramen u-boot'un kullanm yaygnl ve nmzdeki aylarda


bu problemlerin giderilme olasl dnlerek ayrntl olarak incelenmitir.
U-boot zerinden alta en kritik nokta, start.elf rneinde olduu gibi doru command line
parametreleri ile kernel imajnn almaya balamasn salayabilmektir.
Kernel imajn ve Flattened Device Tree (FDT) tanm dosyasn ykleme yntemimize gre
sre bir miktar deimektedir. Aada bu yntemlerden a zerinden ykleme ve sd kart
zerinden ykleme seenekleri incelenmitir.

Kernel ve FDT'nin A zerinden Yklenmesi


Kullanlacak kernel imaj ve fdt dosyas TFTP sunucu ana dizinine konulmaldr.
U-boot komut satrnda ethernet'i kullanmaya balayabilmek iin ncelikle aadaki komut
verilmelidir:
usb start

Ardndan u-boot'un standart ortam deikenleri zerinden ip atama yntemiyle cihazmzn


ve TFTP sunucunun ip adresi belirtilmelidir. rneimizde cihaz ip adresi 192.168.0.6,
sunucu ip adresi ise 192.168.0.5 eklindedir.
setenv ipaddr 192.168.0.6
setenv serverip 192.168.0.5

Ardndan zImage kernel imaj dosyasn TFTP sunucudan 0x1000000 gibi bir adrese
ekelim:
tftp 0x1000000 zImage

Ayn ekilde cihazmz iin TFTP sunucu ana dizinine koyduumuz bcm2709-rpi-2-b.dtb
FDT dosyasn 0x2000000 gibi bir adrese ekelim:
tftp 0x2000000 bcm2709-rpi-2-b.dtb

Kernel ve FDT imajlar bellekte ve adreslerini biliyoruz. Sonraki admda command


parametrelerini hazrlayabilmek iin bootargs u-boot deikenini aadaki gibi
dzenlemeliyiz:

NFS Root alma

236

Gml Linux

setenv bootargs console=ttyAMA0,115200 root=/dev/nfs nfsroot=192.168.0.5:/opt/rpi ip=192.168.0.6

Son olarak bootz komutuna kernel imajnn ve FDT imajnn bellekteki adreslerini
parametre olarak verip Linux al srecini balatalm:
bootz 0x1000000 - 0x2000000

zet olarak aadaki gibi ktlar alm olmalyz:

NFS Root alma

237

Gml Linux

U-Boot> setenv ipaddr 192.168.0.6


U-Boot> setenv serverip 192.168.0.5
U-Boot> tftp 0x1000000 zImage
Waiting for Ethernet connection... done.
Using sms0 device
TFTP from server 192.168.0.5; our IP address is 192.168.0.6
Filename 'zImage'.
Load address: 0x1000000
Loading: #################################################################
#################################################################
#################################################################
#################################################################
#
945.3 KiB/s
done
Bytes transferred = 3819416 (3a4798 hex)
U-Boot> tftp 0x2000000 bcm2709-rpi-2-b.dtb
Waiting for Ethernet connection... done.
Using sms0 device
TFTP from server 192.168.0.5; our IP address is 192.168.0.6
Filename 'bcm2709-rpi-2-b.dtb'.
Load address: 0x2000000
Loading: #
861.3 KiB/s
done
Bytes transferred = 9703 (25e7 hex)

U-Boot> setenv bootargs console=ttyAMA0,115200 root=/dev/nfs nfsroot=172.16.2.64:/opt/rpi,vers=3 ip=1


U-Boot> bootz 0x1000000 - 0x2000000
## Flattened Device Tree blob at 02000000
Booting using the fdt blob at 0x2000000
Loading Kernel Image ... OK
Loading Device Tree to 07b43000, end 07b485e6 ... OK
Starting kernel ...
Uncompressing Linux... done, booting the kernel.
...
[ 5.008131] smsc95xx 1-1.1:1.0 eth0: link up, 100Mbps, full-duplex, lpa 0xC1E1
[ 10.243929] IP-Config: Complete:

[ 10.247276] device=eth0, hwaddr=66:82:1a:78:a9:2f, ipaddr=192.168.0.6, mask=255.255.255.0, gw


[ 10.257516] host=192.168.0.6, domain=, nis-domain=(none)
[ 10.263368] bootserver=192.168.0.5, rootserver=192.168.0.5, rootpath=
[ 10.282394] VFS: Mounted root (nfs filesystem) readonly on device 0:14.
[ 10.289601] devtmpfs: mounted
[ 10.293252] Freeing unused kernel memory: 388K (8072d000 - 8078e000)
Sistem aciliyor...
[ 10.534755] random: nonblocking pool is initialized
Please press Enter to activate this console.

Kernel ve FDT'nin SD Kart zerinden Yklenmesi


NFS Root alma

238

Gml Linux

NFS Root alma

239

Gml Linux

Raspberry Board Konfigrasyonu


Raspberry Pi cihaznz alrken boot ykleyici uygulama tarafndan SD kart zerindeki
birinci FAT blmnde config.txt adl dosya aranr ve bu dosyada yer alan tanmlara gre
cihazn alma biimine dair bir takm zellikler ayarlanr.
Bu sreci PC mimarisindeki BIOS yazlmlar ile benzetirebiliriz. BIOS'lardan farkl olarak
konfigrasyon iin ekran zerinde bir arayz sunulamad iin, tm ayarlar config.txt
adndaki dosya zerinde yaplr.
Deiikliklerin aktif olmas iin sistemin yeniden balatlmas gereklidir. config.txt dosyas
GPU tarafndan altrlan boot ykleyici ierisinden ilenmektedir. Dolaysyla CPU ve
Linux taraf henz balamadan nce sistemle ilgili nemli ayarlamalarn yaplabilmesi
salanmaktadr.
rnek olarak GPU ve CPU arasnda bellein hangi oranlarda paylatrlaca bu dosyadan
ayarlanabilir. Bunun iin gpu_mem konfigrasyon anahtar szc kullanlr. Eer 1 GB'lk bir
Raspberry Board'unuz var ve GPU tarafna 128 MB ayrmak istiyorsanz config.txt
ierisine aadaki satr eklemelisiniz:
gpu_mem=128

Yukardaki satr boot ykleyici tarafndan ilendiinde 1 GB bellein 128 MB' GPU
kullanmna ayrlr, kalan 872 MB ise CPU (ve Linux) tarafndan kullanlabilecek hale gelir. 1
GB bellekli modellerde GPU iin ayrabileceiniz minimum alan 16 MB, maksimum ise 944
MB olabilir.
Benzer ekilde CPU saat frekans, GPU saat frekans, SDRAM frekans, H264 Video
Decoder lisanslar vb. ayarlanabilir. Aadaki blmlerde balca konfigrasyon bloklarn
inceleyeceiz.

Bellek Konfigrasyonu
gpu_mem
Sistemde yer alan GPU'nun bellein ne kadarn kullanacan bu ekilde belirtebiliriz.
Raspberry Pi modelleri arasnda bellek farkllklar bulunduundan 256 MB, 512 MB ve 1024
MB bellee sahip Raspberry Pi modellerinde GPU iin ayrlabilecek minimum ve maksimum
deerler aadaki tablodaki gibidir:

Sistem Konfigrasyonu

240

Gml Linux

Raspberry Pi Modeli

Minimum GPU Bellei

Maksimum GPU Bellei

256 MB

16 MB

192 MB

512 MB

16 MB

448 MB

1024 MB

16 MB

944 MB

Bazen ayn SD kart imajn her 3 model Raspberry Pi cihaznda kullanmak isteyebilirsiniz.
Bu senaryoda farkl modellere ynelik GPU bellek miktarn tanmlayabilmek iin, 256 MB
bellekli modellerde gpu_mem_256 , 512 MB bellekli modellerde gpu_mem_512 ve 1024 MB
bellekli modellerde gpu_mem_1024 parametrelerini kullanabilirsiniz.
NEML: gpu_mem=16 eklindeki bir tanmla GPU tarafna minimum bellek ayrmanz
gerekirse, standart start.elf ve fixup.dat dosyalar ile sistem boot edilememektedir.
Bunun iin her iki firmware dosyasnn cut-down (krplm) versiyonlar kullanlmaldr.
Raspberry Pi Firmware arivininden start_cd.elf ve fixup_cd.dat dosyalarn da SD
kartnzn ilk FAT blmne kopyalamak suretiyle al gerekletirebilirsiniz. GPU tarafna
16 MB bellek ayrldnda, GPU'nun baz zellikleri de devre d braklmakta ve daha hzl
bir al gereklemektedir. Ancak bu al iin yukarda bahsettiimiz dosyalarn da SD
kart zerinde bulunmas zorunludur.

disable_l2cache
ntanml deeri 0 olup, bu deeri 1 yapmanz halinde ARM CPU'nun GPU zerindeki Level
2 Cache alanna eriimini engelleyebilirsiniz. zellikle GPU youn uygulamalarda bu
zelliin kullanlmas tercih edilebilir.
config.txt zerinden GPU Level 2 Cache devre d brakldnda mevcut Linux ekirdek

imajnzla ARM CPU tarafnda boot gerekletiremezsiniz. Boot edebilmek iin Linux
ekirdeinin de GPU Level 2 Cache alann kullanmayacan bilecek ekilde derlenmi
olmas gereklidir. ekirdek konfigrasyonunda CONFIG_BCM2708_NOL2CACHE=y yapp yeniden
derleyerek boot ilemini gerekletirebilirsiniz.

disable_pvt
ntanml deeri 0 olup, 1 yaplmas halinde her 500 milisaniyede bir DRAM scaklnn
kontrol edilmesi fonksiyonunu devre d brakmaktadr. Her bir kontrol ortalama 16s zaman
almaktadr. Eer ortam artlarndan eminseniz az da olsa performans artrmak iin bu
zellii kullanmak isteyebilirsiniz.

Grafik Ekran ve Monitor Konfigrasyonlar


Sistem Konfigrasyonu

241

Gml Linux

display_rotate
Ekran dndrmek veya yatay/dikey oryantasyonunu deitirmek iin kullanlr. Aadaki
tabloda display_rotate deerlerine karlk gerekleen durum bilgileri yer almaktadr:
Display_rotate deeri

Sonu

Herhangi bir dnm uygulanmaz

Saat ynnde 90 derece dndr

Saat ynnde 180 derece dndr

Saat ynnde 270 derece dndr

0x10000

Grntnn yatay katlanm hali

0x20000

Grntnn dikey katlanm hali

Not: 90 ve 270 derece dndrme ilemlerinde bir miktar ek GPU bellei gerektiinden,
GPU iin 16 MB bellek ayrmanz halinde almayacaktr. Bunun iin GPU blmne
minimum 32 MB bellek ayrmalsnz.

hdmi_safe
Bu deerin 1 yaplmas halinde HDMI monitorlerde sk karlalan otomatik alglama
sorunlarna karlk eitli workaround'ler devreye alnr. Eer HDMI ekrannda grnt
alamyorsanz bu opsiyonun deerini 1 yapp test etmeniz nerilir.
hdmi_safe=1 durumu aadaki konfigrasyona eittir:

hdmi_force_hotplug=1
hdmi_ignore_edid=0xa5000080
config_hdmi_boost=4
hdmi_group=2
hdmi_mode=4
disable_overscan=0
overscan_left=24
overscan_right=24
overscan_top=24
overscan_bottom=24

Yukarda yer alan her bir konfigrasyon anahtar deyiminin detaylarna buradan
eriebilirsiniz.

disable_splash

Sistem Konfigrasyonu

242

Gml Linux

Bu deerin 1 yaplmas durumunda, al srecindeki test srasnda gkkua logosunun


gsterimi engellenir.
Baz HDMI monitorlerde alglama sreci uzun srdnden bu logoyu hi grmemi de
olabilirsiniz. Normalde cihaznz almaya baladnda ilk olarak HDMI zerinde bu logoyu
gstermektedir.

bootcode_delay
Deer girilmesi halinde bootcode.bin ykleyicisi start.elf ikinci aama boot ykleyici
yklemeden nce girilen deer kadar saniye boyunca bekler.
Bu opsiyon Raspberry Pi cihaz ile HDMI monitorn ayn g kaynandan beslendii ve
HDMI monitor tarafnda ilklendirme ilemlerinin uzun srd senaryolarda faydal
olmaktadr.

Overclock Parametreleri
Raspberry Pi, overclock ilemleri iin ok sayda konfigrasyon opsiyonu sunmaktadr. ARM
CPU frekans, GPU ierisinde ayr ayr h264 blou, 3D blou, SDRAM frekans vb.
ayarlanabilmektedir. lgilenenler detayl bilgiye buradan ulaabilir.
nceleri Raspberry tarafndan nerilen overclock fonksiyonlarnn dnda bir parametre
kullanldnda cihaz garanti d kalyordu. Daha sonradan force_turbo parametresi ile
aktive edebileceiniz turbo mode gelitirildi. Turbo mode aktif cihazlarda alma frekanslar
sistem megul olduunda artrlmakta, sistem scakl 85C zerine ktnda ise
drlmektedir. Bu ekildeki kullanm garanti kapsamna dahildir.

Codec Lisans Aktivasyonu


Raspberry Pi board'unun gl olduu yanlardan biri de donanm destekli h264 encode ve
decode ilemidir. Bu zelliin aktivasyonu her bir board iin lisans satn alnarak
yaplmaktadr.
Halihazrda MPEG-2 ve VC-1 olmak zere 2 tip codec satn alnabilmektedir. VC-1 codec'i
sadece Windows Media Video (WMV) dosyalarn oynatmak istiyorsanz gereklidir.
Satn alma ilemleri iin http://swag.raspberrypi.org/collections/software adresini ziyaret
etmelisiniz. Lisanslar CPU seri numaralarna gre yapldndan, satn alma ileminden nce
sisteminizi boot edip /proc/cpuinfo dosyasndan seri numarasn renmelisiniz:

Sistem Konfigrasyonu

243

Gml Linux

# cat /proc/cpuinfo
...
Hardware : BCM2709
Revision : a01041
Serial : 00000000634c6685

Temmuz 2015 itibariyle MPEG-2 codec lisans cihaz bana 2 (yaklak 8,5 TL)
civarndadr.
Lisansnz geldikten sonra config.txt ierisinde bu lisansn ilgili olduu CPU seri
numarasn belirtmeniz gerekiyor. rnek olarak yukardaki CPU iin MPEG-2 lisans
alnmsa girmemiz gereken parametre u ekilde olacaktr:
decode_MPG2=0x634c6685

Eer VC-1 codec lisans alm olsaydk bu durumda aadaki parametreyi girmeliydik:
decode_WVC1=0x634c6685

Bazen ayn SD kart imajn birden fazla rnde kullanmanz gerekebilir. Ancak szkonusu
cihazlar iin ayr ayr codec lisanslar alnm ise, her bir cihazdaki config.txt dosyasndaki
ilgili parametrelerin dzenlenmesi gereklidir.
Raspberry Pi bu durumu kolaylatrmak iin yukardaki konfigrasyon parametrelerine virgl
ile ayrlm ekilde 8 adede kadar CPU seri numaras yazlmasna imkan vermitir. Aada
3 farkl CPU seri numarasnn yer ald bir rnei grebilirsiniz:
decode_MPG2=0x634c6685,0x1234567,0x99889922

Her ne kadar birden ok seri numaras yazm mmkn olsa da, sahada byk lekli bir
kullanm ii 8 adet olduka dk bir say olarak kalmaktadr. Byle bir rn ierisinde
kullanmak istiyorsanz lisans ynetimi iin yazlm tarafnda sreci kolaylatrc ek
mekanizmalar gelitirmeyi dnmelisiniz.

Sistem Konfigrasyonu

244

Gml Linux

Board Spesifik Klavuzlar


Bu blmde zellikle kiisel kullanm iin uygun rnek board'lar hakknda eitli notlara yer
vereceiz.
Baz rnlerde belirli bir kernel repository'sini kullanmak, eitli yamalar uygulamak vb.
gerekebilmektedir. Kullandnz board'a zg ek klavuz burada yer alyorsa incelemenizi
neririz.

Board Spesifik Klavuzlar

245

Gml Linux

Hawkboard

Hawkboard, TI (Texas Instruments) firmasnn gelitirdii, OMAP ARM9 (OMAP-L138)


ilemcisini kullanan ak bir donanmdr.
Temel olarak aadaki bileenlere sahiptir.
lemci

ARMV5/ARM926

DSP

C674x Floating Point

RAM

128 MB DDR

NAND

128 MB

MMC/SD

Var

Ethernet

Var

VGA

Var

Konsol

Var

Not: Hawkboard projesi, kartn baz donanm problemleri nedeniyle sonlandrlm


durumdadr. Fakat kartn NAND, Ethernet ve VGA gibi bileenlere sahip olmas, bu tr
sistemleri tanma srecinde bizim iin kullanl bir alma ortam oluturacaktr.
Bu blmde, cihaz iin nykleyici ve iletim sistemi ekirdeinin nasl derlendiinden,
sonrasnda cihaz kendi bilgisayarmz zerinden (Host) nasl aabileceimize (Recovery) ve
temel baz kullanm senaryolarna bakacaz.
lk olarak, nykleyici ve ekirdei nasl edinip derleyebileceimize bakalm.

Hawkboard

246

Gml Linux

Not: Derleme srecinde CodeSourcery gelitirme aralarn kullanacaz. Bu aamada


apraz derleyicinizin yol ifadesinin PATH evre deikeninde tanml olduundan emin
olunuz.
Ayrca baka bir derleyici kullanyorsanz, nykleyici ve ekirdek derleme
aamalarnda, derleyicinize ait neki (prefix) kullanmalsnz. CodeSourcery iin
derleyici neki arm-none-linux-gnueabi- eklindedir.

nykleyici (Bootloader)
Hawkboard, U-Boot nykleyicisini kullanmaktadr.
wget -c http://hawkboard.googlecode.com/files/u-boot-omapl1_v1.tar.bz2
tar xf u-boot-omapl1_v1.tar.bz2
cd u-boot-omapl1
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- distclean
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- omapl_hawkboard_config
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

Bu aamada ana dizinde u-boot dosyas olumu olmaldr.

ekirdek (Kernel)
wget -c http://hawkboard.googlecode.com/files/linux-omapl1_ver1.tar.bz2
tar xf linux-omapl1_ver1.tar.bz2
cd linux-omapl1
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- distclean
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- omapl138_hawkboard_defconfig
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage

Bu aamada ana dizinden itibaren arch/arm/boot dizininde, U-Boot tarafndan


yklenebilecek, ekirdek imaj uImage olumu olmaldr.
imdi kart sfrdan nasl aabileceimize bakalm.

Kartn Kurtarlmas (Board Recovery)


Kart zerinde, al srecine ilikin alt seviye bir yazlm olmamas, bu yazlmn bozulmu
olmas durumununda veya bu sre bypass edilmek istendiinde, kartn dardan almas
tek veya alternatif bir seenek olarak karmza kmaktadr.

Hawkboard

247

Gml Linux

Kart kurtarma senaryolarnda genel olarak cihaza SD kart, USB veya seri port zerinden ilk
olarak nykleyicinin atlarak altrlmas hedeflenmektedir. Cihaz zerinde nykleyici
altrldktan sonra seri terminal zerinden cihazla alt seviye bir iletiim kurulabilir ve
sonraki admlara buradan devam edilebilir.
Hawkboard seri port zerinden (UART Recovery) alabilmektedir. ncesinde, daha nce
derlediimiz nykleyici dosyasn (u-boot) seri port iin uygun ekilde imzalamalyz. Bu
imzalama ve nykleyiciyi cihaza atma ilemleri iin TI tarafndan hazrlanan AIS Generator
/ UART Host Tool aralarn kullanacaz. Gerekli aralar sisteminize kurmak iin ilk olarak
aadaki zip dosyasn indirebilirsiniz.
Not: TI tarafndan salanan bu aralar, maalesef Linux karlklar olmayan, .NET
Framework bamll olan pencereli uygulamalardr. Linux altnda bu programlar
kullanabilmek iin sisteminizde mono, mono-vbnc ve wine paketleri bulunmaldr.
wget -c http://www-s.ti.com/sc/techlit/sprab41.zip

zip dosyasndan AISgen_d800k008_Install_v1.13.exe kurulum dosyas kacaktr. Kurulum


sonrasnda, srasyla imzalama ve cihaza nykleyici atmak iin AISgen_d800k008.exe ve
UartHost.exe uygulamalarn kullanacaz.
lk olarak, imzalama ilemini nasl yaptmza bakalm.
Not: lemci yongasndaki ROM nykleyici dardan okuyaca bir sonraki
nykleyiciyi, TI tarafndan gelitirilen, Application Image Script (AIS) formatnda
beklemektedir. Formatn detaylarna TI dokmanlarnda mevcuttur.

Seri Port Hedefli mzalama


AISgen imzalama uygulamasnda General ve DDR sekmelerine aadaki deerleri
vermeliyiz. DDR sekmesinin grnr olmas iin General sekmesinde, Configure DDR
seenei iaretlenmelidir.
General:
zellik

Deer

Device Type

d800k002 - ARM

Boot Mode

UART2

DDR:

Hawkboard

248

Gml Linux

zellik

Deer

Memory Type

DDR2

DRPYC1R

0x43

SDCR

0x00134632

SDCR2

SDTIMR1

0x26492a09

SDTIMR2

0x7d13c722

SDRCR

0x249

Not: Bu aamada yukardaki bu deerlerin ne anlama geldiini bilmek zorunda deiliz.


Linux altnda aldmz rnek ekran grntleri aadaki gibidir.

Hawkboard

249

Gml Linux

Sonrasnda, ARM Application File blmne daha nce derlediiniz u-boot dosyasn, AIS
Output File blmn de oluturulacak olan dosya ismini vererek imzalama ilemini
gerekletirebilirsiniz. Biz imzal dosyamza u-boot_uart.bin ismini verdik.
imdi imzalanm nykleyici dosyasn Hawkboard'a nasl atacamza bakalm.

Seri Port zerinden nykleyicinin Atlmas


Bu amala UartHost.exe uygulamasn kullanacaz. Fakat ncesinde cihaz zerindeki al
srecini kontrol eden anahtarlar (Boot Switches) uygun ekilde ayarlamalyz. retim
aamasnda ilemci iindeki dahili bir hafzaya kodlanan nykleyici (ROM Bootloader) bu
anahtarlarn durumuna gre sonraki nykleyiciyi NAND veya seri port zerinden okumaya
almaktadr. Cihaz seri port zerinden aabilmek iin boot anahtarlar aadaki gibi
ayarlanmaldr.
Not: Boot anahtarlar, kart zerinde DIP switch eklinde bulunmaktadr. Reset
butonunun yaknnda bulunan bu anahtarlar SW1 olarak isimlendirilmitir.
1

OFF

ON

OFF

ON

Bu durumda, cihaza enerji verildiinde veya resetlendiinde, seri terminale BOOTME


mesajn gnderecektir. Cihaza nykleyiciyi atmadan nce bu mesajn geldiinden emin
olunuz ve seri terminal balantnz sonlandrnz.

Hawkboard

250

Gml Linux

imdi UartHost.exe uygulamasn kullanabiliriz. Uygulamaya daha nce imzaladmz uboot dosyasn ve seri portu gstermeliyiz, ayrca Wait for BOOTME seeneinin seili
olduundan emin olunuz. Bu durumda uygulamada Start butonuna bastmzda Linux
altnda aldmz rnek ekran grnts aadaki gibidir.

Bu aamada uygulama cihaza enerji vermemizi veya resetlememizi beklemektedir. Cihaz


yeniden balatldnda, imzalanm u-boot cihaza atlacaktr. rnek ekran grnts
aadaki gibidir.

Hawkboard

251

Gml Linux

Sonrasnda seri terminal zerinden cihaza balanp enter tuuna bastnzda u-boot komut
satrn grmelisiniz. printenv ile nykleyicinin kulland evre deikenlerini grebilirsiniz.
hawkboard.org > printenv
bootargs=mem=128M console=ttyS2,115200n8 root=/dev/ram0 rw initrd=0xc1180000,4M ip=dhcp
bootcmd=
bootdelay=3
baudrate=115200
bootfile="uImage"
stdin=serial
stdout=serial
stderr=serial
ethaddr=0a:c1:a8:12:fa:c0
ver=U-Boot 2009.01 (Oca 21 2015 - 14:11:03)
Environment size: 254/131068 bytes

Bu aamadan sonra sistemi amak iin bir ok seenee sahibiz. Srayla bunlardan
bazlarn ksaca inceleyim.

Cihazn TFTP ve NFS zerinden Almas

Hawkboard

252

Gml Linux

Bu yntemi kullanarak, a zerindeki baka bir sistemden veya gelitirme yaptnz


bilgisayardan, ekirdei cihaza ekmek ve uzaktaki bir dosya sistemini mount etmek
mmkndr. ncesinde gelitirme yaptnz bilgisayarnzda TFTP ve NFS sunucular
kurulu olmaldr.
Uzaktaki bir makinadan ekirdei cihaz zerine aadaki gibi ekebilirsiniz.
setenv autoload no
dhcp
setenv serverip <TFTP sunucu adresi>
tftp c0700000 uImage

Al srasnda root dosya sistemi olarak NFS'i kullanmak iin ise bootargs deikenine
aadaki formda deerler geirilmelidir.
setenv nfsroot ${serverip}:<Uzak makinadaki NFS dizini>

setenv bootargs "root=/dev/nfs nfsroot=${nfsroot} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${

dhcp zelliinin olmamas durumunda, cihaz IP, gateway ve netmask deerlerini aadaki
gibi verebilirsiniz.
setenv ipaddr <Cihaz IP adresi>
setenv gatewayip <Gateway adresi>
setenv netmask <Netmask>

Sonrasnda daha nce ekirdei ektiiniz adresteki kodu altrarak cihaz aabilirsiniz.
bootm <ekirdein bellee ekildii adres>

Kendi sistemimiz iin rnek bir kullanm aadaki gibidir.


setenv autoload no
dhcp
setenv serverip 172.16.2.136
tftp c0700000 uImage
setenv nfsroot ${serverip}:/nfsroot

setenv bootargs "console=ttyS2,115200 init=/bin/sh root=/dev/nfs nfsroot=${nfsroot} ip=${ipaddr}:${se


bootm c0700000

imdi, bir dier alternatif olarak, cihaz NAND zerinden nasl aabileceimize bakalm.

Hawkboard

253

Gml Linux

Cihazn NAND zerinden Almas


Cihaz NAND zerinden aabilmek iin ilk olarak gerekli dosyalar bir ekilde NAND zerine
yazmalyz. Bu ilemi, dosya sistemini NFS zerinden mount edip, Linux zerinden
yapabildiimiz gibi, U-Boot zerinden de yapabiliriz. Fakat ncesinde, daha nce seri port
iin yaptmza benzer ekilde, NAND zerine yazacamz u-boot dosyasn imzalamalyz.
imdi srasyla, imzalama ilemine ve gerekli dosyalar NAND zerine nasl
yazabileceimize bakalm.

NAND Hedefli mzalama


mzalama ilemi iin yine AISgen_d800k008.exe uygulamasn kullanacaz, seri port iin
imzalama yaparken kullandmz ayn deerleri kullanacaz yalnz Boot Mode tipini NAND
Flash olarak semeliyiz.
General:
zellik

Deer

Device Type

d800k002 - ARM

Boot Mode

NAND Flash

NAND Blmlendirmesi
ekirdek, NAND zerinde sanki bir blmlendirme (Partition) yaps varm gibi ilem
yapabilir. Bu blmlendirme, Linux kaynak kodu ierisinden sabit olarak ayarlanabilecei gibi
ekirdee nykleyici tarafndan geirilen argmanlar vastasyla dinamik olarak da
yaplabilir.
Sabit blmlendirme bilgileri arch/arm/mach-davinci/board-omapl138-hawk.c dosyasnda
mtd_partition trndeki omapl138_hawk_nandflash_partition isimli bir dizi ile temsil
edilmektedir.
Dinamik blmlendirme iin ise ekirdek kodu command line partition table parsing seenei
seilerek derlenmeli ve ekirdee mtdparts komut satr seenei geirilmelidir. rnek olarak
aadaki gibi bir blmlendirme oluturalm.

Hawkboard

254

Gml Linux

Blm

Uzunluk

U-Boot_Env

128K

U-Boot

512K

Kernel

4M

Recovery

40M

FileSystem

Kalan Bo Alan

Bu blmlendirmeyi oluturabilmek iin ekirdee, dier komut satr parametreleriyle


beraber, aadaki mtdparts deerini geirmeliyiz.
mtdparts=davinci_nand.1:128K(U-Boot_Env),512K(U-Boot),4M(Kernel),40M(Recovery),-(FileSystem)

Not: Yukardaki ifadede davinci_nand, mtd id deerini, noktadan sonra eklenen 1


deeri ise aygt numarasn gstermektedir. mtd id deerine, Linux zerinden, aadaki
gibi ulaabilirsiniz.
ls /sys/bus/platform/drivers | grep nand
Linux zerinden NAND blmlendirmesini cat /proc/mtd eklinde grebilirsiniz. rneimiz
iin kt aadaki gibidir.
# cat /proc/mtd
dev: size erasesize name
mtd0: 00020000 00020000 "U-Boot_Env"
mtd1: 00080000 00020000 "U-Boot"
mtd2: 00400000 00020000 "Kernel"
mtd3: 02800000 00020000 "Recovery"
mtd4: 05360000 00020000 "FileSystem"

Her bir blm zerinde, bir blok aygt (block device) olarak ilem yaplabilir. lgili dosya
dmlerini aadaki gibi listeleyebilirsiniz.
# ls /dev/mtdblock*
/dev/mtdblock0 /dev/mtdblock1 /dev/mtdblock2 /dev/mtdblock3 /dev/mtdblock4

imdi srasyla nykleyici, ekirdek imaj ve dosya sistemini nasl yazabileceimize


bakalm. Ayrca, FileSystem olarak isimlendirdiimiz son blmden nce Recover isimli
baka bir blm daha oluturduumuza dikkat ediniz. Bu blm zerinde, gvenlik amal,
yalnz okunabilen bir dosya sistemi oluturacaz.

Hawkboard

255

Gml Linux

Gerekli Dosyalarn Linux zerinden Yazlmas


lk olarak, NAND zerine yazacamz nykleyici, ekirdek ve dosya sistemi imajlarn NFS
zerinden atmz cihazmzn dosya sistemine kopyalamalyz. Gerekli dosyalar /opt
altna attmz kabul edelim.
/opt # ls
rootfs.jffs2 uImage
rootfs.sqsh u-boot_nand.bin

Dosya

Tr

u-boot_nand.bin

NAND iin imzalanm nykleyici

uImage

ekirdek imaj

rootfs.sqsh

squashfs dosya sistemi imaj

rootfs.jffs2

jffs2 dosya sistemi imaj

Gerekli dosyalar dd arac ile aadaki gibi srasyla NAND zerine yazabiliriz.
Uyar: Bu ilemler ncesinde, U-Boot komut satrndan nand erase ile tm NAND'i
silmeyi unutmaynz. Dier bir alternatif mtd-utils aralarn cihaz hedefli derleyerek ayn
ilemi Linux zerinden yapmak olabilir.
dd if=u-boot_nand.bin of=/dev/mtdblock0 bs=128k
dd if=uImage of=/dev/mtdblock2 bs=128k
dd if=rootfs.sqsh of=/dev/mtdblock3 bs=128k
dd if=rootfs.jffs2 of=/dev/mtdblock4 bs=128k

imdi ayn ilemi u-boot zerinden nasl yapabileceimize bakalm.

Gerekli Dosyalarn U-Boot zerinden Yazlmas

Hawkboard

256

Gml Linux

nand erase 0x20000 0x80000


tftpboot 0xc0700000 u-boot_nand.bin
nand write.e 0xc0700000 0x20000 0x80000
nand erase 0xA0000 0x400000
tftpboot 0xc0700000 uImage
nand write.e 0xc0700000 0xA0000 0x400000
nand erase 0x2CA0000 0x1000000
tftpboot 0xc0700000 rootfs.sqsh
nand write.e 0xc0700000 0x2CA0000 0x1000000
nand erase 0x4A0000 0x1000000
tftpboot 0xc0700000 rootfs.jffs2
nand write.e 0xc0700000 0x4A0000 0x1000000

nand write.e komutunun genel ekli aadaki gibidir.


nand write.e <memory address> <offset> <size>

ekirdee geireceininiz NAND blmlendirmesini deitirmeniz durumunda, kullandmz


ofset deerleri de deiecektir. Ayrca yukardaki rnek kullanmda dosya sistemlerinin 16M
snrnda olduu kabul edilmitir, boyut olarak 0x1000000 deerinin kullanldna dikkat
ediniz.
Root dosya sisteminin uygun parametlerle jffs2 imajnn oluturulumas ve sonrasnda, UBoot veya Linux zerinden, NAND zerine yazldktan sonra tekrar okunmasnda baz
problemler ortaya kabilmektedir. Bu yzden nykleyici ve ekirdei u-boot zeriden
yazmanz, dosya sistemini ise Linux zerinden ilgili blm mount edip dosya sistemini
kopyalamanz neririz.

nerilen Yntem
U-Boot:

Hawkboard

257

Gml Linux

nand erase
tftpboot 0xc0700000 u-boot_nand.bin
nand write.e 0xc0700000 0x20000 0x80000
tftpboot 0xc0700000 uImage
nand write.e 0xc0700000 0xA0000 0x400000
setenv nfsroot ${serverip}:/nfsroot

setenv bootargs "console=ttyS2,115200 init=/bin/sh root=/dev/nfs nfsroot=${nfsroot} ip=${ipaddr}:${se


bootm c0700000

Linux:
mount -t jffs2 /dev/mtdblock4 nand/
tar xf rootfs.tgz -C nand/
umount nand

Bu aamada ROM ykleyicinin, bir sonraki alta, u-boot ykleyicisini NAND zerinden
aramas iin boot anahtarlar aadaki gibi ayarlanmalyz.
1

ON

OFF

OFF

OFF

Gerekli dosyalar NAND zerine yazdktan sonra cihazn kendiliinden NAND zerinden
alabilmesi iin nykleyici zerinde baz deiiklikler yapmalyz. Cihaz resetleyerek tekrar
u-boot komut satrna delim.
ekirdee, root dosya sisteminin yerini ve tipini geirmeliyiz. Aadaki kullanmda
root=/dev/mtdblock4 dosya sisteminin aranaca NAND blmn, rootfstype=jffs2 ise
dosya sisteminin tipini gstermektedir. Sonrasnda NAND zerindeki ekirdek kodu, gvenli
bir adrese ekilip balatlmaldr. nand read ve bootm komutlar bu ileri yapmaktadr.
bootcmd ile gsterilen komutlar, alta nykleyici tarafndan otomatik olarak altrlarak,
bu komutlarn icra edilmesi salanr.

setenv bootargs "console=ttyS2,115200 init=/bin/sh root=/dev/mtdblock4 rootwait rootfstype=jffs2 mtdp


setenv bootcmd 'nand read c0700000 A0000 200000; bootm c0700000'
saveenv

Hawkboard

258

Gml Linux

Bu aamadan sonra cihaz resetlendiinde, dardan herhangi bir mdahale olmakszn,


dahili NAND hafzas zerinden alacaktr.

Hawkboard

259

Gml Linux

Olimex A20

Olimex firmas tarafndan gelitirilen board, Dual-Core Allwinner A20 Cortex-A7 ilemcisiyle
gelmektedir. Sadece yazlm deil, donanm da ak bir platform olarak gelitirilmekte ve tm
tasarm dosyalar paylalmaktadr.
Kartn tam ad A20-OLinuXino-MICRO olarak gemektedir fakat dokmanda ksaca Olimex
A20 adn kullanacaz.
Temel olarak aadaki bileenlere sahiptir.
lemci

Allwinner A20 Cortex-A7

ekirdek Says

DSP

Yok

GPU

Mali 400

RAM

1 GB DDR3

NAND

Yok

MMC/SD

Var

MicroSD

Var

Ethernet

Var

VGA

Var

HDMI

Var

Konsol

Var

Olimex A20

260

Gml Linux

Bu blmde, cihaz iin nykleyici ve iletim sistemi ekirdeinin nasl derlendiinden,


sonrasnda cihazn mikro SD kart zerinden nasl aldndan bahsedeceiz.
lk olarak, nykleyici ve ekirdei nasl edinip derleyebileceimize bakalm.
Not: Derleme srecinde armhf hedefli GNU C apraz derleme aralarn kullanacaz.
Paket yneticinizi kullanarak gerekli aralar edinebilirsiniz, Ubuntu iin gcc-arm-linuxgnueabihf paketini kurabilirsiniz.
Baka bir derleyici kullanyorsanz, nykleyici ve ekirdek derleme aamalarnda,
derleyicinize ait neki (prefix) kullanmalsnz.

nykleyici (Bootloader)
Olimex A20, U-Boot nykleyicisini kullanmaktadr.
git clone https://github.com/linux-sunxi/u-boot-sunxi.git
cd u-boot-sunxi/
make CROSS_COMPILE=arm-linux-gnueabihf- A20-OLinuXino-Micro_config
make CROSS_COMPILE=arm-linux-gnueabihf-

Bu aamada ana dizinde u-boot.img ve spl altnda sunxi-spl.bin dosyalar olumu olmaldr.
sunxi-spl.bin dosyas, u-boot nykleyicisini yklemekten sorumlu, greli olarak daha kk
olan nykleyici olup SPL (Secondary Program Loader) olarak isimlendirilmektedir.

Ayar Dosyas (Script file)


GPIO atamalar, DDR bellek parametreleri ve video znrl gibi nemli baz ayar
parametreler, ekirdek kodu yerine, bir veri dosyasnda tutulabilmektedir. Bu sayede
ekirdek kodu her defasnda yeniden derlenmeksizin, bu parametreler zerinde sonradan
deiiklik yaplabilmektedir.
Gerekli ayar dosyas ve aralar aadaki gibi sisteminize indirebilirsiniz.
git clone git://github.com/linux-sunxi/sunxi-tools.git
git clone git://github.com/linux-sunxi/sunxi-boards.git

lk olarak sunxi-tools dizininde fex2bin uygulamasn derleyecek, sonrasnda bu uygulamay


kullanarak, sunxi-boards dizinindeki a20-olinuxino_micro.fex isimli ayar dosyasn,
ekirdein okuyabilecei, uygun formata dntreceiz.

Olimex A20

261

Gml Linux

cd sunxi-tools
make fex2bin
cd ../sunxi-boards/
../sunxi-tools/fex2bin sys_config/a20/a20-olinuxino_micro.fex script.bin

Bu aamada hedeflediimiz script.bin dosyasn elde etmi olduk.

ekirdek (Kernel)
ekirdek kodunu aadaki gibi indirip derleyebilirsiniz.
git clone -b sunxi-3.4 https://github.com/linux-sunxi/linux-sunxi.git
cd linux-sunxi/
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- sun7i_defconfig
make -j2 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage modules

Bu aamada u-boot tarafndan yklenebilecek ekirdek imaj uImage ve gerekli modller


olumu olmaldr. Daha sonra dosya sistemine tayacamz modlleri, aada gsterildii
gibi bir dizin altna toplayabiliriz. Modlleri tayacamz dizini, aadaki rnek iin,
modules olarak isimlendirdik.
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=modules modules_install

Bu ilem sonrasnda, ana dizinden itibaren, ekirdek imaj ve gerekli modller aadaki gibi
bir dizin yolunda bulunacaktr. ekirdek versiyonuna gre xyz deerleri deimektedir.
arch/arm/boot/uImage
modules/lib/modules/3.4.x-y-z

imdi cihaz mikro SD zerinden nasl aabileceimize bakalm.

Cihazn Mikro SD zerinden Almas


Mikro SD kartn yerleimi genel olarak aadaki gibi olacaktr.

Olimex A20

262

Gml Linux

Balang

Boyut

Kullanm

8KB

Blmlendirme tablosu

24KB

SPL nykleyicisi

32

512KB

u-boot

544

128KB

evre deikenleri

672

352KB

Sakl alan

1024

Dosya sistemi iin bo alan

Not: Kart zerinde hem MMC/SD hem de mikro SD bulunmaktadr. Cihaz yalnz mikro
SD zerinden alabilmektedir, al srecini anlattmz aadaki blmlerde
onlukla mikro SD yerine yalnz SD ifadesini kullandk.
SD kart zerinde, ilk 1MB alandan sonra srasyla FAT32 ve ext4 olarak formatlayacamz
iki adet blm oluturacaz. FAT32 blmne ekirdek imaj ve ihtiya duyduu ayar
dosyasn, ext4 blmne ise dosya sistemini kopyalayacaz. lk 1MB'lk alana ise
nykleyicileri yazacaz. SD kartn hedeflediimiz son durumunu grsel olarak aadaki
gibi gsterebiliriz.

imdi SD kart zerine bu ilemleri nasl yapabileceimize bakalm.


Sonraki ilemleri kolaylatrmak iin SD karta ilikin dosya dmn ve blmlendirmeye
ilikin isim bilgisini srasyla CARD ve PARTITION isimli evre deikenlerinde tutalm. SD
karta ilikin dosya dm dahili bir SD okuyucu ya da USB balantl bir kart okuyucu
kullanlmasna gre deiecektir. Dahili bir SD okuyucu iin kart ve blmlendirme bilgisi
aadaki gibi tanmlanabilir.

Olimex A20

263

Gml Linux

export CARD=/dev/mmcblk0
export PARTITION=p

SD kartn ilk 1MB'lk alann temizledikten sonra SPL ve u-boot nykleyicilerini aadaki
gibi yazabiliriz.
dd if=/dev/zero of=${CARD} bs=1M count=1
dd if=sunxi-spl.bin of=${CARD} bs=1024 seek=8
dd if=u-boot.img of=${CARD} bs=1024 seek=40

imdi SD kart zerinde, sonrasnda FAT32 ve ext4 olarak biimlendireceimiz, iki adet
blm oluturalm. Bunun iin sfdisk aracn kullanan aadaki betii kullanabilirsiniz.
#!/bin/sh
CARD=/dev/mmcblk0
sfdisk -R ${CARD}
cat << EOT | sfdisk --in-order -L -uM ${card}
1,16,c
,,L
EOT

Yeni oluan blmleri srasyla FAT32 ve ext4 olarak biimlendirelim.


mkfs.vfat ${CARD}${PARTITION}1
mkfs.ext4 ${CARD}${PARTITION}2

Bu aamadan sonra al blm olarak kullanacamz FAT32 blmne, daha nce


derlediimiz, uImage ve script.bin dosyalarn, ext4 blmne ise ekirdek modllerini ieren
dosya sistemini yazmalyz.
Bu ilemlerden sonra cihaz hazrladmz SD kart ile aarak u-boot komut satrna
debiliriz. Al srecinde srasyla ROM Bootloader, SPL ve u-boot alacaktr. u-boot
komut satrna dtkten sonra, ekirdee geirilecek komut satr argmanlarn oluturup
sonrasnda ekirdek kodunu gvenli bir adrese ekip altrabiliriz.
setenv bootargs console=ttyS0,115200 init=/bin/sh root=/dev/mmcblk0p2 rootwait panic=10
fatload mmc 0 0x48000000 uImage
bootm 0x48000000

Olimex A20

264

Gml Linux

TI DM6446 EVM
1 Gelitirme aralarnn hazrlanmas:
lk olarak gelitirme aralar indirilip aldktan sonra .../bin dizini altndaki derleme
aralarnn arm-linux nekine (prefix) sahip sembolik linkleri oluturulup (grece daha uzun
olan arm-none-linux-gnueabi neki ile uramamak iin), dizin yolu PATH deikenine
eklenmi ve bir evresel deikende saklanmtr.

wget -c http://www.codesourcery.com/sgpp/lite/arm/portal/package6488/public/arm-none-linux-gnueabi/ar
arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
tar jxvf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
cd arm-2010q1/bin/
for i in `ls`; do s=`echo $i | cut -b 24-`; ln -s $i arm-linux-$s; done
export PATH=$(pwd):$PATH
export DEVELOPMENT_TOOLS=$(pwd)

2 u-boot nykleyicinin (bootloader)


derlenmesi:
DM644x EVM, ubl(User Boot Loader) ve u-boot olmak zere iki adet nykleyiciye ihtiya
duymaktadr. Greli olarak daha kk olan ubl, ekirdei ykleyecek olan u-boot
nykleyicisini balatmaktan sorumludur. u-bootun derlenme aamalar temel olarak
aadaki gibidir. u-boot, arm-linux-gccyi ARM iin ngrlen derleyici olarak
kullandndan, apraz derleme iin ekirdein aksine CROSS COMPILE veya ARCH
evresel deikenlerine ihtiya duymamaktadr.
git clone git://www.denx.de/git/u-boot.git u-boot
make distclean
make davinci_dvevm_config
make

u-boot kaynak kodu ierisinde include/configs/davinci_dvevm.h yolu izlenerek nykleyicinin


konfigr ayarlar yaplabilir. u-boot ngrlen olarak NOR flash iin derlendiinden bu haliyle
NAND zerinde almamaktadr, ayrca nykleyicinin autoboot zelliinin almas iin bir
bootdelay deeri girilmelidir. Bunun iin aadaki deiiklikler yaplmaldr.

TI DM6446 EVM

265

Gml Linux

-#define CONFIG_SYS_USE_NOR
+#define CONFIG_SYS_USE_NAND
-#undef CONFIG_BOOTDELAY
#define CONFIG_BOOTDELAY 5

Ayrca bootcmd, bootargs gibi evresel deikenlerin deerleri hard coded olarak buradan
ayarlanabilir.
u-boot temel olarak yukardaki gibi derlenmesine karn birka problemle karlalabilir. uboot derleme ilemi konak makinann doal C derleyici ile balayan bir sretir ve konak
makinaya bamll vardr. Konak bilgisayardaki /usr/local/include altndaki baz balk
dosyalarnn varl derleme ileminde sorunlara yol aabilmektedir(u-boot, sistemde var
olan balk dosyalar ile ilgili konfigrasyon sonucunda yanl bir varsaymda bulunuyor
olabilir.). Konfigr ileminden nce konak bilgisayarda geici olarak /usr/local/include dizinin
adn deitirmek sorunu zebilir.
mv /usr/local/include /usr/local/_include

3 ekirdein derlenmesi:
En son DaVinci linux ekirdei asadaki yol izlenerek derlenmitir.
git clone git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-davinci.git linux-davinci-2.6
cd linux-davinci-2.6
make ARCH=arm davinci_all_defconfig
make ARCH=arm menuconfig [1]
make ARCH=arm CROSS_COMPILE=arm-linux- uImage

4 Dosya sisteminin oluturulmas:


Dosya sisteminin oluturulmas iin temel olarak busybox, dropbear aralar derlenmi,
dosya sisteminde bulunmas gereken asgari dizin, al betikleri, aygt dmleri
oluturulmu ve gelitirme aralarnn kulland standart C ktphanesi dosya sistemine
eklenmitir.
busybox aadaki gibi derlenebilir, ROOTFS evresel deikenine baka bir deer
verilebilir.

TI DM6446 EVM

266

Gml Linux

export ROOTFS=/tmp/dosyasistemi
mkdir -p ${ROOTFS}
wget -c http://www.busybox.net/downloads/busybox-1.17.1.tar.bz2
tar jxvf busybox-1.17.1.tar.bz2
cd busybox-1.17.1/
make defconfig
#make menuconfig [ilave ayarlar yaplmas durumda...]
make CROSS_COMPILE=arm-linuxmake CROSS_COMPILE=arm-linux- CONFIG_PREFIX=${ROOTFS} install

Gelitirme aralarnn iindeki standart C ktpnanesi dosya sisteminde / altna


kopyalanmaldr.
cp -a ${DEVELOPMENT_TOOLS}/../arm-none-linux-gnueabi/libc/lib ${ROOTFS}

Al ve sonrasnda ihtiya duyulacak olan temel dizinler aadaki gibi oluturulabilir.


mkdir -p ${ROOTFS}/etc/init.d
mkdir -p ${ROOTFS}/dev
mkdir -p ${ROOTFS}/tmp
mkdir -p ${ROOTFS}/proc
mkdir -p ${ROOTFS}/home/root

busybox iinden kan rnek inittab zerinde deiiklik yaplarak dosya sisteminde
kullanlabilir.
cp examples/inittab ${ROOTFS}/etc

inittab dosyasna aadaki satr eklenmeli veya aklama eklinde olan benzer satr ayn
forma dntrlmelidir.
::respawn:/sbin/getty -L ttyS0 115200 vt100

Cihaza u an yalnz uzaktan balanlaca iin(seri port veya a zerinden) "/sbin/getty


invocations for selected ttys" altndaki tty4 ve tty5 ile balayan satrlar aklama haline
getirilebilir aksi halde /dev altnda gerekli tty aygt dmleri oluturulmaldr.
/etc/init.d altnda ierii aadaki gibi olan rcS betii oluturulmal ve gerekli izinleri
verilmelidir.

TI DM6446 EVM

267

Gml Linux

#!/bin/sh
mount -t proc proc /proc
mount -t devpts devpts /dev/pts

rcS iin aadaki gibi gerekli izinleri verilebilir.


chmod 755 etc/init.d/rcS

/dev altndaki gerekli aygt dmleri ve pts dizini aadaki gibi oluturulabilir veya
dmler konak bilgisayardan cp komutuna -a anahtar verilerek kopyalanabilir.
mknod -m 666 ${ROOTFS}/dev/tty c 5 0
mknod -m 666 ${ROOTFS}/dev/console c 5 1
mknod -m 666 ${ROOTFS}/dev/tty1 c 4 1
mknod -m 666 ${ROOTFS}/dev/tty2 c 4 2
mknod -m 666 ${ROOTFS}/dev/tty3 c 4 3
mknod -m 666 ${ROOTFS}/dev/tty4 c 4 4
mknod -m 666 ${ROOTFS}/dev/random c 1 8
mknod -m 666 ${ROOTFS}/dev/urandom c 1 9
mknod -m 666 ${ROOTFS}/dev/ptmx c 5 2
mknod -m 666 ${ROOTFS}/dev/zero c 1 5
mknod -m 666 ${ROOTFS}/dev/null c 1 3
mkdir -p ${ROOTFS}/dev/pts

Cihaz bu noktadan sonra bu dosya sistemi kullanlarak nfs zerinden alabilir, cihaza seri
port zerinden login olunabilir. A zerinden login olmak iin kk bir SSH2 sunucu ve
istemci uygulamas olan Dropbear aadaki admlar izlenerek derlenmi ve cihaz zerinde
altrlmtr.
wget -c http://matt.ucc.asn.au/dropbear/releases/dropbear-0.52.tar.gz
tar xf dropbear-0.52.tar.gz
cd dropbear-0.52/
./configure --host=arm-linux --disable-zlib
make PROGRAMS="dropbear dbclient dropbearkey scp" MULTI=1 STATIC=1
cp dropbearmulti ${ROOTFS}/usr/bin

Dropbear uygulamasnn cihaz zerinde altrlmas iin cihaz zerinde aadaki admlar
izlenebilir.

TI DM6446 EVM

268

Gml Linux

cd /usr/bin
ln -s dropbearmulti dropbear
ln -s dropbearmulti dbclient
ln -s dropbearmulti dropbearkey
ln -s dropbearmulti scp
mkdir -p /etc/dropbear
dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key

Cihazda /etc altnda kullancnn id numaras, home dizini ve sisteme login olduunda
altralacak olan programn belirtildii passwd dosyas oluturulmaldr. root kullancs iin
passwd dosyasnn ierii aadaki gibi olabilir.
root::0:0:root:/home/root:/bin/sh

/etc/passwd dosyasnda kriptolu olarak tutulacak olan, root ifresi passwd komutu ile
oluturulabilir. devpts mount edildikten ve dropbear uygulamas balatldktan sonra cihaza
ssh zerinden uzaktan balanlabilir.
mount -t devpts devpts /dev/pts
dropbear

dropbear uygulamasnn rcS betii ierisinden sistemin alnda balatlmas bu ilemi


otomatikletirecektir.
mtd aygt ile ilgili dmler aadaki gibi oluturulabilir, ardndan cihaz nfs zerinden alp
dosya sistemi 7. blmde gsterildii gibi NAND zerine yazlabilir.
mknod -m 666 ${ROOTFS}/dev/mtd0 c 90 0
mknod -m 666 ${ROOTFS}/dev/mtd1 c 90 2
mknod -m 666 ${ROOTFS}/dev/mtd2 c 90 4
mknod -m 666 ${ROOTFS}/dev/mtd3 c 90 6
mknod -m 666 ${ROOTFS}/dev/mtdblock0 b 31 0
mknod -m 666 ${ROOTFS}/dev/mtdblock1 b 31 1
mknod -m 666 ${ROOTFS}/dev/mtdblock2 b 31 2
mknod -m 666 ${ROOTFS}/dev/mtdblock3 b 31 3

5 Cihazn alma yntemleri:


5.1 FLASH (NOR) zerindeki nykleyici ile
alma durumu:
TI DM6446 EVM

269

Gml Linux

Sistem FLASH zerinden alacaksa CS2 SELECT pinlerinden jumper ile FLASH seilmeli
ve ilemci ayarlar ile al modunun deitirildii, kart zerinde S3 etiketli, kullanc
anahtarlar aadaki konumlara getirilmelidir.
1 ON
2 OFF
3 ON
4 ON
.... (ilgisiz)

Anahtarlarn hangi durumda ON olduklar anahtar klfna baklarak anlalabilir.


Sistem bu ekilde aldnda FLASHa nceden yazlm olan ubl ve u-boot sayesinde,
minicom ile cihaza balanldnda u-boot komut satrna dlebilir. Bundan sonra kernel
tftp zerinden ekilip, u-boot evresel deikenleri ile harddisk dosya sistemi veya NFS
dosya sistemi seilerek cihaz alabilir.

5.2 NAND zerindeki nykleyici ile alma


durumu:
Sistem NAND zerinden alacaksa CS2 SELECT pinlerinden jumper ile NAND seilmeli ve
kullanc anahtarlar aadaki konumlara getirilmelidir.
1 OFF
2 OFF
3 OFF
4 OFF
.... (ilgisiz)

Cihazn NAND flashnn bo olmas durumunda cihaz almayacaktr, ayn durum NOR
FLASH iinde geerlidir. Bu rnek iin cihazn NANDine ubl ve u-boot nykleyici iftinin
atlmas gereklidir. Bunun icin kullanc anahtarlarndan ilk ikisi ON konumuna alnarak cihaz
UART zerinden boot moduna alnmaldr. Bu durumda konak bilgisayardan cihaza minicom
ile balanldnda ekranda DaVinci yongas iindeki ROM hafzada saklanan, kullancnn
deitiremeyeci, ROM Boot Loader(RBL) tarafndan gnderilen BOOTME mesaj
grntlenecektir. nykleyici ifti seri port zerinden cihaza aadaki gibi yazlabilir.

TI DM6446 EVM

270

Gml Linux

wget -c http://sourceforge.net/projects/dvflashutils/files/DM644x/v2.00/DM644x_FlashAndBootUtils_2_00
tar zxvf DM644x_FlashAndBootUtils_2_00.tar.gz
cd DM644x_FlashAndBootUtils_2_00/DM644x/GNU
./sfh_DM644x.exe -erase -flashType NAND -targetType DM6446 -p /dev/ttyUSB0

./sfh_DM644x.exe -flash -flashType NAND -targetType DM6446 -p /dev/ttyUSB0 ubl/ubl_DM6446_NAND.bin u

u-boot olarak, deneme kartnn reticisi Spectrum Digital tarafndan salanan nand flash
paketinden kan u-boot kullanldnda(u-boot-567-nand.bin) temel iki sorunla
karlalmtr[2], kaynak koddan derlenen u-boot ile bu sorunlar yaanmamtr. ubl olarak
seri programlama paketiyle gelen dosya kullanlmaldr.
Sonrasnda ilk iki kullanc anahtar OFF yaplarak cihaz tftp ve nfs zerinden alabilir veya
ekirdek ve dosya sistemi imajlar kalc olarak NAND flash zerine yazlabilir. rnek al
senaryolar ksmnda gerekli u-boot evresel deikenlerinin deerleri verilmitir.

6 NAND Flash partisyon yaps:


Kernel tarafndan flashn yorumlanma ekli, yani hangi partisyon yapsnda grlecei Linux
kaynak kodu ierisinden sabit olarak ayarlanabilecei gibi ekirdee nykleyici tarafndan
geirilen argmanlar vastasyla dinamik olarak da yaplabilmektedir. Sabit partisyon iin
arch/arm/mach-davinci/board-dm644x-evm.c dosyasinda mtd_partition trndeki diziye yeni
elemanlar eklenebilir, var olanlar zerinde deiiklik yaplabilir. Varsaylan partisyon yapsn
belirleyen davinci_evm_nandflash_partition isimli dizi aadaki gibidir.

TI DM6446 EVM

271

Gml Linux

static struct mtd_partition davinci_evm_nandflash_partition[] = {


/* Bootloader layout depends on whose u-boot is installed, but we
* can hide all the details.
* - block 0 for u-boot environment ... in mainline u-boot
* - block 1 for UBL (plus up to four backup copies in blocks 2..5)
* - blocks 6...? for u-boot
* - blocks 16..23 for u-boot environment ... in TI's u-boot
*/
{
.name = "bootloader",
.offset = 0,
.size = SZ_256K + SZ_128K,
.mask_flags = MTD_WRITEABLE, /* force read-only */
},
/* Kernel */
{
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = SZ_4M,
.mask_flags = 0,
},
/* File system (older GIT kernels started this on the 5MB mark) */
{
.name = "filesystem",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
.mask_flags = 0,
}
/* A few blocks at end hold a flash BBT ... created by TI's CCS
* using flashwriter_nand.out, but ignored by TI's versions of
* Linux and u-boot. We boot faster by using them.
*/
};

ekirdek command line partition table parsing seenei seilerek derlenmise, mtdparts
komut satr seenei kullanlarak partisyon yaps dinamik olarak oluturulabilir. DM644x
EVM iin kullanmna rnek aadaki gibidir.

setenv bootargs 'console=ttyS0,115200n8 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 mtdparts=

mtd id bilgisine(davinci_nand) alan bir sistemde aadaki gibi ulalabilir, idye eklenen 0
aygt numarasdr.
root@dm6446-evm:~# ls /sys/bus/platform/drivers
davinci_emac dm9000 gen_nand i2c_davinci
davinci_nand edma gpio-keys serial8250

TI DM6446 EVM

272

Gml Linux

7 ekirdek ve Dosya Sisteminin NAND Flash


zerine yazlmas:
ekirdek u-boot nykleyicisi zerinden yazlmasna karn jffs2 dosya sistemi bu ekilde
yazldnda sorunlar yaandndan dosya sistemi Linux zerinden yazlmtr. ekirdein
yazlma aamalar aadadr. Rakamlar balarna 0x getirilmesede 16'lk tabanda
yorumlanmaktadr. u-boot nykleyicisinde "help nand" eklinde yardm alnabilir.
nand erase 80000 400000
tftpboot 0x82000000 uImage
nand write 0x82000000 80000 400000

Cihaz nfs zerinden aldktan sonra, ilgili mtdblock aygt jffs2 trnde mount edilip dosya
sistemi arivi iinde alabilir. rootfs.tar isimli bir dosya sistemi arivi nand flash zerine
aadaki gibi yazlabilir.
mkdir -p /mnt/nand
mount -t jffs2 /dev/mtdblock2 /mnt/nand
tar xvf rootfs.tar -C /mnt/nand
sync
umount /mnt/nand

Bir dier seenek Linux zerinde mtd-utils kullanmak olabilir.

8 rnek al senaryolar:
Gelitirme ve son alma durumu iin uygun olan iki rnek alma senaryosuna ilikin
nemli u-boot evresel deikenleri ve ilgili komutlar aadaki gibidir.

8.1 Cihazn tftp ve nfs dosya sistemi zerinden


almas:
setenv serverip 172.16.2.68
setenv ipaddr 172.16.2.12

setenv bootargs 'console=ttyS0,115200n8 noinitrd rw ip=dhcp root=/dev/nfs nfsroot=172.16.2.68:/home/


tftpboot 0x82000000 uImage
bootm 0x82000000

TI DM6446 EVM

273

Gml Linux

8.2 Cihazn NAND zerinden almas:


setenv bootcmd 'nboot 82000000 0 80000;bootm 0x82000000'

setenv bootargs 'console=ttyS0,115200n8 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 mtdparts=

[1]
mtd ve IDE ilgili baz anahtarlar asadaki gibi atanmtr.
CONFIG_MTD=y
CONFIG_MTD_PARTITIONS=y
CONFIG_MTD_CHAR=y
CONFIG_MTD_BLKDEVS=y
CONFIG_MTD_BLOCK=y
CONFIG_MTD_NAND=y
CONFIG_MTD_NAND_VERIFY_WRITE=y
CONFIG_MTD_NAND_IDS=y
CONFIG_MTD_NAND_DAVINCI=y

[2]
http://c6000.spectrumdigital.com/davincievm/revd/files/nand_flash_package.zip

Linux ekirdeinin balarken yapt ilk ilemlerden bir tanesi nykleyici tarafndan
kendisine geirilen donanm platformuyla ilgili makina numarasn, kendisinin destekledii
makina numaralar ile karlatrmaktr. nykleyici tarafndan yanl bir makina numaras
gnderildiinde cihazn al mesajlar aadaki gibi sonlanacaktr.
Starting kernel ...
Uncompressing Linux................... done, booting the kernel

Starting kernel mesaji nykleyicinin son, Uncompressing Linux ile balayan mesaj ise
ekirdein ilk mesajdr. ekirdek kodu ierisinde konsol(burada ttyS0) balatlmadan nce
alan kodlarla ile mesajlar grmek iin ekirdek CONFIG_DEBUG_LL anahtar set
edilerek derlenmelidir. Cihaz ekirdee, konsol argmanna ek olarak,
"earlyprintk=serial,ttyS0" argmanlar geirilerek balatldnda ekran kts aadaki gibi
olmaktadr. Desteklenen makina tipleri ekirdein konfigrasyonuna gre birden ok olabilir.

TI DM6446 EVM

274

Gml Linux

Starting kernel ...


Uncompressing Linux... done, booting the kernel.
Error: unrecognized/unsupported machine ID (r1 = 0x00000356).

Available machine support:


ID (hex) NAME
00000385 DaVinci DM644x EVM

NAND flash paketinden kan u-boot ekirdee DAVINCI_EVMin numaras 901 saysn
gndermek yerine DAVINCI_DVDPnin numaras olan 854 gndermektedir(al
ekrannda bu saylarn 16lk tabandaki karlklar grlmektedir). ekirdek kaynak kodu
ieresindeki mach-types.h dosyasinda aadaki deiiklik yaplarak bu sorun alabilir.
//#define MACH_TYPE_DAVINCI_DVDP 854
#define MACH_TYPE_DAVINCI_EVM 854
//#define MACH_TYPE_DAVINCI_EVM 901

Bir dier problem ise ekirdein FLASHdan hafzaya(RAM) ekildikten sonra balatlmas
srasnda dorulama hatasnn alnmasdr. Hata mesaj aadaki gibidir.
DaVinci EVM # bootm 0x82000000
## Booting image at 82000000 ...
Image Name: Linux-2.6.35
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1557300 Bytes = 1.5 MB
Load Address: 80008000
Entry Point: 80008000
Verifying Checksum ... Bad Data CRC
OK

[3]

serkan@serkanDesktop:~/garbage/temporary/davinci/DM644x_FlashAndBootUtils_2_00/DM644x/GNU$ ./sfh_DM64
---------------------------------------------------- TI Serial Flasher Host Program for DM644x
(C) 2010, Texas Instruments, Inc.
Ver. 1.67
-----------------------------------------------------

Flashing UBL and application image: ubl/ubl_DM6446_NAND.bin and u-boot.bin. the NAND flash device on
Attempting to connect to device /dev/ttyUSB1...
Press any key to end this program at any time.

TI DM6446 EVM

275

Gml Linux

Waiting for the DM644x...


BOOTME commmand received. Returning ACK and header...
ACK command sent. Waiting for BEGIN command...
Target: BEGIN
BEGIN commmand received. Sending CRC table...
100% [ ]
CRC table sent.
Waiting for DONE...
DONE received. Sending the UBL...
100% [ ]
UBL sent.
DONE received. UBL was accepted.
Waiting for SFT on the DM644x...
Target:BOOTUBL
BOOTUBL commmand received. Returning CMD and command...
CMD value sent. Waiting for DONE...
Target: DONE
DONE received. Command was accepted.
Sending the UBL image
Waiting for SENDIMG sequence...
ACK command sent. Waiting for BEGIN command...
BEGIN commmand received.
100% ]
Image data transmitted over UART.
Waiting for DONE...
DONE received. All bytes of image data received...
Target:Number of blocks needed for header and data: 0x0x00000001
Target:NAND block 0x00000001 is bad!!!
Target:NAND block 0x00000002 is bad!!!
Target:Attempting to start in block number 0x0x00000003.
Target:Magicnum: 0x0xA1ACED00
Target:Entrypoint: 0x0x00000100
Target:Numpage: 0x0x00000019
Target:Writing header and image data to Block 0x00000003, Page 0x00000000
Target:SENDING
Target: DONE
Sending the Application image
Waiting for SENDIMG sequence...
ACK command sent. Waiting for BEGIN command...
BEGIN commmand received.
100%]
Image data transmitted over UART.
Waiting for DONE...
DONE received. All bytes of image data received...
Target:Number of blocks needed for header and data: 0x0x0000000D
Target:NAND block 0x00000006 is bad!!!

TI DM6446 EVM

276

Gml Linux

Target:NAND block 0x00000007 is bad!!!


Target:Attempting to start in block number 0x0x00000008.
Target:Magicnum: 0x0x55424CBB
Target:Entrypoint: 0x0x81080000
Target:Numpage: 0x0x00000197
Target:Writing header and image data to Block 0x00000008, Page 0x00000000
Target: DONE
Operation completed successfully.

KAYNAKLAR
http://processors.wiki.ti.com/index.php/Serial_Boot_and_Flash_Loading_Utility
http://c6000.spectrumdigital.com/davincievm/revd/files/DaVinciEVM_FAQ.html
http://processors.wiki.ti.com/index.php/Kernel_-_Common_Problems_Booting_Linux
Uyar: Nande uboottan yazarken blocksizen kat olmaldr.

TI DM6446 EVM

277

Gml Linux

BeagleBoard

Bu blmde, cihaz zerinde herhangi bir alt seviye yazlm yok iken, cihazn nasl aldna
gz atacaz.
BeagleBoard seri port (UART Recovery) veya SD kart zerinden (MMC Recovery) alabilir.
Biz burada ikinci yntemi kullanacaz.
Cihaz aabilmek iin bir nykleyici (bootloader) iftine, Linux ekirdeine ve dosya
sistemine ihtiyacmz olacak. Cihaza enerji verildiinde, ilk olarak, ilemci yongasna retim
aamasnda kodlanan nykleyici (ROM Bootloader) almaktadr. Bu ilk nykleyiciyi, ilev
olarak, bilgisayarlarmzdaki BIOS yazlmna benzetebiliriz. Sonrasnda, bu nykleyici
tarafndan MLO (MMC Loader) isimli kk bir nykleyici yklenmekte, MLO ile de,
ekirdei yklemekten sorumlu ikinci nykleyici olan U-Boot yklenmektedir.
imdi srasyla nykleyici iftini, ekirdei ve dosya sistemini nasl oluturabileceimize
ksaca bakalm.
Elde edeceimiz nihai dosyalar bir dizinde toplamak, sonrasnda SD karta yazma ileminde,
iimizi kolaylatracaktr. Bu dizinin yol ifadesini DEV_DIR isimli bir evre deikeninde
tutalm.
export DEV_DIR=<Dizin Yol fadesi>

BeagleBoard

278

Gml Linux

Not: Biz derleme srecinde CodeSourcery gelitirme aralarn kullanacaz. Bu


aamada apraz derleyicinizin yol ifadesinin PATH evre deikeninde tanml
olduundan emin olunuz.
Ayrca baka bir derleyici kullanyorsanz, nykleyici ve ekirdek derleme
aamalarnda, derleyicinize ait neki (prefix) kullanmalsnz. CodeSourcery iin
derleyici neki arm-none-linux-gnueabi- eklindedir.

nykleyici iftinin Derlenmesi


U-Boot
U-Boot ekirdei yklemekten sorumlu daha gelimi bir nykleyicidir. U-Boot ayrca
kendisini yklemek iin kullanacamz MLO konunu da barndrmaktadr.
Aadaki gibi indirip, cihaz iin derleyebilirsiniz.
git clone git://git.denx.de/u-boot.git
cd u-boot
make CROSS_COMPILE=arm-none-linux-gnueabi- omap3_beagle_defconfig
make CROSS_COMPILE=arm-none-linux-gnueabicp MLO u-boot.img ${DEV_DIR}

letim Sistemi ekirdei


BeagleBoard iin ekirdek kodunu aadaki gibi indirip sonrasnda derleyebilirsiniz. Burada
2.6.32 versiyonunu derleyeceiz.
Not: TI firmas, C6Run projesini 3.X.X versiyonlu ekirdekler iin desteklememektedir.
3.X.X versiyonlu ekirdekler iin de projeyi derlemek mmkn olmasn karn ok fazla
sorunla karlalmaktadr, ayrca 2.6.36 versiyonunundan nceki bir versiyonu
semenizi neririz. 2.6.36 ve sonras iin C6Run kaynak kodunda baz deiiklikler
yapmak gerekmektedir.
git clone git://github.com/RobertCNelson/stable-kernel.git
./patch.sh
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
cd linux-stable/
git checkout v2.6.32
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- omap3_beagle_defconfig
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage
cp arch/arm/boot/uImage ${DEV_DIR}

BeagleBoard

279

Gml Linux

arch/arm/boot/ altnda U-Boot tarafndan yklenebilecek uImage ekirdek imaj oluacaktr.


Uyar: uImage dosyasn oluturabilmek iin sisteminizden mkimage uygulamas
bulunmaldr, aksi halde derleme srecinin sonunda aadaki gibi bir hata ile
karlalacaktr.
"mkimage" command not found - U-Boot images will not be built
mkimage uygulamas Debian tabanl datmlarda u-boot-tools paketinden kmaktadr.

Dosya Sistemi
Basit bir dosya sistemini BusyBox kullanarak oluturabileceiniz gibi hazr bir dosya sistemi
de kullanabilirsiniz. Biz burada dosya sistemini kendimiz oluturacaz.
Not: Hazr bir dosya sistemi kullanmak istiyorsanz, Angstrom datmn dosya
sistemini kullanabilirsiniz. Bu dosya sistemini, aadaki balanty kullanarak, internet
zerinden de kolaylkla oluturabilirsiniz.
http://narcissus.angstrom-distribution.org/
Bu durumda apraz derleyicinizin kulland standart C ktphanesi ile dosya sistemi
bnyesindekinin uyumluluunu kontrol etmelisiniz.
Dosya sistemini oluturmak iin temel olarak BusyBox kodunu derleyecek, asgari al
betiklerini, aygt dmlerini oluturacak ve apraz derleyicinin kulland standart C
ktphenesini dosya sistemine kopyalayacaz.
BusyBox kodunu aadaki gibi indirip derleyebilirsiniz.
export ROOTFS=<Dosya Sisteminin Saklanaca Dizin Yolu>
mkdir -p $ROOTFS
wget -c http://www.busybox.net/downloads/busybox-1.23.0.tar.bz2
tar xf busybox-1.23.0.tar.bz2
cd busybox-1.23.0
make defconfig
make CROSS_COMPILE=arm-none-linux-gnueabimake CROSS_COMPILE=arm-none-linux-gnueabi- CONFIG_PREFIX=${ROOTFS} install

Bu aamadan sonra ROOTFS evre deikeniyle gsterilen dizinde asgari dizin yaps
oluacaktr.
Gelitirme aralarnn iindeki lib dizinini hedef dosya sisteminde / altna kopyalayalm.
cp -a <Gelitirme Aralar Ana Dizini>/arm-none-linux-gnueabi/libc/lib ${ROOTFS}

BeagleBoard

280

Gml Linux

Al ve sonrasnda ihtiya duyulacak olan temel dizinleri aadaki gibi oluturabiliriz.


mkdir -p ${ROOTFS}/etc/init.d
mkdir -p ${ROOTFS}/dev
mkdir -p ${ROOTFS}/tmp
mkdir -p ${ROOTFS}/proc
mkdir -p ${ROOTFS}/home/root

Bu aamada gerekli al betiklerini oluturalm. inittab ve rcS olmak zere iki adet betie
ihtiyacmz olacak. BusyBox iinden kan rnek inittab dosyasn hedef dosya sistemimize
koplayalayp zerinde deiiklik yapabiliriz.
cp examples/inittab ${ROOTFS}/etc

Cihaza seri terminal zerinden ulaabilmek iin, inittab dosyasna aadaki satr eklenmeli
veya aklama eklinde olan benzer satr ayn forma dntrlmelidir.
::respawn:/sbin/getty -L ttyS0 115200 vt100

/etc/init.d altnda ise ierii aadaki gibi olan rcS betii oluturulmal ve gerekli izinleri
verilmelidir.
#!/bin/sh
mount -t proc proc /proc
mount -t devpts devpts /dev/pts

rcS iin aadaki gibi gerekli izinleri verebiliriz.


chmod 755 etc/init.d/rcS

Son olarak, /dev altndaki gerekli aygt dmleri ve pts dizinini aadaki gibi oluturabiliriz.

BeagleBoard

281

Gml Linux

mknod -m 666 ${ROOTFS}/dev/tty c 5 0


mknod -m 666 ${ROOTFS}/dev/console c 5 1
mknod -m 666 ${ROOTFS}/dev/tty1 c 4 1
mknod -m 666 ${ROOTFS}/dev/tty2 c 4 2
mknod -m 666 ${ROOTFS}/dev/tty3 c 4 3
mknod -m 666 ${ROOTFS}/dev/tty4 c 4 4
mknod -m 666 ${ROOTFS}/dev/random c 1 8
mknod -m 666 ${ROOTFS}/dev/urandom c 1 9
mknod -m 666 ${ROOTFS}/dev/ptmx c 5 2
mknod -m 666 ${ROOTFS}/dev/zero c 1 5
mknod -m 666 ${ROOTFS}/dev/null c 1 3
mkdir -p ${ROOTFS}/dev/pts

Bu aamada dosya sistemimizi hazrlam olduk, daha sonra SD kart zerine yazmak iin
dosya sistemimizi ariv halinde saklayabiliriz.
tar czvf rootfs.tgz -C ${ROOTFS} .
cp rootfs.tgz ${DEV_DIR}

SD Kartn Hazrlanmas
SD kart zerinde, biri FAT32 dieri ise ext3 eklinde biimlendirilecek iki adet blme
(partition) ihtiyacmz olacak. FAT32 blmne nykleyicileri ve ekirdei, ext3 blmne
ise dosya sistemini tayacaz. SD kart zerindeki blmlendirme ve biimlendirme ilerini,
komut satrndan elle yapmak yerine, Angstrom dosya sistemi bnyesindeki mkcard.txt
betiini kullanabiliriz. Betii aadaki gibi indirebilirsiniz.
wget -c http://downloads.angstrom-distribution.org/demo/beagleboard/mkcard.txt

Betie SD kartmza ilikin aygt dmn (device node) geirmeliyiz, sistemimiz iin rnek
aadaki gibidir:
./mkcard.txt /dev/mmcblk0

Not: SD kartnza ilikin aygt dmn fdisk -l ile sisteminizdeki blmleri inceleyerek
bulabilirsiniz. fdisk komutunu root haklaryla altrmalsnz.
Not: Betie daha yakndan baktmzda, srasyla SD kartn boyutunun hesaplandn,
sfdisk ile iki adet blmn oluturulduunu, sonrasnda bu blmlerin mkfs.vfat ve
mke2fs ile biimlendirildiini grmekteyiz. FAT blmnn bootable olduuna dikkat
ediniz.

BeagleBoard

282

Gml Linux

Bu aamadan sonra, nykleyici iftiyle ekirdei FAT blmne kopyalayabilir ve nceden


hazrladmz dosya sistemi arivini ext3 blmne aabiliriz.
cp ${DEV_DIR}/MLO /media/boot
cp ${DEV_DIR}/u-boot.img /media/boot
cp ${DEV_DIR}/uImage /media/boot
tar xf ${DEV_DIR}/rootfs.tgz -C /media/Angstrom

BeagleBoard

283

Gml Linux

BeagleBoneBlack
Beagle Bone Black son zamanlarda popler olan, 50$ mertebesindeki fiyat ve genileme
imkanlaryla ne kan bir gelitirme platformudur.

lemci

TI AM335x 1GHz ARM Cortex-A8

RAM

512MB DDR3

Storage

2GB beya 4GB 8-bit eMMC on-board flash

GPU

3D hzlandrc

NEON Destei

Var

USB Host

Var

USB Power

Var

Micro SD Kart

Var

Ethernet

Var

HDMI

Var

Konsol Kablosu

Yok, ayrca 3.3V FTDI - TTL dntrc kablosu alnmal

NAND Flash

Yok

BeagleBoneBlack

284

Gml Linux

Konsol Kablosu
BeagleBone-Black versiyonunun beraberinde konsol kablosu gelmemektedir
Bootloader seviyesinde konsol eriimi iin FTDI-TTL 3.3V USB dntrc kablosuna
ihtiya bulunmaktadr.

alma Dizinin Hazrlanmas


Bu dokmanda kullancnn ev dizini altnda, beagle alt dizini oluturulduu
varsaylmtr:
$ mkdir $HOME/beagle

Linux kernel kaynak kodlar beagle/kernel dizininde bulundurulacaktr


Buildroot kaynak kodlar, beagle/buildroot dizininde bulundurulacaktr

Buildroot BeagleBoneBlack Kernel


Buildroot ierisinde BeagleBoard iin hazrlanm ntanml kernel derleme
konfigrasyonu bulunmaktadr
Ancak Austos 2013 itibariyle, bu konfigrasyon ile alan BeagleBoardBlack kernel
imaj retmek mmkn deildir
Kernel derleme ileminin Buildroot dnda ayrca yaplmas gerekmektedir

BeagleBoneBlack

285

Gml Linux

Buildroot Kaynak Kodunun ndirilmesi


Buildroot kaynak kodlar git zerinden klonlanmaldr:
$ git clone git://git.buildroot.net/buildroot

Out-Of-Tree build yntemi ile $HOME/beagle dizini altnda build dizini ierisinde buildroot
ana alma dizinimizi oluturalm:
$ cd buildroot
$ make O=$HOME/beagle/build beaglebone_defconfig

lem bitiminde ana beagle alma dizininiz altnda, build dizini oluacaktr.
Bu noktadan sonra buildroot ile ilgili tm ilemlerinizi, build dizini altnda iken
gerekletirmelisiniz:
$ cd $HOME/beagle/build

Buildroot Konfigrasyonu
Buildroot ierisinden kan beaglebone_defconfig dosyasnda board ile ilgili temel ayarlar
mevcuttur.
Bununla birlikte aadaki temel balklar iin konfigrasyon zerinde dzenlemeler
yaplmaldr:
Kullanlacak toolchain seimi
Dosyalarn download edilecei dizinle ilgili dzenlemeler
lem sonucunda oluturulacak dosya sistemi tipi
/dev ynetimi iin tercih edilen yntem
Sistemde yer almas istenilen paketler
Bunlar temel dzenlemeler olup, ncelikle bu balklara deinilecektir.

Toolchain Seimi
Buildroot ierisinde toolchain seiminde External Toolchain kullanm nerilir. External
Toolchain kullanlaca belirtildikten sonra, toolchain tipi seilmelidir
Genelde 3 toolchain tipi bulunur:

BeagleBoneBlack

286

Gml Linux

Linaro Toolchain versiyonlar


Sourcery CodeBench Toolchain versiyonlar
Custom toolchain
BeagleBone Black iin Linaro toolchain gncel versiyonu seilmelidir. Sourcery CodeBench
toolchain'leri henz EABIhf ABI desteine sahip olmadndan bu menden
seilememektedir

Download Dizin Seimi


Buildroot ile alrken, zellikle birden fazla projede buildroot kullanldnda veya ayn
projede farkl konfigrasyonlarda build ilemleri gerektiinde, dosyalarn her seferinde
yeniden download edilmesi ilemleriyle vakit kaybetmemek iin, genel bir download dizini
belirtmekte fayda vardr.
rneimizde download dizini /opt/buildroot/downloads eklinde seilmi olup aadaki
komutlarla ncelikle bu dizini oluturabilirsiniz:
$ sudo mkdir -p /opt/buildroot/downloads
$ sudo chown -R $USER /opt/buildroot/downloads

Dosya Sistemi Seimi


Buildroot ile ilem sonunda cloop , cpio , cramsfs , ext2 , jffs2 , romfs , squashfs ,
tar ve ubifs dosya sistemi imajlar kartlabilir.

BeagleBone-Black zerinden NAND flash deil, eMMC bulunduundan ext4 gibi blok tabanl
aygtlar zerinde alan dosya sistemleri kullanlmaldr.

Kernel Kaynak Kodunun ndirilmesi


Kaynak kodlar git zerinden klonlanp, 3.8 branch'i checkout edilmelidir:
$ git clone git://github.com/beagleboard/kernel.git
$ cd kernel
$ git checkout 3.8
$ ./patch.sh
$ cp configs/beaglebone kernel/arch/arm/configs/beaglebone_defconfig

$ wget "http://arago-project.org/git/projects/?p=am33x-cm3.git;a=blob_plain;f=bin/am335x-pm-firmware.

BeagleBoneBlack

287

Gml Linux

Kernel Derleme
Derleme ilemi ncesinde oluan kernel dosyasn sktrma ve u-boot kernel balk
bilgilerini eklemek iin gerekli yardmc aralarn kurulu olduundan emin olunuz:
$ sudo apt-get install lzop u-boot-tools

Kernel derleme ilemini aadaki admlarla yapabilirsiniz (tftp sunucu ana dizini /srv/tftp
olduu varsaylmtr):
$ make ARCH=arm beaglebone_defconfig
$ make ARCH=arm \
CROSS_COMPILE=/home/demirten/beagle/build/host/usr/bin/arm-linux-gnueabihf- \
uImage dtbs -j4
$ make ARCH=arm \
CROSS_COMPILE=/home/demirten/beagle/build/host/usr/bin/arm-linux-gnueabihf- \
uImage-dtb.am335x-boneblack -j4
$ cp arch/arm/boot/uImage-dtb.am335x-boneblack /srv/tftp/uImage

Nfs-Root alma
Aadaki ekilde u-boot zerinden temel deikenleri ayarlayarak NFS zerinden boot
ilemini gerekletirebilirsiniz:
setenv serverip 192.168.7.1
setenv ipaddr 192.168.7.2
setenv console ttyO0,115200n8
setenv rootpath /home/demirten/beagle/build/target

setenv bootargs console=${console} root=/dev/nfs nfsroot=${serverip}:${rootpath},vers=3 rw ip=${ipadd


tftp 0x80200000 uImage-dtb.am335x-boneblack
bootm

uEnv.txt Kullanm
BeagleBoneBlack iin hazrlanan u-boot imaj, almaya baladnda uEnv.txt dosyas
bulmas halinde ierisindeki deikenleri import etmektedir. Bu metin dosyasn doru
ekilde dzenlemek suretiyle al ilemini u-boot imajn yeniden retmek zorunda
kalmakszn kalc olarak zelletirmeniz mmkndr.
rnek bir uEnv.txt dosyasnn ierii aada listelenmitir:

BeagleBoneBlack

288

Gml Linux

kernel_file=zImage
initrd_file=uInitrd
serverip=192.168.7.1
ipaddr=192.168.7.2
rootpath=/home/demirten/beagle/rootfs
console=ttyO0,115200n8
loadkernel=load mmc ${mmcdev}:${mmcpart} 080200000 ${kernel_file}
loadinitrd=load mmc ${mmcdev}:${mmcpart} 081000000 ${initrd_file}; setenv initrd_size ${filesize}
loadfdt=load mmc ${mmcdev}:${mmcpart} 0x815f0000 /dtbs/${fdtfile}

netargs=setenv bootargs console=${console} ${optargs} root=/dev/nfs nfsroot=${serverip}:${rootpath},v


#just zImage
boot_ftd=run loadkernel; run loadfdt
uenvcmd=run boot_ftd; run netargs; bootz 080200000 0x815f0000
#zImage + uInitrd: where uInitrd has to be generated on the running system.
#boot_ftd=run loadkernel; run loadinitrd; run loadfdt
#uenvcmd=run boot_ftd; run mmcargs; bootz 080200000 081000000:${initrd_size} 0x815f0000

BeagleBoneBlack

289

Gml Linux

EKLER
Bu blmde belirli bir ak ierisine girmeyen konulara deinilmektedir.

EKLER

290

Gml Linux

Seri Konsol Kullanm


Gml Linux projeleri zerinde alrken vazgeilmez unsurlardan biri seri konsol arayz
zerinden cihaznza erimek olacaktr.
Bunun iin gelitirme yaptnz bilgisayarda seri port bulunmas gereklidir. Ancak
gnmzde hemen hi bir bilgisayarda seri port k bulunmadndan, USB-Seri evirici
aparatlarna ihtiya duyulacaktr.

USB - Seri eviriciler


Piyasada bulabileceiniz hemen her usb seri dntrc Linux tarafndan otomatik olarak
tannr.
Herhangi bir usb eviriciyi bilgisayarnza taktktan sonra sisteminizde hangi dosya ad ile
tanndn anlamak iin dmesg komutu ile ekirdek mesajlarnn son blmne
bakabilirsiniz:
$ dmesg
[185805.857823] usb 1-1: New USB device found, idVendor=067b, idProduct=2303
[185805.857827] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[185805.857830] usb 1-1: Product: USB-Serial Controller
[185805.857832] usb 1-1: Manufacturer: Prolific Technology Inc.
[185805.858150] pl2303 1-1:1.0: pl2303 converter detected
[185805.858905] usb 1-1: pl2303 converter now attached to ttyUSB0

Yukardaki rnekte Prolific markal seri eviricinin ttyUSB0 ismiyle sisteme ilitirildii
belirtilmektedir. Sistemimiz tarafndan bu ekilde tannm olan seri eviriciyi, /dev/ttyUSB0
aygt dosyas zerinden kullanabiliriz.
Bilgisayarnza taklan usb seri eviriciler Linux tarafndan tanndktan sonra, kullandnz
datma gre devtmpfs veya udev zmlerinden biriyle /dev dizini altnda otomatik
olarak aygt dosyas doru major, minor ve aygt trn gsterecek ekilde oluturulur. Usb
seri eviricilerde isimlendirme ayn anda takl her bir eviri iin ttyUSB0 , ttyUSB1 ,
ttyUSBX eklinde yaplr.

Not: Usb seri evirici takl durumda ve bir uygulama tarafndan kullanmdayken
kartlp tekrar taklacak olursa, sistem tarafndan yeni bir numara ile isimlendirilip
kullanma sunulacaktr. dmesg komut ktsnda her zaman doru aygt ismini
grebilirsiniz.

Seri Konsol Kullanm

291

Gml Linux

Seri Aygtlar zerinde Eriim Yetkisi


Taklan usb evirici aygt dosyalarnn ntanml eriim yetkileri genellikle aadaki gibi olur:
$ ls -l /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 Jun 10 15:34 /dev/ttyUSB0

Yukardaki ktya bakarak unlar syleyebiliriz:


Bu bir karakter tabanl aygttr (bataki c harfi)
Dosya sahibi root kullancsdr ve kullancnn okuma ve yazma yetkileri bulunmaktadr
Dosyann grup sahibi dialout grubudur ve bu gruba dahil olan kullanclarn da okuma
ve yazma yetkileri bulunmaktadr
Geri kalan kullanclarn dosya zerinde herhangi bir okuma ve yazma hakk yoktur
Gelitirme yaptmz bilgisayarmz root kullancsyla deil de normal bir kullanc
hesabyla kullandmz dndmzde, eer dialout grubuna ye deil isek sistemimize
taktmz usb seri evirici cihaz zerinde okuma-yazma yapamayacamz grlmektedir.
Sorunun zm iin ya kendi kullancmz dialout grubuna ye yapmal ya da
sistemimizdeki udev kural dosyalarn dzenleyerek, usb seri eviricileri takldnda
dosyann eriim yetkilerinin kendi kullancmz ile eriebileceimiz bir mod ile ayarlanmasn
salamalyz.
Kolaylk asndan birinci yntem izlenmelidir. ncelikle id komutu ile kendi kullancmzn
hangi gruplara ye olduunu renelim:
$ id
uid=1000(demirten) gid=1000(demirten) groups=1000(demirten),27(sudo),29(audio)

Grld zere dialout grubuna yeliimiz bulunmuyor. Gruba kendimizi ye yapmak iin
Debian tabanl sistemlerde aduser uygulamasn kullanabiliriz:
$ sudo adduser demirten dialout
Adding user `demirten' to group `dialout' ...
Adding user demirten to group dialout
Done.

Grup yeliimiz gerekleti. Ancak grafik oturumlarnda grup yelik bilgilerini ilk login
ileminde kontrol edilip, sonrasnda alan tm srelere ayn bilgiler aktarlmaktadr. Bu
sebeple deiikliklerin etkin olmas iin grafik oturumundan k yaptktan sonra tekrar giri
yapmal veya sisteminizi yeniden balatmalsnz. Bu ilemin ardndan seri evirici cihaz
zerinde okuma - yazma yetkileriniz olacak ve rahatlkla alabileceksiniz.

Seri Konsol Kullanm

292

Gml Linux

Seri Konsol Uygulamalar


minicom
Olduka eski fakat halen i gren bu uygulamay aadaki gibi sisteminize kurabilirsiniz:
$ sudo apt-get install minicom

Uygulama ilk aldnda ntanml olarak /dev/modem gibi bir aygt dosyasn amaya
alr, dosyay bulamadnda sonlanr.
Bu sorunun stesinden gelmek iin uygulamay -s parametresi ile dorudan ayarlar
ekranyla aabilirsiniz:
$ minicom -s
+---------------------------------------------------+
| A - Serial Device : /dev/ttyUSB0 |
| B - Lockfile Location : /var/lock |
| C - Callin Program : |
| D - Callout Program : |
| E - Bps/Par/Bits : 115200 8N1 |
| F - Hardware Flow Control : No |
| G - Software Flow Control : No |
| |
| Change which setting? |
+---------------------------------------------------+
| Screen and keyboard |
| Save setup as dfl |
| Save setup as.. |
| Exit |
| Exit from Minicom |
+--------------------------+

A tuuna basarak aygt ismini, E tuu ile seri port hzn ayarlayabilirsiniz. Ardndan Exit ile
ktnzda ilgili seri portu kullanabiliyor olacaksnz.
Uygulama ana ekrannda iken CTRL-A + O ile konfigrasyon ekranna dnebilir, CTRL-A + X
ile uygulamadan kabilir, CTRL-A + W ile line wrap modunu aktifletirebilir, CTRL-A + Z ile
dier ksayollar hakknda yardm alabilirsiniz.
minicom uygulamas genellikle alkanlk edinmi kiilerce kullanlr. Yeni balayanlar iin
kullanlmas pek nerilmez.

gtkterm

Seri Konsol Kullanm

293

Gml Linux

Uygulamay aadaki gibi sisteminize kurabilirsiniz:


$ sudo apt-get install gtkterm

Uygulama aldktan sonra Configuration->Port mens zerinden aygt ismi ve hz


parametreleri aadaki gibi ayarlanabilir:

Yaplan ayarlar ntanml olarak kaydedip daha sonraki kullanmlarnz da


kolaylatrabilirsiniz.

screen
oklu terminal ynetimi iin kullanlan screen uygulamasna alkn iseniz seri port eriimi
iin de aadaki ekilde kullanabilirsiniz:
$ screen /dev/ttyUSB0 115200

Seri Konsol Kullanm

294

Gml Linux

TFTP Sunucu Kurulumu


Protokol
Trivial File Transfer Protocol, 1980 yl Ocak aynda ilk RFC dokman Karen R. Sollins
tarafndan yaynlanm olan, olduka eski bir protokoldr.
Gelitirildii zamanlarda temel hedefi a zerinden basit bir ekilde dosya almak ve dosya
gndermek idi. zellikle de sistemlerin a zerinden boot edebilmelerine salamak
amacyla, al srasnda ihtiya duyulan dosyalarn transfer edilebilmesi iin kullanlyordu.
Bugn halen daha bu amalar iin kullanlyor ve destekledii zelliklerde de temel anlamda
bir deiiklik yok. TFTP basite UDP/IP zerinden dosya indirmek ve dosya gndermek iin
kullanlr. Gelimi dosya transfer protokollerinde yer alan kimlik ve yetki denetimi, dosya
listeleme, silme, ismini deitirme vb. gibi hi bir ek fonksiyona sahip deildir. Ayrca iletim
katmannda TCP kullanan gelimi dosya transferi protokollerinden farkl olarak UDP
protokol zerinde altndan, dosyaya ait paketlerin kar tarafa doru gidip gitmediinin
kontrol veya paketler iin yeniden gnderimin denenmesi gibi zellikleri de
bulunmamaktadr. Bu kst nedeniyle internet veya geni alan alarndan ziyade, yerel
alarda kullanlmas daha uygundur.
Yukarda saylan tm bu olumsuz gibi grnen zelliklere karn, TFTP protokolnn ok
gl olduu bir yan vardr: basitlik
Protokoln gereklenmesi, zerinde iletim sistemi olmayan ortamlar iin dahi,
alternatiflerine gre olduka kolaydr ve bu zellii nedeniyle gml sistemlerde de geni
bir kullanm alan bulmutur.

Kurulum
Gml sistemler zerinde alrken bilgisayarnzda TFTP sunucu servisinin bulunmas
neredeyse zorunludur. Linux platformlarnda alan birden fazla TFTP sunucu uygulamas
mevcuttur. Debian tabanl bir datm kullanyorsanz, tftpd-hpa , tftpd veya atftpd
paketlerinden birini sisteminize kurabilirsiniz. Biz burada ftpd-hpa paketinin kullanlmasn
neriyoruz:
$ sudo apt-get install tftpd-hpa

TFTP Sunucu Kurulumu

295

Gml Linux

Kurulum sonras TFTP servisi 69 nolu UDP portunu dinlemeye balayacaktr. Dosyalar
TFTP sunucu zerinden dier sistemlere sunmaya balamak iin, ilgili dosyann kullanlan
TFTP sunucu uygulamasnn dinledii ana dizin veya altndaki bir dizine kopyalanmas ve
dosya izinlerinin herkes tarafndan okunmasna imkan verecek ekilde dzenlenmesi
gereklidir.
Paket kurulumu sonrasnda TFTP sunucu ana dizininin ne ekilde ayarlandn renmek
iin, /etc/default/tftpd-hpa dosyasnda yer alan TFTP_DIRECTORY deikeninin ne ekilde
ayarlanm olduuna bakabilirsiniz. Genellikle /var/lib/tftpboot veya /srv/tftp gibi
dizinler kullanlmakta olup, isterseniz bu dizini deitirip servisi yeniden balatabilirsiniz.
Kullanm kolayl salamas asndan, ilgili tftp ana dizininin sahibini kendi kullancnz
olacak ekilde deitirirseniz, sonrasnda bu dizine yapacanz kopyalamalarda root
olmanza gerek kalmayacaktr:
$ sudo chown -R $USER /var/lib/tftpboot

NOT: Tftp sunucu paket adlar ve ntanml olarak bakt ana dizinler kullanlan Linux
datmna gre farkllk gsterebilir.

Dosya Gnderme
Bazen gml Linux sisteminizden bir dosyay d ortama tamak istediinizde TFTP'nin
tek alternatif olduu durumlarla karlaabilirsiniz (sisteme dosyay yazabileceiniz herhangi
bir yazlabilir ortam taklamyor olabilir vb.) Bu durumda muhtemelen busybox ierisinde tftp
istemcisi de derlenmi olacandan, sistemde yer alan bir dosyay a zerindeki bir tftp
sunucusuna gnderebilirsiniz. Tftp istemci uygulamasnn genel kullanm:
# tftp
BusyBox v1.23.0 (2015-01-22 18:30:08 EET) multi-call binary.
Usage: tftp [OPTIONS] HOST [PORT]
Transfer a file from/to tftp server
-l FILE Local FILE
-r FILE Remote FILE
-g Get file
-p Put file
-b SIZE Transfer blocks of SIZE octets

eklinde olup, blm sisteminizdeki rnek.bin dosyasn 192.168.1.100 ip adresli TFTP


sunucusuna gndermek iin u ekilde bir komut kullanmanz gerekecektir:

TFTP Sunucu Kurulumu

296

Gml Linux

# tftp -l rnek.bin -p 192.168.1.100

Yukardaki komut doru olmasna ramen dosyay TFTP sunucunuza aktarma ileminde
hata alacaksnz. Dnen hata mesaj aklayc olmadndan asl problemin ne olduunun
anlalmas gtr.
Buradaki problem, TFTP sunucunun gvenlik nedeniyle kurulduu sisteme bir dosyann
gnderilebilmesi (upload) iin, n art olarak dosyann yazlaca dizinde, ayn isimle bir
dosya olmasn ve bu dosyann eriim yetkilerinin herkes tarafndan yazlabilir olacak ekilde
dzenlenmi olmasn gerektirmesidir.
Yani TFTP sunucuda mevcut olmayan bir dosyann, tftp istemcileri zerinden yklenmesi
mmkn deildir. ncelikle dosyay oluturup eriim yetkilerini dzenler isek, yukardaki
upload ilemi baaryla sonulanacaktr. Bunun iin TFTP sunucu sisteminde ilgili TFTP
sunucu ana dizininde aadaki komutlar altrmalyz:
$ touch rnek.bin
$ chmod 666 rnek.bin

Artk upload ilemimizi gerekletirebiliriz.


Yukarda anlattmz gvenlik senaryosunu devre d brakp, TFTP sunucunun kendi
bakt dizinde olmayan bir dosyay da oluturmasn salamak mmkndr. Bunun iin
tftpd-hpa uygulamasn balatrken -c veya --create parametresinin verilmi olmas

gerekir. Bunun iin /etc/default/tftpd-hpa dosyasndaki TFTPD_OPTIONS deikeninin


mevcut haline bu parametrenin eklenmesi yeterlidir:
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"

TFTP Sunucu Kurulumu

297

Gml Linux

NFS Sunucu Kurulumu


Network File System, Sun Microsystems tarafndan 1984 ylnda gelitirilmi, aa bal
sistemlerin a zerindeki NFS hizmeti veren sunculardaki paylamlar yerel diskleri gibi
kullanmasna olanak veren, RPC temelli datk dosya sistemi yapsdr.
Gml Linux sistemimiz zerinde gelitirme yaparken, cihazmz dorudan zerindeki
depolama biriminden deil de (NAND Flash, eMMC, MMC vb.) a zerindeki (genellikle
gelitirme yaptmz kendi bilgisayaramzdaki) bir NFS dosya paylam zerinden amak
ok kullanl ve zaman kazandrc bir uygulamadr.
Ayn zamanda daha nadir olmakla birlikte, sisteminizi dorudan NFS paylam zerinden
amasanz bile, sistem aldktan sonra bir NFS paylamn mount edip, onun zerinden
dosya paylamlar gerekletirmek de istenebilir.
Her iki senaryonun almas iin de gelitirme yaptnz bilgisayarda alan bir NFS
sunucu kurulumu gerekletirilmelidir.
Bunun iin Debian tabanl bir sistem kullanyorsanz, nfs-kernel-server paketini aadaki
gibi yklemelisiniz:
$ sudo apt-get install nfs-kernel-server

lem bitiminde NFS sunucunuz otomatik olarak alacaktr. Ancak bu noktada NFS
sunucumuz henz bilgisayarmzda yer alan hangi dizinleri a zerinde paylama amak
istediimizi bilmediinden, herhangi bir paylam salamayacaktr.
Ayn NFS sunucu zerinde, birden fazla dizini birbirinden farkl yetkilendirme ve
kstlamalarla a paylamna aabiliriz.
Herhangi bir dizini NFS sunucu zerinden paylatrmak iin, /etc/exports dosyasna
dizinle ilgili bir ayar satr girilmesi gereklidir. Bu dosyann sahibi root kullancs olduundan,
sudo mekanizmasyla herhangi bir editrle ap aadaki gibi bir satr ekleyebiliriz:

# /etc/exports
/home/demirten/beagle 192.168.100.0/24(rw,no_root_squash,no_subtree_check)

NFS sunucu zerindeki /etc/exports dosyasnda izin verdiiniz ip aralklarnn dndaki bir
sistem ilgili kaynaa ulamaya altnda, NFS sunucunuz tarafndan reddedilecektir.
Gml sisteminizde nfs mount ilemlerinde permission denied mesajlar alyorsanz, NFS

NFS Sunucu Kurulumu

298

Gml Linux

sunucunun alt bilgisayardaki /var/log/syslog dosyasnn sonlarnda aadakine


benzer hata mesajlar grnecektir:
rpc.mountd[1041]: refused mount request from 192.168.2.2 for
/home/training/beagle/target (/home/training/beagle/target):
unmatched host

Yukardaki gibi bir unmatched host log mesajn grdnzde, ilgili sistem iin de paylam
dizinini eriime amak istiyorsanz, /etc/exports dosyasndaki ilgili kurala ait IP/A
Maskesi blmn geniletmeniz veya tm IP adresleri iin eriim vermek istiyorsanz, *
zel karakterini kullanmalsnz.
/etc/exports dosyasnda deiiklik yaptktan sonra NFS servisini yeniden balatabilir:

$ sudo service nfs-kernel-server restart

veya exportfs komutuna -r parametresini vermek suretiyle halihazrda paylama ak


olmasna ramen bu rnekteki gibi paylamla ilgili herhangi bir ayar deimi dizinleri
yeniden paylatrmasn ve yeni ayarlarn geerli olmasn salayabiliriz:
$ sudo exportfs -r

NFS Sunucu - Mount Gecikme Problemi


Sunucu zerinde NFS protokolnn versiyon 4 ve yukars kullanldnda, datmlarda
kullanlan NFS sunucu yazlm uygulamalarnn ntanml konfigrasyonlar ile geleneksel
alma senaryolarnda, istemci tarafnda mount ilemi srasnda 15 saniyeye varan
gecikmeler yaanabilmektedir.
Debian Jessie, Ubuntu 12.04, Fedora 19 ve yeni versiyonlarnda bu sorun grnmektedir.
Benzer bir mount ilemlerinde gecikme durumu yayorsanz, sunucu tarafndaki log
dosyalarn inceleyerek (/var/log/syslog, /var/log/messages) aadakine benzer bir log
mesaj olup olmadn kontrol edebilirsiniz:
... RPC: AUTH_GSS upcall timed out

Bu mesaj Kerberos Authentication ileminin baarsz olduu ve zaman amna


uradn belirtiyor. A zerinde gvenli kimlik denetimi iin kullanlan Kerberos protokol
muhtemelen alma ortamnzda gerekli olmayacaktr. Bu ekilde yaplandrlm bir ada
bulunuyor olsanz dahi en azndan gml Linux sistemlerinizle Kerberos Authentication
NFS Sunucu Kurulumu

299

Gml Linux

mekanizmasn devreye alma ihtiyacnz olmayacaktr. Her defasnda mount ilemlerinde bu


gecikmeyi yaamak yerine, sorunu kknden zebilirsiniz. Her ne kadar problemin zm
iin NFS sunucu tarafnda NFS ile birlikte GSSD servisini altrma ynnde alternatifler
nerilmi olsa da, bu yntemler tm datmlarda ve paket versiyonlarnda ayn etkiyi
gstermediinden biz sorunu kknden zmeyi yeliyoruz. Bunun iin NFS sunucuyu
altrdnz Linux sisteminde, rpcsec_gss_krb5 kernel modlnn yklenmesini
engellemeniz (karalisteye almanz) gerekiyor. Bilgisayarnz her atnzda bu ayarn
devreye girmesi iin /etc/modprobe.d/blacklist-nfs-gss.conf gibi yeni bir dosya oluturup,
dosya ierisinde aadaki satrlar eklemeniz yeterlidir:
blacklist rpcsec_gss_krb5

Dosyay kaydedip sisteminizi yeniden balattktan sonra problemli senaryonun dzelmi


olduu grnecektir.

NFS Sunucu Kurulumu

300

Gml Linux

TI ilemcilerinde DSP kullanm


Bu blmde, TI (Texas Instruments) firmas tarafndan retilen heterojen ilemciler zerinde
DSP modlnn kullanmna bakacaz.
Heterojen ilemciler, tek bir yonga zerinde, genel amal bir ARM ilemciyle birlikte bir DSP
ekirdeini de barndrmaktadrlar. zellikle, video ve ses ileme uygulamalarnda, youn
tekrarlanan matematiksel ilemler DSP zerinde altrlarak performans art
hedeflenmektedir.
DSP zerinde kod altrmak iin birden fazla yntem bulunmaktadr. Biz bu blmde genel
bir fikir vermeyi amaladmzdan TI firmasnn, ARM Linux gelitiricileri iin hazrlad,
C6Run projesine ait gelitirme aralarn kullanacaz.
ncelemelerimizde, Hawkboard gml sistemini kullanacaz. Blm ierisinde srasyla,
C6Run projesinin kurulumuna ve Hawkboard hedefli uygulamalarn nasl derlenip hedef
sistemde altrldna bakacaz.

TI ilemcilerinde DSP kullanm

301

Gml Linux

C6Run
C6Run, TI tarafndan, ift ekirdekli (ARM+DSP) heterojen ilemcileri iin gelitirilmi bir
projedir. ARM Linux ve C6000 DSP ekirdei ieren sistemler hedeflenmektedir.
Projenin 2011 yl itibariyle gelitirilmesi sonlanmasna karn, proje indirilebilmekte ve
kullanlabilmektedir.
C6Run, DSP ile ilgili birok detay gizlediinden ve burada DSP kullanm hakknda genel bir
fikir vermeyi amaladmzdan bu projeyi kullanacaz.
Bu blmde ilk olarak, projeye ilikin aralar sistemimize nasl kuracamza, sonrasnda
DSP hedefli kodu nasl retebileceimize bakacaz.

C6Run Kurulumu
Kurulum ilemine ilk olarak kk bir balang paketi indirerek balayacaz. Projenin dier
bamllklarn, bir tanesi hari, bu paket zerinden salayacaz. Ayrca derlenmi bir
kernel dizinine de ihtiyacmz olacak. Balang paketini aadaki gibi indirebilirsiniz.

wget -c https://gforge.ti.com/gf/download/frsrelease/535/4556/%43%36%52%75%6e%5f%30%5f%39%37%5f%30%33

Uyar: ndirdiimiz paketin, 0.98 numaral bir st versiyonu bulunmasna veya SVN
zerinden son halinin indirilebilmesine karn, sonrasnda birok probleme neden
olmakta o yzden 0.97 numaral bu versiyonu kullanmanz neriyoruz.
Paketi ap, DSP derleyicisi hari dier bamllklar aadaki gibi sisteminize ykleyip
kurabilirsiniz. Bu amala ana dizin iindeki Makefile dosyasnda get_component isimli bir
hedef bulunmaktadr.
tar xf C6Run_0_98_03_03.tar.gz
cd C6Run_0_98_03_03
make get_components

DSP'ye ilikin aralar ise sistemimize elle kurmalyz. Bu aralara ilikin kurulum dosyasn
aadaki balantdan indirebilirsiniz. 7.2.2 versiyonunu seiniz.
http://software-dl.ti.com/codegen/non-esd/downloads/download.htm

C6Run

302

Gml Linux

Not: Bu ilem ncesinde TI yelii gerektirmektedir, TI'n sitesinden cretsiz olarak ye


olabilirsiniz.
ndirme ilemi sonucunda elde ettiiniz ti_cgt_c6000_7.2.2_setup_linux_x86.bin kurulum
dosyas ile DSP'ye ilikin aralar home dizinin altnda oluturacanz
toolchains/TI_CGT_C6000_7.2.2 isimli bir dizin altna kurabilirsiniz. Neden byle bir dizin
yolu setiimize birazdan bakacaz.
Gerekli bamllklar edindikten sonra, ana dizindeki Rules.mak ve
platforms/hawkboard/platform.mak dosyalarndaki baz deikenere uygun deerleri
geirmeliyiz.
Rules.mak dosyasnda, DSP ve ARM aralarnn ngrlen yol ve nek ifadeleri aadaki
gibidir.
CODEGEN_INSTALL_DIR ?= $(HOME)/toolchains/TI_CGT_C6000_7.2.2
ARM_TOOLCHAIN_PATH ?= $(HOME)/toolchains/arm-2009q1
ARM_TOOLCHAIN_PREFIX ?= arm-none-linux-gnueabi-

DSP veya ARM derleyicinizi baka bir yere kurduysanz veya baka bir apraz derleyici
kullanyorsanz, bu deikenlere uygun deerleri vermelisiniz.
platforms/hawkboard/platform.mak dosyasnda ise derlenmi ekirdek dizinini gstermeliyiz,
ngrlen deeri aadaki gibidir.
LINUXKERNEL_INSTALL_DIR ?= $(HOME)/workdir/hawkboard/kernel/

Kendi sisteminize uygun olarak bu deikenleri deitirebilirsiniz.


Not: Board Recovery blmnde, Hawkboard iin ekirdei nasl derleyebileceiniz
bulunmaktadr.
Bu aamadan sonra, projeyi Hawkboard hedefli konfigr edebilir ve gerekli aralar
aadaki gibi derleyebiliriz.
make hawkboard_config
make everything

Bu sre sonunda sisteminizde gerekli ktphaneler kurulmu olmaldr. Bu aamadan


sonra proje dizinindeki rnekleri derleyip, rneklerle beraber gerekli modlleri bir dizinde
sakalayabiliriz. ncesinde C6Run ana dizindeki bin dizinini PATH evre deikenine
eklemeliyiz.

C6Run

303

Gml Linux

export PATH=$PATH:$(pwd)/bin
make examples
make INSTALL_DIR=/tmp/hawkdps install_programs

Hedef platform iin derlenmi rneklerle beraber, gerekli ekirdek modlleri ve betiklerler
aadaki gibi olacaktr.
# ls /tmp/hawkdps/
cmemk.ko dsplinkk.ko examples loadmodules.sh test unloadmodules.sh

Son olarak, DSP modln kullanan kendi uygulamalarmz nasl derleyebileceimize


bakalm.

DSP Hedefli Uygulamalarn Derlenmesi


C6Run aralar ile, DSP modln farkl ekilde kullanan, 2 tr uygulama oluturmak
mmkndr. Birinci durumda uygulamann tamam DSP modlnde alrken, ikinci
durumda yalnz istenilen kritik bir kodu DSP tarafnda altrmak mmkndr. Her iki
durumda da uygulama doal bir ARM uygulamas olarak gzkmekte, DSP modlnn
balatlmas ve program kodunun yklenmesi isel olarak yaplmaktadr. Tm giri/k
ilemleri ise DSP modlnden ARM tarafna ynlendirilmektedir.
Uygulamalarmz derlemek iin kullanacamz nyz aralar projenin ana dizini altndaki
bin dizininde yer almaktadr. Kullanacamz aralar aadaki gibidir:
c6runapp-cc
c6runlib-cc
c6runlib-ar
Bash betii olarak yazlm bu nyz aralar, arka planda TI C6000 derleyicisi cl6x'i, apraz
ARM derleyicisini, dier gerekli aralar kullamakta ve bize gcc derleyicisine olduka benzer
bir arayz sunmaktadr.
imdi srasyla, uygulamann tmnn ya da yalnz bir ksmnn DSP tarafnda altrlaca
uygulamalar nasl derleyebileceimize bakalm.

Tm Uygulamann DSP Hedefli Derlenmesi


Aadaki rnek uygulamay measure.c adyla saklayp derleyebilirsiniz.

C6Run

304

Gml Linux

#include <stdio.h>
#include <time.h>
#include <math.h>
#if defined(_TMS320C6X)
#elif defined(__GNUC__)
#include <sys/time.h>
#endif
#define N 1000000
typedef unsigned long long timestamp_t;
int i;
timestamp_t t0, t1;
float secs;
double d;
static timestamp_t get_timestamp () {
#if defined(_TMS320C6X)
return (timestamp_t) clock();
#elif defined(__GNUC__)
struct timeval now;
gettimeofday (&now, NULL);
return now.tv_usec + (timestamp_t)now.tv_sec * 1000000;
#endif
}
void bench() {
t0 = get_timestamp();
for (i = 0; i < N; ++i) {
d = sin(i) * cos(i);
}
t1 = get_timestamp();
secs = (t1 - t0) / 1000000.0L;
printf("%d times sin(i) * cos(i) sec: %f\n", N, secs);
}
int main() {
bench();
return 0;
}

c6runapp-cc -omeasure_dsp measure.c

Ayn uygulamay ayrca ARM hedefli derleyerek, bench fonskiyonunda geen sreleri
karlatrabilirsiniz. Kullandmz apraz derleyici iin derleme ilemi aadaki gibi
olacaktr.

C6Run

305

Gml Linux

arm-none-linux-gnueabi-gcc -omeasure_arm measure.c -lm

Not: ARM ve DSP modllerinde sistem zamannn farkl ekilde alndna ve kodda bu
blmlerin _TMS320C6X ve __GNUC__ makrolaryla birbirinden ayrldna dikkat ediniz.

Kritik Kodun DSP Hedefli Derlenmesi


DSP tarafnda alacak kod, ilk nce C6000 obje koduna, ardndan linklenebilecek ARM
hedefli bir ktphaneye dntrlmelidir. Srasyla bu ilemler iin c6runlib-cc ve c6runlib-ar
aralarn kullanacaz.
Bir nceki rneimizdeki bench fonksiyonunu bir ktphane fonksiyonu olarak derleyelim.
Aadaki rnek kodlar srasyla libmeasure.c ve main.c olarak kaydedebilirsiniz.

C6Run

306

Gml Linux

#include <stdio.h>
#include <time.h>
#include <math.h>
#if defined(_TMS320C6X)
#elif defined(__GNUC__)
#include <sys/time.h>
#endif
#define N 1000000
typedef unsigned long long timestamp_t;
int i;
timestamp_t t0, t1;
float secs;
double d;
static timestamp_t get_timestamp () {
#if defined(_TMS320C6X)
return (timestamp_t) clock();
#elif defined(__GNUC__)
struct timeval now;
gettimeofday (&now, NULL);
return now.tv_usec + (timestamp_t)now.tv_sec * 1000000;
#endif
}
void bench() {
t0 = get_timestamp();
for (i = 0; i < N; ++i) {
d = sin(i) * cos(i);
}
t1 = get_timestamp();
secs = (t1 - t0) / 1000000.0L;
printf("%d times sin(i) * cos(i) sec: %f\n", N, secs);
}

void bench();
int main() {
bench();
return 0;
}

bench kodunun bulunduu kaynak kodu, aadaki gibi bir statik ktphaneye
dntrdkten sonra uygulamamza linkleyebiliriz.

C6Run

307

Gml Linux

c6runlib-cc -c -olibmeasure.o libmeasure.c


c6runlib-ar rcs libmeasure.a libmeasure.o
arm-none-linux-gnueabi-gcc -c main.c
arm-none-linux-gnueabi-gcc -omeasure_dsp main.o libmeasure.a

C6Run

308

Gml Linux

DSP Testi
Bu blmde daha nce derlediimiz rnek uygulamalar nasl altracamza bakacaz.
Daha nce C6Run iindeki rnekleri derleyip bir dizinde saklamtk. Bu dizinin iereini
tekrar hatrlayalm.
# ls /tmp/examples/
cmemk.ko dsplinkk.ko examples loadmodules.sh test unloadmodules.sh

2 adet ekirdek modlnn, rnekleri ieren examples dizinin, ayrca modlleri yklemek ve
kaldrmak iin, loadmodules.sh, unloadmodules.sh isimli betiklerin bulunduunu
grmekteyiz.
C6Run modllerinin bellein neresini kullanacaklar nem tamaktadr. Modllerin bellekte
kullanacaklar alann balang ve biti adresleri derleme zamannda deitirilebilei gibi
ykleme zamannda da belirtilebilir. Biz burada ngrlen deerleri kullanacaz.
loadmodules.h dosyasnda bu adresler aadaki gibi gsterilmektedir.
DSP_REGION_START_ADDR="0xC2000000"
DSP_REGION_END_ADDR="0xC4000000"

Hawkboard iin ekirdek kodu ise 0xC000000 adresinden balamaktadr, ekirdein DSP
modlleri iin ayrlm alana tamasn nlemek iin ekirdei kulland alan, modllerin
balang adresi olan, 0xC2000000 adresinde sonlandrmalyz.
Bu durumda ekirdek 0xC000000 ile 0xC2000000 arasnda bulunmaldr, ekirdek iin
ayrlan alan 0x2000000 yani 32M olmaldr. ekirdein bu blgeyi kullanmasn salamak
iin ekirdee mem=32M boot argman geirilmelidir. Bu ilem U-Boot zerinden aadaki
gibi yaplabilir.

setenv bootargs "console=ttyS2,115200 mem=32M init=/bin/sh root=/dev/mtdbloc

loadmodules.sh ile gerekli modlleri ykledikten sonra, proje iinden kan ya da kendi
derlediiniz test uygulamalarnz altrabilirsiniz.
ARM ve DSP hedefli derlenen FFT uygulamalar iin elde ettiimiz sonular aadaki
gibidir.

DSP Testi

309

Gml Linux

# ./cfft_arm
N=16,nTimes=100: 0.007027 s
N=32,nTimes=100: 0.017506 s
N=64,nTimes=100: 0.04224 s
N=128,nTimes=100: 0.098568 s
N=256,nTimes=100: 0.226512 s
N=512,nTimes=100: 0.510898 s
N=1024,nTimes=100: 1.15786 s
N=2048,nTimes=100: 2.61276 s
N=4096,nTimes=100: 5.8848 s
N=8192,nTimes=100: 12.8365 s
N=16384,nTimes=100: 27.6982 s
# ./cfft_dsp
N=16,nTimes=100: 0.056423 s
N=32,nTimes=100: 0.055537 s
N=64,nTimes=100: 0.058968 s
N=128,nTimes=100: 0.059059 s
N=256,nTimes=100: 0.06587 s
N=512,nTimes=100: 0.080403 s
N=1024,nTimes=100: 0.107609 s
N=2048,nTimes=100: 0.168634 s
N=4096,nTimes=100: 0.302576 s
N=8192,nTimes=100: 0.619787 s
N=16384,nTimes=100: 1.33111 s

Kullandnz DSP modlnn sabit (fixed point) ya da kayan noktal (floating point) oluuna
gre bu sonular deiecektir. Ayrca ARM tarafndan DSP modlne yaplan arlar
maliyetli olduundan mmkn olduunca az ar yaparak, ar bana daha fazla ilem
yapmak daha uygun olacaktr.

DSP Testi

310

Gml Linux

Ubuntu Sanal Makine Performans


zellikle dk performansl host sistemlerde Gml Linux eitimlerimizde de
kullandmz Ubuntu sanal makinesinin Virtualbox veya Vmware altndaki performansn
artrmak iin aadaki ilemleri yapabilirsiniz.
ncelikle sanal makinemizde gnome-session-fallback paketi kurulu deil ise bunu
kurmalsnz:
$ sudo apt-get install gnome-session-fallback

Ardndan sistemden k yapnz.


Yukardaki paket kurulduktan sonra, giri ekrannda parola yazlan bloun sa st kesinde
Ubuntu logosunu greceksiniz:

Bu blme tklarak alan seenekler arasndan GNOME Flashback (Metacity) deerini


seiniz.
Parolanz yazp giri yaptnzda GUI performansnn daha iyi olaca eski nesil bir arayz
ile sistem alacaktr.

Ubuntu Sanal Makine Performans

311

Вам также может понравиться