41
Linux Makina Dili NASIL Yazan: Konstantin Boldyshev Linux Assembly (B1) <konst (at) linuxassembly.org> Yazan: Francois-Rene Rideau Tunes project (B2) <fare (at) tunes.org> Çeviren: guz Yarımtepe <oguzy (at) comu.edu.tr> Mart 2006 Özet Bu, Linux Sembolik Makina Dili NASIL, sürüm 0.6g belgesidir. Bu belge özgür programlama araçları kullanarak, genelde IA–32 (i386) platformunda, Linux i¸ sletim sistemi için veya Linux i¸ sletim sistemi kaynaklı, sembolik makina dilinde nasil programlama yapılaca˘ gını anlatmaktadır. ˙ Içerik di˘ ger yazılım veya donanıma uygulanamayabilir. Konu Ba¸ slıkları 1. Giri ¸ s ..................................................... 5 1.1. Belgenin son sürümü ......................................... 5 1.2. Önsöz ................................................. 5 1.3. Katkıda Bulunanlar .......................................... 5 1.4. Tercümeler .............................................. 5 2. Sembolik makina diline ihtiyacınız var mı? ................................ 6 2.1. Artılar ve Eksiler ........................................... 6 2.1.1. Sembolik makina dilinin (Assembly) avantajları ........................ 6 2.1.2. Sembolik makina dilinin (Assembly) dezavantajları ...................... 6 2.1.3. De ˘ gerlendirme ......................................... 7 2.2. Sembolik makina dili nasıl kullanılmaz ................................ 7 2.2.1. Ba¸ sarılı kodu gerçeklemek için adımlar ............................ 8 2.2.2. Eniyileme yapan derleyiciler ile dilleri ............................. 8 2.2.3. Kodunuzu hızlandıracak için genel adımlar .......................... 8 2.2.4. Derleyicinin üretti ˘ gi kodu incelemek .............................. 8 2.3. Linux ve Assembly .......................................... 9 3. Assemblers ................................................. 9 3.1. GCC Satıriçi Sembolik Makina Dili .................................. 9 3.1.1. GCC’yi nereden bulabiliriz ................................... 9 3.1.2. GCC satır içi sembolik makina dili için belgeler nerede ................... 10 3.1.3. GCC’yi uygun satıriçi sembolik makina kodu üretmesi için ça ˘ gırmak ........... 10 3.1.4. Makro deste ˘ gi ........................................ 11 3.2. GAS ................................................. 11 3.2.1. Nereden Bulurum ...................................... 11

Assembly Howto

Embed Size (px)

Citation preview

  • Linux Makina Dili NASIL

    Yazan:Konstantin Boldyshev

    Linux Assembly (B1)

    Yazan:Francois-Rene Rideau

    Tunes project (B2)

    eviren:Oguz Yarmtepe

    Mart 2006

    zet

    Bu, Linux Sembolik Makina Dili NASIL, srm 0.6g belgesidir. Bu belge zgr programlama aralarkullanarak, genelde IA32 (i386) platformunda, Linux isletim sistemi iin veya Linux isletim sistemikaynakl, sembolik makina dilinde nasil programlama yaplacagn anlatmaktadr. Ierik di ger yazlmveya donanma uygulanamayabilir.

    Konu Baslklar

    1. Giri s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.1. Belgenin son srm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.2. nsz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.3. Katkda Bulunanlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.4. Tercmeler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    2. Sembolik makina diline ihtiyacnz var m? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.1. Artlar ve Eksiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

    2.1.1. Sembolik makina dilinin (Assembly) avantajlar . . . . . . . . . . . . . . . . . . . . . . . . 62.1.2. Sembolik makina dilinin (Assembly) dezavantajlar . . . . . . . . . . . . . . . . . . . . . . 62.1.3. Degerlendirme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

    2.2. Sembolik makina dili nasl kullanlmaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.2.1. Basarl kodu gereklemek iin admlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.2.2. Eniyileme yapan derleyiciler ile dilleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.2.3. Kodunuzu hzlandracak iin genel admlar . . . . . . . . . . . . . . . . . . . . . . . . . . 82.2.4. Derleyicinin retti gi kodu incelemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    2.3. Linux ve Assembly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93. Assemblers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    3.1. GCC Satrii Sembolik Makina Dili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93.1.1. GCC'yi nereden bulabiliriz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93.1.2. GCC satr ii sembolik makina dili iin belgeler nerede . . . . . . . . . . . . . . . . . . . 103.1.3. GCC'yi uygun satrii sembolik makina kodu retmesi iin agrmak . . . . . . . . . . . 103.1.4. Makro destegi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    3.2. GAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.2.1. Nereden Bulurum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

  • Linux Makina Dili NASIL

    3.2.2. Su AT&T szdizimi de ne ola ki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.2.3. Intel szdizimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.2.4. 16 bitlik kip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133.2.5. Makro destegi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    3.3. NASM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133.3.1. NASM' nereden bulurum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133.3.2. Ne yapar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    3.4. Di ger Sembolik Makina eviricileri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.4.1. AS86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

    3.4.1.1. Belgeleri nerden bulurum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.4.1.2. AS86'nn BCC ile kullanm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

    3.4.2. YASM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.4.3. FASM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153.4.4. OSIMPA (SHASM) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153.4.5. AASM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153.4.6. TDASM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153.4.7. HLA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153.4.8. TALC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163.4.9. zgr Pascal (Free Pascal) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163.4.10. Win32Forth derleyicisi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163.4.11. Terse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163.4.12. zgr olmayan ve/veya 32bit olmayan x86 eviricileri . . . . . . . . . . . . . . . . . . 17

    4. Dsk seviye programlama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174.1. Harici Filtreler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

    4.1.1. CPP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174.1.2. M4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184.1.3. Kendi ltreleriniz ile makroprogramlama . . . . . . . . . . . . . . . . . . . . . . . . . . 18

    4.2. Metaprogramlama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184.2.1. Derleyicilerdeki arka ular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194.2.2. NewJersey makina kodu ara seti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194.2.3. TUNES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

    5. a gr Uzlasmlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195.1. Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

    5.1.1. GCC'ye ilintileme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195.1.2. ELF ve a.out arasndaki sorunlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195.1.3. Dogrudan Linux sistem agrlar (syscalls) . . . . . . . . . . . . . . . . . . . . . . . . . 205.1.4. Linux altnda donanmsal G/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225.1.5. Linux/i386'daki 16 bitlik srclere erisim . . . . . . . . . . . . . . . . . . . . . . . . . . 22

    5.2. DOS ve Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235.3. Kendi isletim sisteminiz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

    6. Hzl baslang . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236.1. Giris . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

    6.1.1. Ihtiyacnz olan aralar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246.2. Merhaba Dnyal :) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

    6.2.1. Yerlesim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246.2.2. NASM (hello.asm) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246.2.3. GAS (hello.S) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

    6.3. alistrlabilir bir kod retmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256.3.1. Nesne kodu retimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256.3.2. alstrlabilir retmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

    http://belgeler.org Linux Kitapl g 2 / 41

  • Linux Makina Dili NASIL

    6.4. MIPS rnegi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267. zkaynaklar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

    7.1. Siteler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277.2. Haber gruplar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277.3. Listeler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

    8. Ska Sorulan Sorular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279. Ekler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    9.1. Tarihe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339.2. Tesekkr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    GNU Free Documentation License . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

    http://belgeler.org Linux Kitapl g 3 / 41

  • Linux Makina Dili NASIL

    Telif Hakk 19992006 Konstantin BoldyshevTelif Hakk 19961999 FrancoisRene Rideau

    Yasal AklamalarBu belgenin evirisinin, Linux Sembolik Makina Dili Nasl 1.1 srmnn telif hakk 2005 OguzYarmtepe'ye aittir. Bu belgeyi, Free Software Foundation tarafndan yaynlanms bulunanGNUzgr Bel-geleme Lisansnn 1.1 ya da daha sonraki srmnn kosullarna bagl kalarak kopyalayabilir, dagtabilirve/veya degistirebilirsiniz. Bu Lisansn bir kopyasn GNU Free Documentation License (sayfa: 34) baslklblmde bulabilirsiniz.

    BU BELGE CRETSIZ OLARAK RUHSATLANDI GI IIN, IERDI GI BILGILER IIN ILGILI KA-NUNLARIN IZIN VERDI GI LDE HERHANGI BIR GARANTI VERILMEMEKTEDIR. AKSI YAZILIOLARAK BELIRTILMEDI GI MDDETE TELIF HAKKI SAHIPLERI VE/VEYA BA SKA SAHISLAR BEL-GEYI OLDU GU GIBI, A SIKAR VEYA ZIMNEN, SATILABILIRLI GI VEYA HERHANGI BIR AMACAUYGUNLU GU DA DAHIL OLMAK ZERE HIBIR GARANTI VERMEKSIZIN DA GITMAKTADIRLAR.BILGININ KALITESI ILE ILGILI TM SORUNLAR SIZE AITTIR. HERHANGI BIR HATALI BILGIDENDOLAYI DO GABILECEK OLAN BTN SERVIS, TAMIR VEYA DZELTME MASRAFLARI SIZE AITTIR.

    ILGILI KANUNUN ICBAR ETTI GI DURUMLAR VEYA YAZILI ANLA SMA HARICINDE HERHANGI BIRSEKILDE TELIF HAKKI SAHIBI VEYA YUKARIDA IZIN VERILDI GI SEKILDE BELGEYI DE GI STIRENVEYA YENIDEN DA GITAN HERHANGI BIR KI SI, BILGININ KULLANIMI VEYA KULLANILAMAMASI(VEYA VERI KAYBI OLU SMASI, VERININ YANLI S HALEGELMESI, SIZIN VEYANC SAHISLARINZARARA U GRAMASI VEYA BILGILERIN BA SKA BILGILERLE UYUMSUZ OLMASI) YZNDENOLU SAN GENEL, ZEL, DO GRUDAN YA DA DOLAYLI HERHANGI BIR ZARARDAN, BYLE BIRTAZMINAT TALEBI TELIF HAKKI SAHIBI VEYA ILGILI KI SIYE BILDIRILMI S OLSA DAHI, SORUMLUDE GILDIR.

    Tm telif haklar aksi zellikle belirtilmedi gi srece sahibine aittir. Belge iinde geen herhangi bir terim,bir ticari isim ya da kuruma itibar kazandrma olarak alglanmamaldr. Bir rn ya da markann kullanlmsolmas ona onay verildi gi anlamnda grlmemelidir.

    http://belgeler.org Linux Kitapl g 4 / 41

  • Linux Makina Dili NASIL

    1. Giri s

    Bilgi

    Eger NASIL'lara yabanc degilseniz veya sadece buradaki sembolik makina diliyle ilgisiz vr zvrlar oku-maktan nefret ediyorsanz bu blm geebilirsiniz.

    1.1. Belgenin son srmBu belgenin en son resmi srmleri Linux Sembolik Makina Dili (Linux Assembly)(B5) ve LDP(B6) sitelerindenelde edilebilir.

    1.2. nszBu belge, zellikle Linux isletim sistemi altnda, 32bit x86 sembolik makina dili kullanarak zgr yazlm altndaprogramlayan ya da programlamak isteyenlerin sorularna cevap olmay amalamaktadr. Pek ok yerdeEvrenselKaynak Konumlayclar (Universal Resource Locators URL) baz yazlm veya belge depolar iin verilmistir. Bubelge ayrca, temel amac olmamakla beraber, zgr olmayan (nonfree), x86 tabanl olmayan (nonx86) veya32 bit olmayan (non32bit) derleyicilerle ilgili di ger belgelere de isaret etmektedir. Ayn zamanda, dogrudansembolik makina diliyle ilgili olmayan platforma bagl meselelerde, favori platformunuzda (artk her ne ise) pro-gramlama yapmak iin SSS (Ska Sorulan Sorular) ve belgeler olduguna da dikkat edin.

    Sembolik makina dili ile programlamak temel ilgi alan, C derleyicilerinin ihtiya duyulan ifadeleri saglamaktayetersiz kald g (performans olduka nadir bir meseledir), isletim sisteminin sindirim sistemi, yorumlayc, der-leyici ve oyunlar oldugundan, bu tr yazlmlar gelistirmek zerine odaklanyoruz.

    Eger zgr yazlmn(B7) ne oldugunu bilmiyorsanz, pekok yazlmda kullanlan ve pekogunun lisansnnmodeli olan, GNU Genel Kamu Lisans(B8)'n (GPL veya copyleft) ltfen dikkatle okuyunuz. Genelde adCOPYING (veyaCOPYING.LIB) olan bir dosya ierisinde gelmektedir. zgr Yazlm Vakf(B9) (FSF) tarafndanyaynlanms eserler de size yardmc olabilir. zellikler, zgr yazlmn en ilgi ekici zelli gi basvurabileceginizveya dzeltebileceginiz veya hatta bazen dn alabileceginiz kaynak koduyla gelmesidir. Size zel lisansokuyun ve ona bagl kaln.

    1.3. Katkda BulunanlarBu, etkilesimli olarak gelisen bir belgedir: Sorular sormak, sorulara cevap vermek, verilen cevaplar dzeltmek,yeni yazlmlara isaret etmek, su anki srdrcy sayfadaki hatalar veya eksiklikler ile ilgili uyarmak iin zellikledavet ediliyorsunuz. Tek kelimeyle, katln!

    Katlmda bulunmak iin, gelistirici (sayfa: 1) ile iletisime gein.

    Bilgi

    Yazm srasnda, bu kisi Konstantin Boldyshev (sayfa: 1) idi, FrancoisRene Rideau (sayfa: 1) artk yok(versiyon 0.5'den beri). Ben (Fare (sayfa: 1)) uzun bir sreden beri bu belgeyi srdrecek, yerime gee-cek bir stat (hacker) aramaktaydm ve sizlere degerli halem olarak Konstantin (sayfa: 1)'i sunmaktanmemnunum.

    1.4. TercmelerBu NASIL belgesinin Kore diline evirisi http://kldp.org/HOWTO/html/Assembly-\HOWTO/adresinden, Trke evirisi ise http://belgeler.org/howto/assembly-\howto.html adresinden

    http://belgeler.org Linux Kitapl g 5 / 41

  • Linux Makina Dili NASIL

    edinilebilir. Tamamlanmams Rusa evirisi isehttp://volgograd.lug.ru/wiki/GrableVodstvo/articles/AssembleInLinux/adresindedir. Ayrca, eski NASIL srmleri iin Franszca eviriler vard, fakat bulamadm.

    2. Sembolik makina diline ihtiyacnz var m?Aslnda, her ne yapyorsanz blmek istemem, ama burada zor kazanlms tecrbelerin sonucu olarak baztavsiyelerde bulunacagm.

    2.1. Artlar ve Eksiler

    2.1.1. Sembolik makina dilinin (Assembly) avantajlar

    Sembolik makina dili (Assembly) pekok dsk seviyeli seyi ifade edebilir:

    makinaya bagl yazma ve Giris/kslara (I/O) erilesilirsiniz oklu yazlm paralarnn ya da donanm aygtlarnn lmcl kilitlenmesini ieren kritik blmlere zg

    kod davranslarn kontrol edebilirsiniz.

    alsldk derleyicinizin herkese kabul grms kurallarn krabilirsiniz, ki bu da baz eniyilemelere izinvermektedir (bellek tahsisiyle, evrelerle (threading), agr kurallaryla ilgili kurallar geici olarak krmakgibi).

    kod paralar arasnda, uygun olmayan (rn. degisik derleyiciler tarafndan retilen veya dsk seviyearayzlerle ayrlan) kurallar kullanarak arayzler tasarlayabilirsiniz.

    islemcinizin alslmadk programlama kiplerine erisebilirsiniz (rn. als arayz iin 16 bitlik kip, aygtyazlmlar, Intel bilgisayarlardaki kaltsal kodlar).

    kt ve eniyileme yapmayan derleyicilerle uyumlu alsacak sk dngler iin olduka hzl kodlar rete-bilirsiniz. (Ancak, eniyileme yapabilen zgr derleyiciler var!)

    her ne kadar baska herhangi birininkine ait olmayacak olsa da, size zel aygt ayarlarnz iin el ile eniy-ilenmis mkemmel bir kod retebilirsiniz

    yeni dilinizin eniyileme yapabilen derleyicisi iin bir kod yazabilirsiniz (bu, ok azmzn yapacag ve hattapek de sklkla yapmayacag bir istir).

    rn. kendi kodunuzu tamamiyle kontrol altna alabilirsiniz

    2.1.2. Sembolik makina dilinin (Assembly) dezavantajlar

    Sembolik makina dili, olduka dsk seviyeli bir dildir (bundan daha asagda ikilik komutlar el ile kodlamakbulunmaktadr). Bu da su manalara gelmektedir:

    ilk baslarda yazmak, olduka uzun ve can skcdr hata yapmaya olduka meyillidir hatalarnz takip etmek olduka zor olabilir kodunuzu anlamak ve degistirmek olduka zordur, rn. bakmn yapmak sonu, su anda veya gelecekte var olacak mimarilere tasnabilir degildir

    http://belgeler.org Linux Kitapl g 6 / 41

  • Linux Makina Dili NASIL

    kodunuz ayn mimarinin sadece belli bir gereklestirimi iin eniyilenecektir: mesela, Intel uyumlu plat-formlar arasnda, herbir CPU tasarm ve trevi (islemci birimlerinin nispi gecikme sresi, retilen is(throughoutput) ve kapasitesi, nbellekler (cache), RAM, tast (bus), diskler, FPU, MMX, 3DNOW,SIMD uzantlarnn varlklar, v.b.) tamamiyle farkl eniyileme tekniklerini ifade etmektedir. Islemci (CPU)tasarmlar halihazrda sunlar iermektedir: Intel 386, 486, Pentium, PPro, PII, PIII, PIV; Cyrix 5x86,6x86, M2; AMD K5, K6 (K62, K6III), K7 (Athlon, Duron). Yeni tasarmlar yukarlara dogru trmanmaysrdrmektedir, dolaysyle ne bu listenin ne de kodunuzun gncel kalacagn ummayn.

    ok az bir ayrnt zerinde fazlaca zaman harcarsnz, hzlanmann byk ksmn olusturan kk ve genisalgoritmik tasarmlar zerine odaklanamazsnz (rn. liste/diziler zerinde degisikler yapan hzl ve ilkelnesneler olusturmak iin oka zaman harcayabilirsiniz; oysa sadece hesaba dayal bir adresleme (hash)tablosu veya baska bir yaklasmda ikilik aga ya da pekok CPU kmesine dagtlms olan yksek seviyelibir yap programnz ok daha hzlandrrd).

    algoritmik tasarmnzdaki ufak bir degiliklik var olan sembolik makina kodunuzu tamamiyle geersiz halegetirebilir. Bu durumda ya tamamen tekrar yazmaya (yazabilemeye) hazrsnzdr veya belirli bir algoritmiktasarm yapmaktan sklmssnzdr.

    Standart karslastrmal degerlendirmeden (benchmark) uzak olmayan kod zerinde, eniyileme yapanticari derleyiciler elle kodlanms sembolik makina dili gereklestirirler (aslnda, RISC mimarisine gre budurum x86 mimarisi zerinde daha az geerlidir ve belki de genis bir sekilde bulunan/kullanlan derleyicileriin de daha az dogrudur; herneyse, tipik bir C kodu iin GCC olduka iyidir);

    Ve her durumda, comp.compilers(B18)'da bulunan ynetici John Levine'nin dedi gi gibi,"derleyiciler karmask veri yaplarnn kullanmn olduka kolay hale getirmektedir vederleyiciler isin yarsndan sonra sklmamakta ve gvenilir olduka gzel kodlar ret-mektedir."

    Prosedr ve modl snrlar arasnda kodu eniyilerken, ayn zamanda da tm (byk) program boyuncadzgn biimde kod dnsmleri reteceklerdir.

    2.1.3. De gerlendirme

    Tm bunlardan sonra, sembolik makina dili kullanmann bir ihtiya oldugunu dsnebilirsiniz ve hatta ihtiyaolmadg baz yerlerde kullanmak ok da faydal olabilir. Sunlar yapmak isteyeceksiniz:

    sembolik makina dilinin kullanmn kltmek iyi tanmlanms arayzler iine bu kodlar koymak (encapsulate) sembolik makine dili dsnda yksek seviyeli dillerle tanmlanms yaplar tarafndan sembolik makine dili

    kodunuzun otomatik retilmesi (rn. GCC satrii (inline) makrolar)

    bu programlar otomatik aralarn sembolik makine dili koduna dnstrmesi bu kodun eger mmknse eniyilenmesi yukardakilerin tm, rn. bir derleyici (ya da derleyiciye bir eklenti) arka ucu (backend)

    Sembolik makina diline gerek duyulsa (rn. Isletim sistemi gelistirmek) bile, yukardakilerin ok daha fazlasnagerek duyulmayacagn greceksiniz ve de stteki prensipler de varl gn koruyacaktr.

    Bununla ilgili olarak Linux ekirdek kaynaklarna baknz: ne kadar az sembolik makina diline gerek duyulursa,neticesinde hzl, gvenilir, tasnabilir ve srdrlebilir isletim sistemi olusmaktadr. Hatta DOOM gibi basarlbir oyun dahi yogun sekilde C ile yazlmstr, sadece kk bir ksm hz arttrmak iin sembolik makine dili ileyazlmstr.

    http://belgeler.org Linux Kitapl g 7 / 41

  • Linux Makina Dili NASIL

    2.2. Sembolik makina dili nasl kullanlmaz

    2.2.1. Basarl kodu gereklemek iin admlar

    comp.compilers(B19)'daki Charles Fiterman'n bilgisayara karsn insann retti gi sembolik makina kodlaryla ilgilisyledi gi gibi:

    Insanoglu her zaman kazanmak zorundadr ve iste bu da nedenidir.

    Birincisi insanoglu herseyi yksek seviyeli dilde yazar.Ikincisi zerinde zaman harcadg scak noktalar bulacak

    sekilde programn taslagn hazrlar.

    ncs elinde bu ksmlar iin derleyicinin rettigi kod vardr.

    Drdncs makina kodu zerinde ufak gelismeler saglayarak onlara

    bir canllk kazandrabilir.

    Insanoglu kazanr nk makinalar kullanabilmektedir.

    2.2.2. Eniyileme yapan derleyiciler ile dilleri

    Digerleri arasndaObjectiveCAML, SML, CommonLISP, Scheme, ADA, Pascal, C, C++ gibi dillerin programnznsiskinli gini eniyileyecek zgr derleyicileri vardr ve genellikle, sk dngler iin bile elle yazlms sembolikmakina kodundan daha iyisini retirler, bu arada da daha yksek seviyeli ayrntlar zerinde odaklanmanzsaglarlar ve de belli bir kararl dzeye geldikten sonra da yukarda bahsedilen sekilde belli miktar basarma elkoymanz yasaklamazlar. Elbette, bu dillerin ogu iin eniyileme yapan ticari derleyiciler de vardr!

    Baz diller C kodu reten ve sonrasnda eniyilemesini C derleyicisine yaptran derleyicilere sahiptir: LISP,Scheme, Perl ve di ger pekogu. Hz olduka iyidir.

    2.2.3. Kodunuzu hzlandracak iin genel admlar

    Kodunuzun hzl alsmasn saglamak iin, analiz aralarndan birinin kodunuzun belli bir yerini srekli birperformans darbogaz olarak tanmlamas gerekmektedir.

    Bu nedenle, bir kod parasn ok yavas olarak tanmladktan sonra, sunlar yapmalsnz:

    ncelikle daha iyi bir algoritma kullanmaya alsn; yorumlamak yerine onu derleyin; daha sonra derleyicinizdeki eniyilemeyi etkinlestirip onunla oynayn daha sonra derleyiciye nasl eniyileme yapacagna dair ipular verin (LISP'de bilgi girmek; GCC ile yazma

    kullanmak; pekok derleyicideki seenekler, v.b)

    bundan sonra ancak son are sembolik makina dilidir.Son olarak, sembolik makina diliyle yazmay bitirmeden nce, retilen kodu incelemelisiniz, problemin gerektende kt kod retiminden kaynakland gn grmelisiniz, ki bu herzaman sanlan durum olmayabilir: derleyicininretti gi kod sizin yazd gndan daha iyi olabilir, zellikle modern oklu ardsk dzen (multipipelined) mimari-lerinde! Programn yavas olan ksmlar esas olarak byle olabilir. Hzl islemcili modernmimarilerde temel sorun,bellek erisim gecikmeleri, nbellek atlamalar, TLB (TLBmisses) kayplar ve sayfa hatalarndan kaynaklanmak-tadr; yazma kullanm gereksiz olmaktadr ve veri yaplarn daha kazanl bir sekilde ve bellek erisimini dahaiyi yapmann yollarn tekrar dsneceksiniz. Belki de tamamen farkl bir yaklasm sorunun zmne yardmcolabilir.

    2.2.4. Derleyicinin retti gi kodu incelemek

    http://belgeler.org Linux Kitapl g 8 / 41

  • Linux Makina Dili NASIL

    Derleyicinin retti gi kodu incelemek iin pek ok neden vardr. Iste size bu kodla neler yapacagnz:

    retilen kodun el yordamyla gelistirilip gelistirilemeyecegini kontrol edin (veya derleyici seenekleriyleoynayarak)

    durum byle ise, o zaman retilmis kod ile baslayn, onu yeniden yazmak yerine degistirin genel olarak, ds dnyaya kars sizin sembolik makine rutinlerinizi anlayan retilen kodu degisiklik yapmak

    iin bir yama gibi kullann

    derleyicinizdeki hatalar takip edin (tahminim en az sklkla)Sembolik makina dilinizin olusmas iin standart yol derleyicinizi S parametresiyle alstrmaktr. Bu, GCCC derleyicisini de ieren (GCC) pekok Unix derleyicinde alsmaktadr. GCC'ye gelince, fverboseasmkomut satr parametresiyle ok daha anlaslabilir sembolik makina kodlar retecektir. Elbette, iyi sembolikmakina kodu elde etmek istiyorsanz, herzamanki eniyileme seeneklerinizi ve ipularn unutmaynz!

    2.3. Linux ve AssemblyMuhtemelen farketti giniz zere, genel olarak, Linux programlamada sembolik makine dilini kullanmaya ihtiyaduymazsnz. DOS'takinin aksine, Linux srclerini sembolik makine dili ile yazmanz zorunlu degildir (aslnda,eger gerekten istiyorsanz yapabilirsiniz). Ve gnmzn eniyileme yapan derleyicileriyle, farkl islemcilerdekihz dikkate alyorsanz, C ile yazmak ok daha basittir. Yine de, bunu okuyorsanz, C/C++ yerine sembolikmakine dili kullanmak iin bir nedeniniz olabilir.

    Sembolik makine dilini kullanmak ihtiyacnda olabilirsiniz veya sadece kullanmak isteyebilirsiniz. Ksaca, sem-bolik makine dili krall gna dalmaktaki temel pratik sebepler (ihtiya) ksa kodlar ve libc bagmszlklardr. Pratikolarak ve en sk karslaslan nedense (istek), 20 yllk ve herseyi sembolik makine dili ile yapma alskanl g olaneski bir bilgisayar kurdu olmaktr.

    Yine de, eger Linux'u gml bir sisteme yerlestiriyorsanz, tm sistemin byklgne gre ksa olabilirsiniz:ekirdegi, libc ve tm diger seylerin (file|find|text|sh|v.b) uygulamalarn birka yz kilobyte'aoturtmalsnz ve her kilobyte'n degeri ok fazladr. Bundan dolay, mmkn olan yollardan birisi, sistemin baz(veya tm) ksmlarn sembolik makine dili ile yazmaktr ve bu durum da pekok yer tasarrufu saglayacaktr.Mesela, basit bir, sembolik makine dili ile yazlms, httpd 600 byte'tan az tutmaktadr; kernel, httpd ve ftpdieren bir sunucuyu 400kb veya daha az boyutta ayarlayabilirsiniz... Bunu dsnn.

    3. eviriciler (Assemblers)

    3.1. GCC Satrii Sembolik Makina DiliGNU projesinin kalbinde bulunan 32 bitlik eniyileme yapan, iyi bilinen GNU C/C++ derleyicisi (GCC), x86 mi-marisini olduka iyi bir sekilde desteklemektedir ve C kodlar ierisine, yazma tahsisini zel olarak belirtilerekveya GCC'ye braklabilecek sekilde, sembolik makina kodlar gmlmesine olanak saglamaktadr. GCC pekokplatformda, *BSD, VSTa, OS/2, *DOS, Win*, v.b., zellikle Linux'da alsr.

    3.1.1. GCC'yi nereden bulabiliriz

    GCC ana sayfas http://gcc.gnu.org/ adresindedir.

    GCC'nin DOS tabanl alsan srmne DJGPP(B21) denir.

    GCC'nin Win32 tabannda alsan iki srm vardr: cygwin(B22) ve mingw(B23)

    http://belgeler.org Linux Kitapl g 9 / 41

  • Linux Makina Dili NASIL

    CC'nin bir de OS/2 tabanl EMX olarak isimlendirilen bir srm vardr; DOS altnda da alsr ve unixbenzeriktphane yordamlarnn pekogunu ierir. Su siteye bir gz atn: ftp://ftp.leo.org/pub/comp/os/os2/leo/gnu/emx+gcc/.

    3.1.2. GCC satr ii sembolik makina dili iin belgeler nerede

    GCC'nin belgelendirmesi belge dosyalarn TeXinfo biiminde ierir. TeX ile bunlar derleyip ktlarn gre-bilirsiniz, .info'ya evirip emacs ile gz atabilirsiniz veya .html'ye evirebilirsiniz ya da hemen hemenistedi giniz herhangi bir biime; istedi giniz herhangi bir seye evirin (dzgn aralarla) veya oldugu haliyle okuyun..info dosyalar GCC iin yaplan herhangi bir iyi yklemede bulunur.

    Bakmak iin dogru yer C Extensions::Extended Asm::'dir.

    Invoking GCC::Submodel Options::i386 Options:: ksm da size yardmc olabilir. zellikle,yazmalara i386'ya zg kstlandrlms isimler verir: abcdSDB srasyla %eax, %ebx, %ecx, %edx, %esi,%edi ve %ebp (%esp iin bir harf yok)'ye karslk gelmektedir.

    DJGPP Oyun kaynag (sadece oyun ustalar iin degil) zellikle sembolik makina diliyle ilgili bir sayfaya sahipti,fakat artk erisilebilir degil. Herseye ragmen oradaki veriler DJGP (sayfa: 9) ve di ger faydal bilgilerin madeniniieren belgeler tekrar bir araya getirilmistir: http://www.delorie.com/djgpp/doc/brennan/ vehttp://www.castle.net/avly/djasm.html

    GCC, makina diline eviri iin GAS'a (asagy inceleyiniz) dayanr; sunu unutmayn ki satr ii asm yzdelikkarakterlerinin ift trnak ierisine alnmasna ihtiya duyar ve GAS'a onlar aktarlacaktr. Asagdaki GAS (sayfa:11) blmne baknz.

    Linux ekirdeginin kaynagnn alt dizini olanlinux/include/asmi386/ altnda oka rnek bulabilirsiniz.

    3.1.3. GCC'yi uygun satrii sembolik makina kodu retmesi iin a grmak

    ekirdek baslk dosyalarndaki (ve byk ihtimal sizin kendi basl gnzda da, eger kendi sembolik makina pro-gramlamanz Linux ekirdegindeki gibi temiz yaparsanz) sembolik makina yordamlar harici satrii (externinline) islevlere gml oldugundan, GCC, kullanabilir oldugu bu yordamlar iin, O seenegi ile agrlmaldr(veya O2, O3, v.b.). Aksi halde, kodunuz derlenebilir, fakat, programnzn bagl oldugu ktphanelere karsnsatrii olmayan harici ktphanelere bakyor olacagndan, dzgn sekilde baglanmaz. Baska bir yntem iseyordamlarn sonare srmlerini ieren ktphanelere baglant yapmaktr.

    Satrii eviri (sembolik makine diline) fnoasm ile devre ds braklabilir, bylece derleyici, genisletilmissatrii kodlar kullanlrken alsmayacaktr veya baglaycnn alglyamacag asm() isimli isleve agrlarda bu-lunacaktr. Bu bayragn alsmasna kars durum iin, fasm bayrag ile asm anahtar kelimesine kars olandavrans geri kazandrlr.

    Daha genel olarak x86 platformunda GCC iin iyi derleme seenekleri su sekildedir:

    gcc O2 fomitframepointer W Wall

    O2 pekok durumda iyi bir eniyileme seviyesidir. Bunun yannda eniyileme uzun zaman alr ve de kodunoldugundan daha bymesine sebep olur, fakat neticede oldugundan biraz daha hzl alsr hale gelir; bylesibir asr eniyileme sembolik makina dilinde her halkarda yapt gnz sk dnglerde (eger varsa) faydal olabilir.Eger gerekten de baz seyrek dosyalar iin olduka gl bir eniyilemeye ihtiya duyarsanz, O6'y kullanmaydeneyin.

    fomitframepointer kullanm, retilen kodun aptal ereve gsterici onarmn (frame pointer mainte-nance) atlamasn saglar, bu da kodun daha kk ve hzl olmasn saglar ve de bir yazmac sonraki kullanmlariin bosaltr. (gdb)'nin kolay kullanmna msade etmez, fakat bunlar kulland gnz zaman, boyut ve hz artkdert etmezsiniz.

    http://belgeler.org Linux Kitapl g 10 / 41

  • Linux Makina Dili NASIL

    W Wall ile tm faydal uyarlar etkinlestirilir ve aleni yaplan aptalca hatalar yakalamanz saglar.

    Islemciye zel, m486 gibi komutlar ekleyerek retilen kodun size zel islemciye daha uygun halde olmasnsaglayabilirsiniz. Modern GCC'nin komut sadr seenekleri mpentium ve benzeri seklindedir (PGCC(B29)'dedaha da fazladr), oysa ki GCC 2.7.x ve daha eski srmleri byle degildir. Islemciye zel en iyi seeneklerinneler olacag Linux ekirdegi iindedir. Daha ayrntl bilgi iin su anki GCC'nizin belgelendirmesini inceleyiniz.

    m386 boyutta eniyilemeyi saglamaktadr, bu da bellegin sk (tight) olmasn ve/veya yklenmis olan bilgisa-yarlarda hzlanmay saglamaktadr, nk byk programlar takas alan kullanmna sebep olmaktadr, bu dadaha byk kodlar iin saylandan daha ok eniyilemeye meyledilecek demektir. Bu tr ayarlarda, C dilini kul-lanmay brakmak faydal olabilir, bunun yerine islevsel bir dil ve/veya FORTH gibi kod zmlemeye meyilli birdil kullann ve bayt seviyesi (bytecode) veya szck seviyesi (wordcode) tabanl bir gerekleme kullann.

    Kod retim seeneklerini dosyadan dosyaya degistirebilirsiniz, bylece basarmn nemli oldugu dosyalar azamieniyileme kullanacaklardr, oysa ki di gerleri boyutlarna gre eniyileneceklerdir.

    Daha ok eniyileme iin, mregparm=2 seenegi ve/veya buna karslk gelen islev davranslar yardm edebilir,fakat yabanc kodlara, libc dahil, ilintileme yaparken pekok soruna sebep olabilir. Yabanc islevlerin bildirimiiin yollar vardr, bylece dogru agr sras retilmis olur veya yabanc ktphanelerinizi ayn yazma tabanlagr uzlasmlarn kullanacak sekilde tekrar derlemeyi isteyebilirsiniz.

    /usr/lib/gcclib/i486linux/2.7.2.3/specs dosyasn (veya her nerede ise) dzenleyerek busecenekleri ntanml olarak ekleyebilirsiniz (W Wall seeneklerini eklememek daha iyi olacaktr). GCC'yezel dosyalarnzn sisteminizde nerede oldugunu gcc v ile grenebilirsiniz.

    3.1.4. Makro deste gi

    GCC, satr ii sembolik makina dilinde yazma kstlamalarn belirlemenizi saglar (ve gerektirir), bylece eniyi-leyicinin bunlar hakknda herzaman bilgisi olur; satr ii sembolik makina kodu gerekten bir takm kalplardanolusmustur, zorunlu sekilde olusturulan kodlardan degil.

    Bylece sembolik makina kodunuzu CPPmakrolarnn ve satr ii C fonsiyonlarnn iine koyabilirsiniz ve byleceherhangi biri onu herhangi bir C islevi/makrosu olarak kullanabilir. Satrii islevler makrolara ok benzer, fakatkullanmak iin daha temizdir. Tm bu durumlarda, kodun tekrar edecegine (dublicate) dikkat edin, bundan dolayasm kodunda sadece yerel etiketler (1: tanmlanms olmaldr. Yine de, bir makro yerel olmayan etiketlerinparametre olarak aktarlmasna izin verecektir (veya sizin baz ek meta programlama yntemleri kullanmanzgerekecektir). Ayrca suna da dikkat edin, satrii sembolik makina kodu retmek, ierisinde olas hatalarn dayaylmasna sebep olacaktr; bundan dolay bylesi bir satrii asm kodundaki yazma kstlamalarn iki kerekontrol edin.

    Son olarak, C dilinin kendisi, sembolik makina dili programlama iin iyi bir soyutlama katman olabilir ve bu dasizi sembolik makina dilinin pekok sorunlarndan kurtarr.

    3.2. GASGAS, GCC'nin gvendi gi GNU eviricisidir (Assembler).

    3.2.1. Nereden Bulurum

    GCC'yi bulacagnz yerdeki ikilik uygulama paketleri (binutils paketi) ierinde bulabilirsiniz. Ikilik uygulama pake-tinin son srm http://sources.redhat.com/binutils/ adresinden temin edilebilir.

    3.2.2. Su AT&T szdizimi de ne ola ki

    http://belgeler.org Linux Kitapl g 11 / 41

  • Linux Makina Dili NASIL

    GAS 32 bit Unix derleyicilerini desteklemek iin icat edildi ginden, standart AT&T szdizimini kullanmaktadr.Bu sz dizimi UNIX dnyasnda bir standart olan m68k eviricilerinin szdizimine benzemektedir. Bu szdizimiIntel'in sz diziminden ne daha iyi ne de daha ktdr. Alstktan sonra, Intel szdiziminden daha sradanbulursunuz, hatta biraz daha skc.

    GAS szdizimi ile ilgili temel uyarlar:

    Yazma isimleri % ile baslar, bunun iin de eax, dl, v.b isimler yerine, yazmalar %eax, %dl, v.b. sekildeisimlendirilir. Bu da, harici C sembollerinin, herhangi bir karstrma riski olmadan veya herhangi bir irkingrnml alt izgi kullanma ihtiyac olmadan, sembolik makina kodu ierisine dahil edilmesine olanaksaglar.

    Intel'deki geleneksel nce hedef sonra kaynak kuralnn tersine, terimlerin sras kaynaknce/hedefsonra seklindedir. Bylece, Intel'de mov eax,edx (edx yazmacnn ieri gini eax ierisine tas)seklindeki bir szdizimi GAS'da mov %edx,%eax haline gelecektir.

    Terim genisli gi, komut adna bir sonek olarak belirtilir. Sonek olarak kullanlanb (8 bit) bayt iin,w (16 bit) ke-lime (word) iin ve l (32 bit) long iindir. Mesela, yukardaki ifade iin dogru szdizimi movl %edx,%eaxseklinde olacaktr. Yine de, gas kat bir AT&T szdizimi gerektirmemektedir, bunun iin de yazma terim-lerinin genisli gi tahmin edilebildi ginde sonek istege bagldr, aksi durumlarda ntanml olarak 32 bittir (biruyar ile birlikte).

    Anlk degerler nlerine bir $ konarak belirtilir, addl $5,%eax rneginde oldugu gibi (uzun tamsayolarak anlk 5 degerini %eax yazmacna ekle).

    Terim neklerinin olmamas, terimin bir bellek ieri gi oldugu anlamna gelmektedir; burada movl$foo,%eax foo'nun adresini %eax'e koyarken, movl foo,%eax foo'nun ieri gini %eax yazmacnakoymaktadr.

    Sralama veya ynlendirme, referans yazmacn veya ynlendirme bellek hcresi adresini parantez ieri-sine almakla saglanr, testb $0x80,17(%ebp)'de oldugu gibi (%ebp ile isaret edilen hcreden 17birim uzaklktaki baytn en yksek anlaml bitini sna).

    Not: AT&T ve Intel evirici szdizimleri arasnda kaynak kodu dnsm iin birka programn (sayfa: 27) sizeyardm dokunabilir, bazlar her iki ynde de dnsm gereklestirebilmektedir.

    GAS'n TeXinfo biiminde, en azndan kaynak dagtmyla gelen, kapsaml bir belgelendirmesi vardr. .infosayfalarn Emacs veya herhangi birseyle gzden geirin. GAS kaynak paketi ierisinde gas.doc veyaas.doc isimli bir dosya olsa gerek, fakat TeXinfo belgeleri arasna gmlmstr. Elbette, herhangi birsphe durumunda en iyi belgelendirme kaynagn kendisidir! Sizi zellikle ilgilendiren ksm MachineDependencies::i386Dependent::'dr.

    Yine, Linux kaynag (isletim sistemi ekirdegi) mkemmel bir rnek olarak gelmektedir; linux/arch/i386/altndaki su dosyalara baknz: kernel/*.S, boot/compressed/*.S, mathemu/*.S.

    Eger bir esit dil, bir evre (thread) paketi, v.b. yazyorsanz di ger dillerin (OCaml(B32), Gforth(B33), v.b.) veya evrektphanelerinin (QuickThreads, MIT pthreads, LinuxThreads, v.b.) bu isleri nasl yaptklarna bakabilirsiniz.

    Son olarak, bir C kodunu sembolik makina diline derlemek de arad gnz komut esitleriyle ilgili szdizimini sizegsterebilir. Yukardaki Sembolik makina diline ihtiyacnz var m? (sayfa: 6) ksmna baknz.

    3.2.3. Intel szdizimi

    Iyi haber su ki 2.10 srmnden itibaren, GAS Intel szdizimini de desteklemektedir. .intel_syntax komutuile bu kipe geis saglanabilir. Ne yazk ki, resmi binutils klavuzunda bu belgelenmemistir (henz?), dolaysiyle

    http://belgeler.org Linux Kitapl g 12 / 41

  • Linux Makina Dili NASIL

    kullanmak istiyorsanz, binutils'in 2.11 AMD64 tabanl srmn, http://www.lxhp.in-\berlin.de/lhpas86.html adresinden inceleyiniz.

    3.2.4. 16 bitlik kip

    Binutils (2.9.1.0.25+) i386 kisisel bilgisayarlarda tam olarak 16 bitlik kipi desteklemektedir (yazmalar veadreslemeler). .code16 ve .code32'yi evirme kipleri arasnda geis iin kullann.

    Ayrca, pekok kimse (isletim sistemine kitaplk (kit) hazrlayan yazarlar da dahil) tarafndan kullanlan zekihilelerden birisi de GCC'yi 16 bitlik gerek kip iin kod retmeye zorlamaktr, bu da asm(".code16\n")seklinde bir satrii ifade ile saglanr. GCC halen 32 bitlik adresleme kipleri retirken, GAS onlar iin uygun 32bitlik nekleri ekleyecektir.

    3.2.5. Makro deste gi

    AS, texinfo belgelerinde de belirtildi gi gibi makro destegi de barndrmaktadr. stelik, GCC .s dosyalarnGAS'a gndermek iin islenmemis birer sembolik makina kodu olarak alglarken, ayn zamanda .S dosyalarnGAS'a gndermeden nce CPP szgecinden de geirmeyi alglyabilmektedir. Tekrar tekrar, rnekler iin Linuxkaynaklarna baknz.

    GAS'n ayrca GASP nislemcisi de vardr, ki bu da makrosembolik makine dili hilelerinin GAS'a dahil olmasnsaglamaktadr. GASP, GAS binutils paketi ierisinde gelmektedir. CPP (sayfa: 17) ve M4 (sayfa: 18) gibi ltreolarak alsmaktadr. Ayrntlar hakknda hi bilgim yok, fakat kendi texinfo dosyasyla beraber gelmektedir,gzatmak (info gasp), ktsn almak isteyebilirsiniz. GAS ve GASP bana sradan makroeviriciler gibigelmektedir.

    3.3. NASMNetwide Assembler Projesi, C ile yazlms, bilinen tm szdizimlerine ve nesne biimlerine uymas gereken, hosbir i386 eviricisi sunmaktadr.

    3.3.1. NASM' nereden bulurum

    http://nasm.sourceforge.net, http://sourceforge.net/projects/nasm/ adreslerindebulabilirsiniz.

    Kulland gnz olagan yansnzdaki ikilik srm devel/lang/asm/ dizini altndadr. Ayn zamanda .rpm ve.deb biiminde Linux dagtmlarnn 'contrib' ksmnda bulunmas lazm.

    3.3.2. Ne yapar

    Sz dizimi Intel szdizimidir. Kapsaml makro isleme destegi eklenmistir.

    Desteklenen nesne dosyalar bin, aout, coff, elf, as86, obj (DOS), win32, rdf (onlarn kendi biimi).

    NASM, zgr LCC derleyicisi iin bir arka u (backend) olarak kullanlabilir (destek dosyalar eklenmistir).

    16 bitlik derleyici olarak BCC kullanmadgnz srece (ki bu da bu 32 bitlik NASIL belgesinin kapsam dsndadr),AS86 veya MASM yerine kesinlikle NASM kullanmalsnz, nk her platformda alsr.

    Bilgi

    NASM, NDISASM isimli bir tersine evirici (disassembler) ile beraber gelmektedir.

    http://belgeler.org Linux Kitapl g 13 / 41

  • Linux Makina Dili NASIL

    El yazm zmleyicisi onuGAS'tan daha hzl hale getirmektedir, buna ragmen elbette ki, 3 bazilyon (1 zilyondanbyk olduka byk bir say) degisik mimariyi desteklememektedir. Eger GAS szdiziminin aksine, Intel tarzszdizimini seviyorsanz, bu tercih edeceginiz evirici olacaktr.

    Not: AT&T ve Intel eviricileri arasnda kaynak kod dnsmn saglayan ok az program (sayfa: 27) bulun-maktadr; bazlar her iki ynde de eviri yapabilmektedir.

    3.4. Di ger Sembolik Makina eviricileriDegisik ve gze arpan zellikleriyle ilginizi ekebilecek baska sembolik makina eviricileri de bulunmaktadr.

    Bilgi

    Klasik olmayan/Yksek seviyeli gibi degisik gelistirilme seviyelerinde olabilirler.

    3.4.1. AS86

    AS86 makro destegine sahip 16 bit ve 32 bitlik alsma kipleri olan 80*86 eviricisidir. Intel szdizimine sahiptirfakat adresleme kiplerinde ufak farkllklar vardr. Bir sre nce Linux ekirdeginin de iinde bulundugu pekokprojede kullanlyordu. Daha sonra bu projeler GAS veNASM ierisinde kullanlmaya basland. Bildi gim kadarylaELKS halen kullanmaya devam etmektedir.

    AS86 http://www.cix.co.uk/mayday/ adresinde bin86 paketi ierisinde bir baglayc ile (ld86) veyaayr bir dosya olarak bulunabilir. Klavuz sayfalarnda ve kaynak paketteki asm.doc ierisinde belgelendirmesibulunmaktadr. Spheye dstgnzde kaynagn kendisi iyi bir klavuzdur: Iyi sekilde aklama satrlar olmasada programlama sekli olduka dogrudur. ELKS, LILO veya Tunes 0.0.0.25 ierisinde AS86 nasl kullanld gnabakmak isteyebilirsiniz.

    Bilgi

    ekirdegin 2.4 srmnden nce tamamen modas gemis bir srm, HJLu tarafndan, bin86 ad ile, suan herhangi bir Linux GCC deposunda bulunabilir, sadece Linux ekirdegini derlemek iin dagtlyordu.Fakat hi kimseye bunu Linux ekirdegini derlemek dsnda baska bir seyde kullanmasn nermem. Busrm sadece elden geirilmis bir minix nesne dosyas iermektedir ve bu da GNU binutils ya da baskaherhangi bir sey tarafndan desteklenmedi gi gibi 32 bitlik kipinde baz hatalar vardr, dolaysiyle onu sadeceLinux ekirdegini derlemekte kullanrsanz daha iyi olur.

    3.4.1.1. Belgeleri nerden bulurum

    Kaynak paketteki klavuz sayfalarna ve as.doc belgesine baknz. Spheye dsldgnde, kaynagn kendisien iyi belgedir: yorum satrlar iyi yazlmamstr, fakat yazlm gelistirme tarz ok aklaycdr. as86'nn ELKS,LILO veya Tunes 0.0.0.25... uygulamalarnda nasl kullanld gna bakabilirsiniz.

    3.4.1.2. AS86'nn BCC ile kullanm

    .s asm'yi a.out .o nesne ve .l listeleme dosyasna dnstrmek iin BCC kullanmyla ilgili GNU Makeledosya satr syledir:

    %.o %.l: %.sbcc 3 G c Ad Al A$*.l o $*.o $asm isim degisikli gini zorlayabilirsiniz:

    void foo asm("bar") (void);

    Binutils paketindeki objcopy uygulamasnn a.out nesnelerinizi ELF nesnelerine dnstrmeyi mmknklmas gerekti gini unutmayn, hatta baz durumlarda tam tersine de imkan tanr. Daha genel olarak, pekokdosya biimi arasnda dnsm gereklestirir.

    5.1.3. Do grudan Linux sistem a grlar (syscalls)

    Genelde C ktphanesi (libc) kullanmann tek yol oldugu ve dogrudan sistem agrlar yapmann ktoldugu sylenir. Bu dogrudur. Bir bakma... Genel olarak, libc ktphanesinin kutsal olmadgn bilmelisinizve pekok durumda sadece baz denetimler yapar, sonra ekirdege agr yapar ve ardndan errno'ya atamayapar. Bunu kendi programnzda da yapabilirsiniz (eger ihtiyacnz varsa) ve programnz bir dzine kat dahakk olacaktr, bu da gelismis bir basarm artsna sebep olacaktr, bu da srf paylasml ktphaneleri kul-lanmadgnzdan kaynaklanacaktr (duragan (static) ktphaneler daha hzldr). Sembolik makina dili ile pro-gramlamada libc kullanm pratik birseyden ok zevk/inans meselesidir. Linux'un POSIX standartlarna uygunolmay hedeedi gini unutmayn, benzer sekilde libc de. Bu da, hemen her libc "sistem agrs" szdizimingerek ekirdek sistemi agrlarndaki szdizimiyle rtsmesi anlamna gelir (ve tam tersi). Buna ek olarak,GNU libc (glibc) srmden srme daha yavas hale gelmekte ve daha ok bellek tketmektedir. Ilerdesiz de kendi, degisik trlerde, libc'ye zel islevlerinizi (sadece birer sistem agrs degil) tanmlayacaksnz(printf() ve srekas)... Ve buna hazrsnz, degil mi? :)

    Dogrudan sistem agrlar yapmann art ve eksileri su sekilde zetlenebilir:

    Artlar

    olas en kk boyut; son bayt sistem dsnda brakmak olas en yksek hz; favori karslastrmal degerlendirme (benchmark) ds dngleri bunun dsnda

    brakmak

    tam denetim: program/ktphanenizi size zg dile veya bellek gereksinimlerine veya herhangi bir seyeuydurabilirsiniz.

    libc erplerinin yol aacag bir kirlilik olmaz C agr uzlasmlarnn yol aacag bir kirlilik olmaz (eger kendi dilinizi veya ortamnz tasarlyorsanz) duragan ktphaneler libc ykseltmelerinden ve kmelerinden veya yorumlaycya #! yolu ile

    aslmanzdan sizi bagmsz klar. (ve daha hzldr)

    biraz da eglence iindir (sembolik makina dili dsnda heyecanlanmaz msnz?)

    Eksiler

    Eger bilgisayarnzda bir baska program da libc kullanyorsa, libc kodunun yinelenmesi otomatik olarakbellegin, korunmas yerine, bosa harcanmasna sebep olacaktr.

    Pekok duragan ikilikte (static binary) gereksiz yere tanmlanan servisler bellek israfdr. Fakat kendi libcyerdegistirmenizin bir paylasml ktphane olmasn saglayabilirsiniz. (NBB: Bu yukardaki iddiasn yalan-lamyor mu? ;))

    http://belgeler.org Linux Kitapl g 20 / 41

  • Linux Makina Dili NASIL

    Herseyi sembolik makina dili ile yazmak yerine, bir esit bayt kodu, szck kodu veya yapsal yorum-laycya sahip olmakla, boyut ok daha iyi korunur. (derleyicinin kendisi C veya sembolik makina dilindeyazlabilir). Ikilik esitlili gini kk tutmann en iyi yolu, oklu ikilikler yapmamaktr, yerine #! nekiylebaslayan yorumlanan islem dosyalar kullanmaktr. Bu, OCaml'n szck kodu kipinde alst gndaki du-rumdur (eniyilenmis dogal kod kipine karsn) ve de libc kullanmyla uyumludur. Bu ayn zamanda unixaralarnn yeniden gereklenimi olan Tom Christiansen'in Perl G Aralar (Perl PowerTools)'nn naslalst gnn aklamasdr. Son olarak, bunlar kk tutmann bir yolu da, tam olarak yolu kodlanms haricibir dosyaya bagml olmamaktr, bu da ktphane veya yorumlayc olsun, tek bir ikilik dosyaya sahip olmakve buna sabit veya sembolik baglar yapmaktr: ayn ikilik size en makul alanda, alt yordamlarn gereksizkullanm veya gereksiz ikilik baslklar olmadan, ihtiyacnz olan herseyi sunacaktr; kendine zel davransargv[0] degerine bakarak ynlendirecektir; bu durumda tannan ismiyle agrlmaz, bir kabuga ntanmlolabilir ve muhtemelen bir yorumlayc olarak da kullansl olmus olur!

    Nadir linux sistem agrlar yannda libc'nin sundugu pekok islevsellikten faydalanamazsnz: malloc,thread, locale, password, yksekseviyeli ag ynetimi, v.b. islevsellikler, klavuz sayfalarnn 2. blmndedegil, 3. blmnde yer alr.

    Bu yzden, libc'nin, printf()'den malloc() ve gethostbyname'e uzanan ok sayda paralasnyeniden gereklemek zorunda kalabilirsiniz. libc varken bu gereksizdir, hatta olduka skc olabilir.Bazlarnn libc'nin baz ksmlar iin "haf" (ligth) yerdegistirmeler yazdklalarna dikkat ediniz bunlarinceleyiniz! (Redhat'in minilibc'si, Rick Hohensee'nin libsys(B59)'si, Felix von Leitner'in dietlibc(B60)'si, Chris-tian Fowelin'in libASM(B61)'si, asmutils(B62) projesi de tamamen saf sembolikmakina libc'si ile alsmaktadr)

    Duragan ktphaneler sizi, libc gncellemelerinden ve ayn zamanda, gzipskstrlms dosyalarndzgn sekilde ihtiya oldugunca amanz saglayan,zlib paketi gibi libc eklentilerinden faydalanmaktanalkoyar.

    libc tarafndan eklenen ok az saydaki komutun sistem agrlarnn maliyetine kyasla kk bir hz ykolabilir. Eger hz gznne alnrsa, temel sorununuz, onlarn sarmalayc islevlerini degil, kendi sistemagrlarnzn kullanmdr.

    Kendi agr uzlasmlar olan ve standart uzlasm kullanmnda kural dnsm ykne (high conventiontranslation overhead) byk nem veren L4Linux gibi Linux'un mikro ekirdek srmleri alstrlrken,sistem agrlar iin standart sembolik makina dili API'leri kullanmak, libc API'leri kullanmaktan dahayavastr (L4Linux, sistem agr API'leri ile yeniden derlenmis sekilde gelir; elbette kendi kodunuzu onunAPI'leriyle tekrar derleyebilirsiniz).

    Genel hz eniyileme konularyla ilgili olarak nceki konulara baknz. Eger sistem agrlar size gre ok yavassa, kullanc adasnda kalmak yerine ekirdek kaynak kodlarn

    (C dilindeki) elden geirmeyi isteyebilirsiniz.

    Eger yukardaki art ve eksileri zihninizde iyice lp tarttysanz ve hala dogrudan sistem agrlarn kullanmakistiyorsanz, size baz nerilerim olacak:

    Sistem agr islevlerinizi tasnabilir bir sekilde, C dilinde (sembolik makina dilinin tasnamaz zelli ginekarsn) asm/unistd.h ile sunulan makrolar kullanarak tanmlayabilirsiniz.

    Sistem agrs islevlerini degistirmeyi deneyecekseniz, libc'den kaynak kodunu alp inceleyin. (Ve dahaiyisini yapabileceginizi dsnyorsanz, bunu yazarlara bildirin!)

    Istedi giniz her isi yapan bir sembolik makina kodu iin zkaynaklar (sayfa: 27)na baknz.

    http://belgeler.org Linux Kitapl g 21 / 41

  • Linux Makina Dili NASIL

    Temelde, eax ierisine __NR_sistemagr_ismi numaras (asm/unistd.h dosyasndadrlar) ile int 0x80degeri ve parametreleri de srasyla (alt (sayfa: 22)ya kadar) ebx, ecx, edx, esi, edi, ebp (sayfa: 22) iinekonur.

    Sonueax ierisinde dndrlr, negatif sonularda hata ile dner, bunun karsl g da libc ierisinde errno'dur.Kullanc y gtna dokunulmaz, dolaysiyle bir sistem agrs yaparken geerli bir kullanc y gtna ihtiyacnzyoktur.

    Bilgi

    ebp'ye 6 parametre aktarm Linux 2.4 srmnde mmkn olmustur, daha nceki Linux srmleri yaz-malarda sadece 5 parametreye bakyordu.

    Linux ekirdeginin Dahili Yaps (Linux Kernel Internals)(B66) belgesi ve zellikle i386 Mimarisinde Sis-tem agrlar Nasl Gereklenir? (How System Calls Are Implemented on i386 Architecture?)(B67) blm okdaha saglkl bilgi verecektir.

    Baslatrken bir srece parametrelerin aktarlmasnda oldugu gibi, genel prensip, y gtn orjinal olarak argmansaysn (argc) ve ardndan *argv'ler halinde argman gstericilerini, bundan sonra da environ (ortam) iin bosgsterici ile sonlandrlms bos karakter sonlandrmal isim=deger dizgelerini ierecegidir. Daha ayrntl bilgiiin, zkaynaklar (sayfa: 27) blmn okuyunuz, libc'nizdeki C baslatma (crt0.S veya crt1.S) kodlarnveya bunlarn Linux ekirdeginde olanlarn (exec.c ve linux/fs iindeki binfmt_*.c) inceleyiniz.

    5.1.4. Linux altnda donanmsal G/

    Eger Linux altnda dogrudan port erisimi ile G/ islemleri gereklestirmek istiyorsanz, bu ya isletim sis-teminde bir degisiklik gerektirmeyen basit bir istir ve bununla ilgili G/ portlar ve programlama(IOPortProgramming) kk nasl belgesini okumanz yeterli olur ya da bir ekirdek aygt srcsgereklidir ve ekirdek kaynak kodlarn elden geirme, aygt srcs gelistirme, ekirdek modlleri, v.b. ile ilgilidaha fazla bilgi edinmeniz gerekir. Bunlarla ilgili pek ok belge ve NASILlar LDP sayfalarnda bulunmaktadr.

    Belki de, grak programlama yapmak istersiniz, o zaman GGI(B69) veya XFree86(B70) projelerinden birine katln.

    Bazlar daha iyisini bile yapabilir, yorumlanms belli bir alana zg bir dilde, GAL, kk ve gl XFree86srcleri yazabilirler, baz degerlendirmelerden sonra da C ile yazlms srclerin verimini arttrabilirler(srcler ne sadece asm'dir ne de sadece C!). Burada sorun, verimi arttrmak iin kullanlacak bazdegerlendiricilerin zgr olmamasdr. Bunlarn zgr srmlerini gereklestirecek olan var m?

    Herneyse, tm bu durumlarda, herseyi sembolik makina kodu ile yazmak yerine GCC satrii sembolik makinadilini linux/asm/*.h dosyalarndaki makrolarla kullanmak daha iyi olacaktr.

    5.1.5. Linux/i386'daki 16 bitlik srclere eri sim

    Byle bir sey teorik olarak dogrudur (kant: DOSEMU(B71)'nun programlara seici bir sekilde port atamalarn naslyapt gn inceleyiniz) ve ben de bir yerlerde birilerinin bunu yapt g sylentilerini de duydum (bir PCI srcsm? bir VESA erisim arac m? ISA PnP mi? bilmiyorum). Eger bunun hakknda ok net bilginiz varsa, o zamanok dahamemnun olacaksnz. Herneyse, daha ayrntl bilgi iin baklmas gereken kaynaklar Linux ekirdegininkaynak kodlar, DOSEMU kaynaklar (ve DOSEMU deposundaki di ger programlar) ve de Linux altnda pekokdsk seviyeli programn kaynaklardr ... (belki CGI'da olabilir, eger VESA destegi varsa).

    Temel olarak ya 16 bitlik korumal kipi veya vm86 kipini kullanmalsnz.

    Ilkinin yaplandrlmas daha basittir, fakat sadece segman aritmeti gi veya mutlak segman adreslemesi (zellikle0. segman adreslerken) ile ilgili islemler yapmayacak iyi davransl kodla alsr, fakat sans eseri tm segmanlarkullanlrsa, LDT ile ileri dzey ayarlama yaplabilir.

    http://belgeler.org Linux Kitapl g 22 / 41

  • Linux Makina Dili NASIL

    Ikincisi ise harcalem 16 bitlik ortamlarla daha bir uyumluluk saglar, fakat idaresi daha karmasktr.

    Her iki durumda da 16 bitlik koda gemeden nce, sunlar yapmalsnz:

    16 bitlik kod ierisinde kullanlan herhangi bir mutlak adresi (ROM, video tamponlar, DMA hedeeri vebellek eslemli G/ gibi) /dev/mem'den srecinizin adres uzayna mmap'leyin.

    LDT ve/veya vm86 kipi gzlemleyici ayarlayn ekirdekten uygun G/ izinlerini kapn (st blmlere baknz)

    Tekrar, DOSEMU projesiyle sunulan belgeleri dikkatlice okuyunuz, zellikle Linux/i386 altnda ELKS ve/veya.COM programlarn alstrmak iin kullanlan kk emlatrlerle ilgili ksmlar.

    5.2. DOS ve WindowsPekok DOS ogaltclar (extenders) DOS servisleri iin baz servislerle beraber gelir. Bununla ilgili belgeleriokuyunuz, fakat genelde,int 0x21 ve benzerine benzetim yaparlar (simulate) ve siz de sanki gerek kipteymisgibi alsrsnz (Az gelismislik dsnda birseyleri oldugundan ve islemleri 32 bitlik terimlerle alsr hale getirdik-lerinden spheliyim, daha ok gelen kesmeleri gerek kip veya vm86 eylemcisine yanstyor gibiler.)

    DPMI hakkndaki belgeler (ve fazlas) ftp://x2ftp.oulu.fi/pub/msdos/programming/ adresindebulunabilir (yine, asl x2ftp sitesi kapanyor (kapand?), onun iin yansy(B73) kullann).

    DJGPP kendi (snrl) glibc trev/altkme/yerdegistirmeleri v.b.leri ile gelmektedir.

    Linux'tan DOS'a aprazderleme (crosscompile) yapmak mmkndr, metalab.unc.edu iin olan yerel FTPyansnzn devel/msdos/ dizinine baknz; Ayn zamanda Utah niversitesindeki Flux Projesi(B74)'ndenMOSS DOSextender (DOSgenisletici)'ye de baknz.

    Di ger belgeler ve SSS, DOS merkezlidir; biz DOS gelisimini tavsiye etmiyoruz.

    Windows ve Srekas

    Bu belge Windows programlama hakknda degildir, bununla ilgili pekok belgeyi heryerde bulabilirsiniz... Bil-meniz gereken, GNU programlarnn Win32 altnda alsmas iin, cygwin32.dll(B75) ktphanesini oldugudur,bylece sizler GCC, GAS ve tm GNU aralar ile pekok di ger Unix uygulamasn kullanabilmektesiniz.

    5.3. Kendi i sletim sisteminizDenetim duygusu pekok isletim sistemi gelistiricisini sembolik makina diline eken seydir, bu da genelde sem-bolik makina dili kodlar elden geirmeye yol amakta veya ondan kaynaklanmaktadr. Her ne kadar temelinioluturan bir sistemin tepesinde alsabiliyor olsa da (Mac zerindeki Linux veya Unix zerindeki OpenGenera),kendi kendine gelisime izin veren bir sistem ancak isletim sistemi olarak isimlendirilebilir.

    Bylece, kolay hata ayklama amalar iin, ilk baslarda kendi isletim sisteminizi Linux zerinde alsr sekildetasarlayabilirsiniz (yavasl gna ragmen), daha sonra Flux OS arac(B76)n kullanarak (kendi isletim sisteminizdeLinux ve BSD srclerinin kullanmn garanti eder), onu kendi basna alsr hale getirebilirsiniz. Isletim sis-teminiz kararl oldugunda, artk gerekten sevdiyseniz, kendi donanm srclerinizi yazmann vaktidir.

    Bu NASIL belgesi nykleyici (bootloader) kodlarn, 32 bitlik kipe gemeyi, kesmelerle islem yapmay, Intel'intemel gvenli kipini veya V86/R86 beyinlmllgn (braindeadness), nesne biiminizi tanmlamay ve agruzlasmlarn kapsaMAmaktadr.

    Tm bunlar iin gvenli bilgi bulabileceginiz yer halihazrdaki isletim sisteminin veya nykleyicinin kaynak kod-lardr. Pekok konu su adreste mevcuttur: http://www.tunes.org/Review/OSes.html

    6. Hzl baslang

    http://belgeler.org Linux Kitapl g 23 / 41

  • Linux Makina Dili NASIL

    6.1. Giri sSon olarak, eger hala bu lgnca kri denemek ve sembolik makina kodu yazmak istiyorsanz (eger bu ksmaulastysanz gerekten de bir sembolik makina hayransnzdr), baslang iin gerekenleri bu ksmda bula-caksnz.

    Daha nce de okudugunuz gibi, Linux iin degisik sekillerde yazabilirsiniz; size dogrudan sistem agrlarnnasl yapacagnz gsterecegim, nk bu ekirdek servislerini agrmann en hzl yoludur; kodumuz hi birktphaneye bagl degildir, ELF yorumlaycsn kullanmaynz, nk ekirdek ile dogrudan iletisim kurar.

    Ayn kodu nasm ve gas iin gsterecegim ve bylelikle Intel ve AT&T sz dizimini de gstermis olacagm.

    Ayn zamanda Unix bembolik makne dili ile programlamaya giris klavuzu(B78)nu okumak isteyebilirsiniz; UNIXbenzeri isletim sistemleri iin rnek kodlar da iermektedir.

    6.1.1. Ihtiyacnz olan aralar

    Herseyden nce bir eviriciye (derleyici) ihtiyacnz vardr nasm veya gas

    Ikinci olarak, bir ilintileyiciye (linker) ihtiyacnz vardr ld, nk eviriciler sadece nesne kodunu retmektedir.Hemen her dagtm gas ve ld'yi binutils ierisinde sunmaktadr.

    nasm'a gelince, Linux iin paketleri ve belgeleri nasm sayfasndan (sayfa: 13) indirip kurmanz gerekebilir,pekok dagtmn (Stampede, Debian, SuSe, Mandrake) nasm' kendi srmleri ierisinde barndrdklarnunutmayn, nce bir kontrol edin.

    Eger daha derine inecekseniz, isletim sisteminizin baslk dosyalarn ve mmknse ekirdek kaynak paketiniedinmelisiniz.

    6.2. Merhaba Dnyal :)

    6.2.1. Yerlesim

    Linux, 32 bitliktir, korumal kipte alsr, dz bellek modeline sahiptir ve ikilikler iin ELF biimini kullanr.

    Bir program blmlere ayrlabilir: kodunuz iin .text ksn (saltokunur), verileriniz iin .data ksm (okuyaz), ilklendirilmemis veriler iin .bss ksm (okuyaz); aslnda bir ka tane daha, kullanc tanml blmyannda, standart blm olabilir, fakat onlarn kullanlacaklar durumlar ok nadir olmaktadr ve bizim ilgi alanmzdsndalar. Bir program en azndan .text ksmna sahip olmaldr.

    Simdi ilk programmz yazacagz.

    6.2.2. NASM (hello.asm)

    section .text ;blm bildirimi

    ;giris noktasn ELF ilintileyiciye veya ykleyiciyeglobal _start ;gndermeliyiz (export). Giris noktasn uzlasmsal

    ;olarak _start ile belirtiriz. ntanml durumu;degistirmek iin: ld e foo kullann.

    _start:

    ;dizgemizi stdout'a yazar

    mov edx,len ;nc argman: ileti uzunlugumov ecx,msg ;ikinci argman: yazlacak iletinin gstericisi

    http://belgeler.org Linux Kitapl g 24 / 41

  • Linux Makina Dili NASIL

    mov ebx,1 ;ilk argman: dosya tutucu (stdout)mov eax,4 ;sistem agrs numaras (sys_write)int 0x80 ;ekirdegi agr

    ;ve k

    mov ebx,0 ;ilk sistem agrs argman: ks kodumov eax,1 ;sistem agr numaras (sys_exit)int 0x80 ;ekirdegi agr

    section .data ;blm bildirimi

    msg db "Hello, world!",0xa ;sevgili dizgemizlen equ $ msg ;sevgili dizgemizin boyu

    6.2.3. GAS (hello.S)

    .text # blm bildirimi

    ;giris noktasn ELF ilintileyiciye veya ykleyiciyeglobal _start ;gndermeliyiz (export). Giris noktasn uzlasmsal

    ;olarak _start ile belirtiriz. ntanml durumu;degistirmek iin: ld e foo kullann.

    _start:

    # dizgemizi stdout'a yazar

    movl $len,%edx # nc argman: ileti uzunlugumovl $msg,%ecx # ikinci argman: yazlacak iletinin gstericisimovl $1,%ebx # ilk argman: dosya tutucu (stdout)movl $4,%eax # sistem agr numarasint $0x80 # ekirdegi agr

    # ve k

    movl $0,%ebx # ilk sistem agrs argman: ks kodumovl $1,%eax # sistem agr numaras (sys_exit)int $0x80 # ekirdegi agr

    .data # blm bildirimi

    msg:.ascii "Hello, world!\n" # sevgili dizgemizlen = . msg # sevgili dizgemizin boyu

    6.3. ali strlabilir bir kod retmek

    6.3.1. Nesne kodu retimi

    alstrlabilir bir kod elde etmenin ilk adm nesne dosyasn kaynaktan derlemek (veya evirmek)tir:

    Nasm rnegi iin:

    $ nasm f elf hello.asm

    http://belgeler.org Linux Kitapl g 25 / 41

  • Linux Makina Dili NASIL

    gas rnegi iin

    $ as o hello.o hello.S

    Bu hello.o nesne dosyasn olusturur.

    6.3.2. al strlabilir retmek

    Ikinci adm ilintileyiciyi agrarak nesne dosyasnn kendisinden alstrlabilir bir dosya retmektir:

    $ ld s o hello hello.o

    Sonu olarak bu hello alstrlabilir dosyasn retecektir.

    Hey, alstrmay deneyin... alst m? Iste bu. Olduka basit.

    6.4. MIPS rne giGerek dnyada x86 slalesi dsnda da bir evren var. Asagda Spencer Parkin tarafndan sunulan ve MIPSislemciler iin yazlms bir rnek vardr. Buraya kadar gelmisken http://www.cuillin.demon.co.uk/nazz/trivia/hw/hw_assembler.html adresindeki Bir Grup Sembolik Makina Dili ile Yazlms MerhabaDnya Programna bakabilirsiniz.

    # hello.S by Spencer T. Parkin

    # Bu benim ilk MIPSRISC sembolik makina dili programm!# Derlemek iin:# > gcc o hello hello.S non_shared

    # Bu program PlayStation2 MIPS R5900 (EE ekirdek)# zerinde hatasz ve uyarsz derlenir.# EE Duygu Makinas (Emotion Engine) anlamna gelir

    # non_shared seenegi gcc'ye# yeniden tahsis edilebilir kod ile ilgilenmedigimizi syler.# Eger isteseydik, PICABI agrm kurallarn# ve diger protokolleri kullanmalydk

    #include // Anaslabilir yazma adlar iin#include // Sistem servisleri iin

    .rdata # yalnz okunabilir veri blmne baslangalign 2 # bellegin yapm seklinden dolay byle

    hello: .asciz "Hello, world!\n" # Null ile sonlanms bir karakter dizisi.align 4 # bellegin yapm seklinden dolay

    length: .word . hello # length = IC (helloaddr)

    .text # kod blm baslangc

    .globl main # gcc/ld baglamasndan dolay

    .ent main # gdp hata ayklama bilgisi

    main: # gcc'ye bir non_shared alan sunmalyz# ya da asagdaki satr etkin olmal

    # .set noreorder # yeniden komut sralamasn kapat# .cpload t9 # PIC ABI zrvas# .set reorder # yeniden komut sralamas aktif

    http://belgeler.org Linux Kitapl g 26 / 41

  • Linux Makina Dili NASIL

    move a0,$0 # dosya tanmlaycs standart kty gstersinla a1,hello # karakter dizisi adresini yklelw a2,length # karakter dizisi boyunu ykleli v0,__NR_write # sistem yazma servislerini belirtsyscall # ekirdegi agr (karakter dizisini yaz)li v0,0 # geri dns kodunu yklej ra # agrana dns.end main # dgb iin hata ayklama bilgisi

    # hepsi bu kadar millet!

    7. zkaynaklar

    7.1. SitelerLinux/UNIX sembolik makina dili ile programlama malzemeleri iin asl zkaynak:

    http://linuxassembly.org/resources.html

    Mutlaka ziyaret edin, Degisik UNIX isletim sistemleri ve islemcileriyle ilgili pekok sembolik makina dili projeleri,aralar, klavuz sayfalar, belgeler, rehberler, v.b. edinin. ok abuk gelisti gi iin, ikinci bir kere daha tekraretmeyecegim.

    Eger sembolik makina diline yabancysanz iste size bir ka baslang noktas:

    Sembolik Makina Dili Sanat (The Art Of Assembly)(B82) x86 Sembolik Makina Dili Ska Sorulan Sorular (Google'u kullann) ekirdekSavaslar (CoreWars)(B83), sembolik makina dilini genel hatlaryla eglenceli grenmenin bir yolu

    7.2. Haber gruplar

    comp.lang.asm.x86(B84); alt.lang.asm(B85)

    7.3. ListelerEger Linux/UNIX sembolik makina diliyle ilgileniyorsanz (veya sorularnz varsa ya da sadece merak ediyor-sanz), sizi zellikle Linux sembolik makina dili programlama listesine davet ediyorum.

    Bu, Linux, *BSD, BeOS ve di ger UNIX/POSIX benzeri isletim sistemleri altnda sembolik makina dili ile program-lama tartsmalarnn oldugu ak bir ortamdr; ayrca sadece x86 ile snrl degildir (Alpha, Sparc, PPC ve di gerbilgisayar statlar da davetlidir!).

    Ileti listesi adresi: .

    Kayt olmak iin iletinin gvde blmne asagdaki metni yazp adresineepostanz gnderiniz.

    subscribe assembly

    Ayrntl bilgi ve liste arsivleri http://linuxassembly.org/list.html adresinde mevcuttur.

    8. Ska Sorulan Sorular

    http://belgeler.org Linux Kitapl g 27 / 41

  • Linux Makina Dili NASIL

    Asagda Linux sembolik makina dili ile programlamada ska sorulan sorular (cevaplar ile) verilmistir. Bazsoruar ve cevaplar linuxassembly ileti listesi (sayfa: 27)nden alnmstr.

    8.1. Linux altnda nasl grak programlama yaparm?8.2. Saf (pure) sembolik makina kodunu Linux altnda nasl derlerim?8.3. Baska faydal aralar var m?8.4. Linux'tan (BSD, BeOS, v.b.) BIOS islevlerine nasl eri sebilirim?8.5. Sembolik makina dilinde ekirdek modlleri yazmak mmkn m?8.6. Belle gi dinamik olarak nasl tahsis edebilirim?8.7. select sistem a grlarn nasl kullanaca gm anlayamyorum!

    8.1. Linux altnda nasl grak programlama yaparm?Paul Furber 'den bir cevap:

    Pekala, Linux'ta grafik isleri iin pekok ara vardr. Hangisinikullanacagnz ne yapmak istediginize bagldr. Tm bilgilere sahipbir web sayfas yoktur ama iste bir ka pf nokta:

    SVGALib: Bu, konsoldan SVGA erisimi iin C ktphanesidir.Artlar: grenmesi kolay, iyi kodlama rnekleri, DOS'taki gfxktphanesinden pek de farkl degil, DOS'taki tm etkiler az birdegisiklikle dnstrlebilir.Eksileri: program dogrudan donanma eristigi iin, alsmak iin rooterisim yetkilerine gerek duyar, her ip (chipset) ile alsmaz,XWindows altnda alsmaz.http://ftp.is.co.za'da svgalib1.4.x diye aratn.

    Framebuffer: SVGA ile ilgili kendinizce yaplabilen grafiklerArtlar: hzl, dogrusal olarak haritalanms video erisimi,eger isterseniz ASM kullanlabilir :)Eksileri: ekirdek iinde derlenmeli, ipsete zgn zellikler,alsmas iin X kapatlmal, iyi linux sistem agrlar ve ekirdekbilgisine dayanr, hata ayklamas zordurrnekler: asmutils (http://www.linuxassembly.org), yaprak rnegi,framebuffer kodu ve asm ile ilgili ipular iin benim sayfam(http://ma.verick.co.za/linux4k/)

    Xlib: XFree86 iin uygulama ve gelistirme ktphaneleri.Artlar: X uygulamanz zerinde tam bir kontrolEksileri: grenmesi zor, alsmas korkun ve az da olsa X'in dskseviyede nasl alstg bilgisini gerektirirTavsiye edilmez, ama onu iin bu kadar yanp tutusuyorsanz durmayn.Muhtemelen tm baslk ve ktphane dosyalar yklenmistir, dolaysiyleihtiyacnz olana sahipsiniz.

    Dsk seviyeli API'ler: PTC, SDL, GGI ve Clanlib'i ierir.Artlar: ok esnek, X veya konsolda alsr, video donanmn soyutlaronun iin dzgn dogrusal bir yzey izebilirsiniz, pekok gzel rnek kod,OpenGL ve ses ktphaneleri gibi diger API'lere baglant kurabilirMicrosoft DirectX srmleri zgrdr.Artlar: Kendi yaptgnz kadar hzl degildir, gelisim srecince bazensrmler ok sk degisir.rnekler: PTC ve GGI mkemmel demolara sahiptir, SDL ise oyunlar iin,sdlQuake, Myth II, Civ CTP ve ayrca Clanlib'de kullanlmstr.

    Yksek seviyeli API'ler: OpenGL baska var m?

    http://belgeler.org Linux Kitapl g 28 / 41

  • Linux Makina Dili NASIL

    Artlar: temiz API, yzlerce islevsellik ve rnek, endstriyelstandart; bundan dolay mesela SGI'dan grenilebilirEksileri: donanm hzlandrlmas normalde bir zorunluluktur,baz srmler ve platformlar arasnda acayipliklerrnekler: oka baglantlar blm altndaki www.mesa3d.org ksma baknz.

    Bakmay srdrmek iin svgalib rneklerini inceleyin ve ayn zamandaSDL'y ykleyin ve alsr duruma getirin. Bundan sonrasnda ise limitgkyzdr.

    8.2. Saf (pure) sembolik makina kodunu Linux altnda nasl derlerim?Sembolik Makina Dili Hata Ayklaycs'nn (Assembly Language Debugger(B89)), sembolik makina kod-laryla alsmas iin tasarlanms eski bir srm vardr ve de Linux ve *BSD zerinde alsmabilmesi iinyeterince tasnabilirdir. Halihazrda islevseldir ve de dogru seim olacaktr, bir bakn!

    gdb'yi de deneyebilirsiniz ;). Kaynak kod hata ayklaycs olmasna ragmen, saf sembolik makina kod-larn ayklamak iin de kullanlabilir, biraz hileyle gdb'ye istedi ginizi yapmanz syleyebilirsiniz (maalesefnasm'n g seenegi gdb iin yeterli bilgi retmemektedir; sanrm bu nasm'n bir a g). Asagda DmitryBakhvalov 'dan bir cevap var:

    Kisisel olarak, gdb'yi asm uygulamarnnn hatalarn bulmak iinkullanrm. sunu deneyin:

    1) Derlemek iin asagdaki kodu kullann:$ nasm f elf g smth.asm$ ld o smth smth.o

    2) gdb'yi alstrn$ gdb smth

    3) gdb iinde:(gdb) disassemble _startat _start+1'e bir kesme koyun(eger at _start konursa alsmaz, nedenini bilmiyorum)(gdb) b *0x8048075

    kodu takip edebilmek iin asagdaki kodu kullanrm(gdb)define n>ni>printf "eax=%x ebx=%x ...etc...",$eax,$ebx,...etc...>disassemble $pc $pc+15>end

    daha sonra program r parametresiyle alstrp, n ile hata ayklayn

    Umarm yardmc olmustur.

    ???'dan ek bir bilgi:

    .gdbinit'imin iinde epeydir kullandgm bir makro var,ve eminim hayat daha kolay hale getiriyor.Az farkla: "x /8i $pc"' kullanrm bu da belli saydaki evrilmemiskoda msaade eder. Daha sonra iyi sekilde boyutu seilmis xterm'imlegdb kts tazelenmis olarak ve kaydrma gerektirmeden grnr.

    Eger kodunuza kesmeler koymak istiyorsanz, sadece int 3 ifadesini kesme olarak kullanabilirsiniz.(gdb ierisine elle adresi gmmek yerine).

    http://belgeler.org Linux Kitapl g 29 / 41

  • Linux Makina Dili NASIL

    Eger gas kullanyorsanz, gas ve gdp ile ilgili belgelere(B90) basvurmalsnz..

    8.3. Baska faydal aralar var m?Elbette, strace size yardm edebilir (FreeBSD'de ktrace ve kdump), bu sistem agr ve sinyallerinitakip etmek iin kullanlr. Ayrntlar iin klavuz sayfasn (man trace) ve strace help komutunudeneyiniz.

    8.4. Linux'tan (BSD, BeOS, v.b.) BIOS islevlerine nasl eri sebilirim?Ksa cevap: Hi bir sekilde. Bu korumal bir kiptir, yerine isletim sistemi servislerini kullann. Tekrar ediy-orum, int 0x10, int 0x13, v.b.'yi kullanamazsnz. Ne sans ki, hemen her sey sistem agrlar vektphane islevleri ile ifade edilebilmektedir. En kt durumda, port erisimini deneyebilir ve bir ekirdekyamasyla istenileni gereklestirmeyi deneyebilirsiniz veya LRMI ktphanesini kullanarak BIOS islevlerineerismeyi deneyin.

    8.5. Sembolik makina dilinde ekirdek modlleri yazmak mmkn m?Evet, aslnda mmkn. Her ne kadar genelde iyi bir kir olmamasna ragmen (bir seyleri ok zorhzlandracaktr), bylesine bir ynteme ihtiya olabilir. Bir modln kendisini yazmak o kadar da zordegildir bir modln kendisinin ntanml evrensel islevleri olmaldr, ayn zamanda baz harici islevleride ekirdekten agrmas gerekebilir. Ayrntlar iin ekirdek kaynak koduna (bir modl olarak derlenebilen-lere) baknz.

    Bu arada, iste size en basitinden bir ekirdek modl (kaynak APJ #8'den mammon_'un rnegine dayan-maktadr):

    section .text

    global init_moduleglobal cleanup_moduleglobal kernel_version

    extern printk

    init_module:push dword str1call printkpop eaxxor eax,eaxret

    cleanup_module:push dword str2call printkpop eaxret

    str1 db "init_module done",0xa,0str2 db "cleanup_module done",0xa,0

    kernel_version db "2.2.18",0

    Bu rnegin yapt g tek sey yaptklarn rapor etmekdir. kernel_version'unu sizinkine uygun haldedegistirin ve modl syle derleyin:

    $ nasm f elf o module.m module.asm$ ld r o module.o module.m

    http://belgeler.org Linux Kitapl g 30 / 41

  • Linux Makina Dili NASIL

    Artk onunla insmod/rmmod/lsmod (root yetkileri gerekir) kullanarak oynayabilirsiniz; ok eglenceli,degil mi?

    8.6. Belle gi dinamik olarak nasl tahsis edebilirim?HPeter Recktenwald 'dan zl bir cevap:

    ebx := 0 (in fact, any value below .bss seems to do)sys_brkeax := current top (of .bss section)

    ebx := [ current top < ebx < (esp 16K) ]sys_brkeax := new top of .bss

    Tiago Gasiba 'dan daha gelismis bir cevap:

    section .bss

    var1 resb 1

    section .text

    ;;allocate memory;

    %define LIMIT 0x4000000 ; yaklask 100Megs

    mov ebx,0 ; data blmnn en alt ksmn elde etcall sys_brk

    cmp eax,1 ; tamam m?je erro1

    add eax,LIMIT ; +LIMIT bellek ksmn tahsis etmov ebx,eaxcall sys_brk

    cmp eax,1 ; tamam m?je erro1

    cmp eax,var1+1 ; data blm byd m?je erro1

    ;;tahsis edilmis alan kullan;

    ; simdi eax data blmnn alt ksmn; barndrr

    mov ebx,eax ; alt ksm kaydetmov eax,var1 ; eax=data blmn baslang ksm

    repeat:mov word [eax],1 ; 1'lerle doldurinc eaxcmp ebx,eax ; su anki pozisyon = en alt?jne repeat

    ;

    http://belgeler.org Linux Kitapl g 31 / 41

  • Linux Makina Dili NASIL

    ;bellegi serbest brak;

    mov ebx,var1 ; bellegi geri vercall sys_brk ; baslangcn=var1 yaparak

    cmp eax,1 ; tamam m?je erro2

    8.7. select sistem a grlarn nasl kullanaca gm anlayamyorum!Patrick Mochel 'den bir cevap

    sys_open' agrdgnz zaman, srecinizle ilgili ak olan tmdosya tantclarnn oldugu bir tablodan bir indis olarak, birdosya tantc dndrr. stdin, stdout ve stderr iin srasyla0, 1 ve 2'dir, nk bunlar sreciniz iin her zaman ak durur.Ayn zamanda ilk atgnz dosya tantcsnn 3 olocagn veartacagn unutmayn.

    Indislemeyi anlamak select'in ne yaptgn anlamanz saglar.select'i agrdgnz zaman, okumak iin, yazmak iin, istisnaidurumlar belirlemek iin belli bir dosya tantcsn beklediginizibelirtiyorsunuzdur. Sreciniz 1024 ak dosya tantcsna sahip olabilir,dolaysiyle fd_set sadece bir bit maskesi gibi alsarak hangidosya tantcsnn hangi islem iin geerli oldugunu belirtir.Bir seyler ifade etti mi?

    Her atgnz fd birer indis oldugu iin, her bir fd_set iin onveya off olmaya ihtiyac vardr, sadece 1024 bitlik bir fd_set yapsnaihtiyacnz vardr. Yapy belirtmek iin 1024 / 32 = 32 long gereklidir.

    Simdi basit bir rnekle aklayalm.Farzedelimki dosya tantcy okumaya alsyorsunuz (zamanasm olmadan).

    fd_set'e bellegi tahsis et

    .data

    my_fds: times 32 dd 0

    okumak istediginiz dosya tantcy an

    fd_set yapsndaki bitini ayarlayn

    ncelikle, 32 dwords'n hangisinde bitin oldugunu belirlemelisiniz.

    Daha sonra, bts'yi kullanarak bu dword iindeki biti ayarlayn,bts biti 32'ye blmden kalana gre ayarlayacaktr.Bu da nce hangi dword ile alsmaya baslamanz belirlemenin sebebidir.

    mov edx, 0mov ebx, 32div ebx

    lea ebx, my_fdsbts ebx[eax * 4], edx

    http://belgeler.org Linux Kitapl g 32 / 41

  • Linux Makina Dili NASIL

    son adm okumak istediginiz dosya tantclar iin yineleyin

    belli bir eylem beklediginiz diger iki fd_set'in herbiri iin detm rnegi tekrarlayn

    Bundan, geriye denklemin diger iki paras kalr n parametresi vezaman asm parametresi. Zaman asm parametresini okuyucuya rnekolarak brakyorum (evet, tembelim), fakat ksaca n parametresiyleilgili konusacagm.

    Bu, setiginiz dosya tantclar ierisindeki en byk degere sahipolann degeri (herhangi bir fd_set'ten) art birdir. Neden art bir?nk, bu degerden maskeyi belirlemek kolaydr. Farzedin ki x dosyagstericisi zerinde bir veri var, fakat sizin ilgilendiginiz en yksekolan (n1). fd_set sadece bir bit maskesi oldugundan, ekirdeginselect'en geri dnmesi veya dnememesi iin verimli bir yola ihtiyacvardr. Dolaysiyle, bu, ilgilendiginiz bitleri maske dsnda brakr,halihazrda atanms bitlerde herhangi bir deger var m diye kontrol eder,eger varsa geri dner. Aslnda, fantastik oldugunu sylemek dsndgm kadarkolay degil. ekirdegin bu maskeyi nasl belirledigini grmek iin,ekirdek kaynak agacndaki fs/select.c'ye baknz.

    Herneyse, bu numaray bilmeye ihtiyacnz vardr, en kolay yol da almsolan en son dosya tantcnn numarasn bir yerlere kaydetmektir.

    Evet, bildiklerim bunlar. Yukardaki kodla ilgili uyar (her zaman ki gibi)su: test edilmemistir. Sanrm alsr, eger alsmazsa beni haberdar edin.Fakat, eger evrensel bir nkleer felakete sebep olursa, o zaman aramayn. ;)

    Simdilik hepsi bu kadar..

    9. Ekler

    9.1. TariheBelgenin gemisini merak ediyorsanz orjinal belgeye(B94) bakabilirsiniz.

    9.2. TesekkrFikirleri, yantlar, yorumlar ve moral destekleri olan herkese tesekkr ederim, ayrca yazls srasyla asagdayazlanlara da tesekkr ederim.

    Linux iin Linus Torvalds'a a86'dan bcc'yi kard g iin Bruce Evans'a NASM iin Simon Tatham ve Julian Hall'a () NASIL belgelerini srdrdkleri iin Greg Hankins ve simdilerde Tim

    Bynum'a

    Belgenin SSS'i iin Raymond Moon'a kkNASIL belgesini Franszca'ya (zc olan taraf orjinal yazarn Fransz olmas ve Ingilizce yazmas)

    evirdi gi iin Eric Dumas'a

    bana yardm ettikleri iin, olmasa bile NASIL belgesini stlendikleri iin Paul Anderson ve Rahim Azizarab'a(

    http://belgeler.org Linux Kitapl g 33 / 41

  • Linux Makina Dili NASIL

    GCC agrmyla ilgili grsleri iin Marc Lehman'a bana argman aktarm uzlasmlar konusunda yardm etti gi iin Abhijit MenonSen'a

    GNU Free Documentation LicenseVersion 1.2, November 2002

    Copyright 2000,2001,2002 Free Software Foundation, Inc.59 Temple Place, Suite 330, Boston, MA 021111307, USA

    Everyone is permitted to copy and distribute verbatim copiesof this license document, but changing it is not allowed.

    1. PREAMBLE

    The purpose of this License is to make a manual, textbook, or other functional and useful document free inthe sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or withoutmodifying it, either commercially or noncommercially. Secondarily, this License preserves for the authorand publisher a way to get credit for their work, while not being considered responsible for modicationsmade by others.

    This License is a kind of "copyleft", which means that derivative works of the document must themselvesbe free in the same sense. It complements the GNU General Public License, which is a copyleft licensedesigned for free software.

    We have designed this License in order to use it for manuals for free software, because free softwareneeds free documentation: a free program should come with manuals providing the same freedoms thatthe software does. But this License is not limited to software manuals; it can be used for any textual work,regardless of subject matter or whether it is published as a printed book. We recommend this Licenseprincipally for works whose purpose is instruction or reference.

    2. APPLICABILITY AND DEFINITIONS

    This License applies to any manual or other work, in any medium, that contains a notice placed by thecopyright holder saying it can be distributed under the terms of this License. Such a notice grants a worldwide, royaltyfree license, unlimited in duration, to use that work under the conditions stated herein. The"Document", below, refers to any such manual or work. Any member of the public is a licensee, and isaddressed as "you". You accept the license if you copy, modify or distribute the work in a way requiringpermission under copyright law.

    A "Modied Version" of the Document means any work containing the Document or a portion of it, eithercopied verbatim, or with modications and/or translated into another language.

    A "Secondary Section" is a named appendix or a frontmatter section of the Document that deals exclu-sively with the relationship of the publishers or authors of the Document to the Document's overall subject(or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if theDocument is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.)The relationship could be a matter of historical connection with the subject or with related matters, or oflegal, commercial, philosophical, ethical or political position regarding them.

    The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those ofInvariant Sections, in the notice that says that the Document is released under this License. If a sectiondoes not t the above denition of Secondary then it is not allowed to be designated as Invariant. The

    http://belgeler.org Linux Kitapl g 34 / 41

  • Linux Makina Dili NASIL

    Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sectionsthen there are none.

    The "Cover Texts" are certain short passages of text that are listed, as FrontCover Texts or BackCoverTexts, in the notice that says that the Document is released under this License. A FrontCover Text maybe at most 5 words, and a BackCover Text may be at most 25 words.

    A "Transparent" copy of the Document means a machinereadable copy, represented in a format whosespecication is available to the general public, that is suitable for revising the document straightforwardlywith generic text editors or (for images composed of pixels) generic paint programs or (for drawings) somewidely available drawing editor, and that is suitable for input to text formatters or for automatic translationto a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent leformat whose markup, or absence of markup, has been arranged to thwart or discourage subsequentmodication by readers is not Transparent. An image format is not Transparent if used for any substantialamount of text. A copy that is not "Transparent" is called "Opaque".

    Examples of suitable formats for Transparent copies include plain ascii without markup, Texinfo inputformat, LaTeX input format, SGML or XML using a publicly available DTD, and standardconforming simpleHTML, PostScript orPDF designed for humanmodication. Examples of transparent image formats includePNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only byproprietary word processors, SGML or XML for which the DTD and/or processing tools are not generallyavailable, and the machinegenerated HTML, PostScript or PDF produced by some word processors foroutput purposes only.

    The "Title Page" means, for a printed book, the title page itself, plus such following pages as are neededto hold, legibly, the material this License requires to appear in the title page. For works in formats whichdo not have any title page as such, "Title Page" means the text near the most prominent appearance ofthe work's title, preceding the beginning of the body of the text.

    A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ orcontains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands fora specic section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements",or "History".) To "Preserve the Title" of such a section when you modify the Document means that itremains a section "Entitled XYZ" according to this denition.

    The Document may include Warranty Disclaimers next to the notice which states that this License appliesto the Document. These Warranty Disclaimers are considered to be included by reference in this License,but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers mayhave is void and has no effect on the meaning of this License.

    3. VERBATIM COPYING

    You may copy and distribute the Document in any medium, either commercially or noncommercially,provided that this License, the copyright notices, and the license notice saying this License applies to theDocument are reproduced in all copies, and that you add no other conditions whatsoever to those of thisLicense. You may not use technical measures to obstruct or control the reading or further copying of thecopies you make or distribute. However, you may accept compensation in exchange for copies. If youdistribute a large enough number of copies you must also follow the conditions in section 3.

    You may also lend copies, under the same conditions stated above, and you may publicly display copies.

    4. COPYING IN QUANTITY

    http://belgeler.org Linux Kitapl g 35 / 41

  • Linux Makina Dili NASIL

    If you publish printed copies (or copies in media that commonly have printed covers) of the Document,numbering more than 100, and the Document's license notice requires Cover Texts, you must enclosethe copies in covers that carry, clearly and legibly, all these Cover Texts: FrontCover Texts on the frontcover, and BackCover Texts on the back cover. Both covers must also clearly and legibly identify you asthe publisher of these copies. The front cover must present the full title with all words of the title equallyprominent and visible. You may add other material on the covers in addition. Copying with changes limitedto the covers, as long as they preserve the title of the Document and satisfy these conditions, can betreated as verbatim copying in other respects.

    If the required texts for either cover are too voluminous to t legibly, you should put the rst ones listed (asmany as t reasonably) on the actual cover, and continue the rest onto adjacent pages.

    If you publish or distribute Opaque copies of the Document numbering more than 100, you must eitherinclude a machinereadable Transparent copy along with each Opaque copy, or state in or with eachOpaque copy a computernetwork location from which the general networkusing public has access todownload using publicstandard network protocols a complete Transparent copy of the Document, freeof added material. If you use the latter option, you must take reasonably prudent steps, when you begindistribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessibleat the stated location until at least one year after the last time you distribute an Opaque copy (directly orthrough your agents or retailers) of that edition to the public.

    It is requested, but not required, that you contact the authors of the Document well before redistributing anylarge number of copies, to give them a chance to provide you with an updated version of the Document.

    5. MODIFICATIONS

    You may copy and distribute a Modied Version of the Document under the conditions of sections 2 and3 above, provided that you release the Modied Version under precisely this License, with the ModiedVersion lling the role of the Document, thus licensing distribution and modication of the Modied Versionto whoever possesses a copy of it. In addition, you must do these things in the Modied Version:

    A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and fromthose of previous versions (which should, if there were any, be listed in the History section of theDocument). You may use the same title as a previous version if the original publisher of that versiongives permission.

    B. List on the Title Page, as authors, one or more persons or entities responsible for authorship ofthe modications in the Modied Version, together with at least ve of the principal authors of theDocument (all of its principal authors, if it has fewer than ve), unless they release you from thisrequirement.

    C. State on the Title page the name of the publisher of the Modied Version, as the publisher.

    D. Preserve all the copyright notices of the Document.

    E. Add an appropriate copyright notice for your modications adjacent to the other copyright notices.

    F. Include, immediately after the copyright notices, a license notice giving the public permission to usethe Modied Version under the terms of this License, in the form shown in the Addendum below.

    G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given inthe Document's license notice.

    H. Include an unaltered copy of this License.

    http://belgeler.org Linux Kitapl g 36 / 41

  • Linux Makina Dili NASIL

    I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least thetitle, year, new authors, and publisher of the Modied Version as given on the Title Page. If there is nosection Entitled "History" in the Document, create one stating the title, year, authors, and publisherof the Document as given on its Title Page, then add an item describing the Modied Version asstated in the previous sentence.

    J. Preserve the network location, if any, given in the Document for public access to a Transparent copyof the Document, and likewise the network locations given in the Document for previous versions itwas based on. These may be placed in the "History" section. You may omit a network location for awork that was published at least four years before the Document itself, or if the original publisher ofthe version it refers to gives permission.

    K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section,and preserve in the section all the substance and tone of each of the contributor acknowledgementsand/or dedications given therein.

    L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Sectionnumbers or the equivalent are not considered part of the section titles.

    M. Delete any section Entitled "Endorsements". Such a section may not be included in the ModiedVersion.

    N. Do not retitle any existing section to be Entitled "Endorsements" or to conict in title with any InvariantSection.

    O. Preserve any Warranty Disclaimers.

    If the Modied Version includes new frontmatter sections or appendices that qualify as Secondary Sec-tions and contain no material copied from the Document, you may at your option designate some or allof these sections as invariant. To do this, add their titles to the list of Invariant Sections in the ModiedVersion's license notice. These titles must be distinct from any other section titles.

    You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of yourModied Version by various parties-for example, statements of peer review or that the text has beenapproved by an organization as the authoritative denition of a standard.

    You may add a passage of up to ve words as a FrontCover Text, and a passage of up to 25 words asa BackCover Text, to the end of the list of Cover Texts in the Modied Version. Only one passage ofFrontCover Text and one of BackCover Text may be added by (or through arrangements made by) anyone entity. If the Document already includes a cover text for the same cover, previously added by you orby arrangement made by the same entity you are acting on behalf of, you may not add another; but youmay replace the old one, on explicit permission from the previous publisher that added the old one.

    The author(s) and publisher(s) of the Document do not by this License give permission to use their namesfor publicity for or to assert or imply endorsement of any Modied Version.

    6. COMBINING DOCUMENTS

    You may combine the Document with other documents released under this License, under the terms