Merhaba. Önceki yazıda disk donanımına değinmiştim. Bu yazı biraz daha yazılım ağırlıklı olacak ama kesmeler ve GÇ portlarıyla ilgili bir yazı ne kadar donanımdan bağımsız olabilirse o kadar. Diskin en temel veri yapısından başlayalım.
Master Boot Record (MBR)
MBR, sabit disklerin ilk sektöründe bulunan, disk bölümlerini (partition) tutan ve bir miktar da kod içeren bir yapı. Bilgisayar açılırken BIOS devreye girer ve işi bittiğinde CMOS'taki boot sequence ayarlarına göre depolama cihazlarının hangisi erişilebilirse onun ilk sektörünü belleğe okur. 1980'lerden beri bu süreç pek değişmedi. Boot edilen ortam disket sürücüyse, okunan boot sektör; sabit diskse MBR'ydi. BIOS için boot sektörüyle MBR'nin farkı yoktur. BIOS, boot etmeye uygun ilk sürücünün birinci sektörünü belleğin 0000:7C00 adresine kopyalar ve işletim sisteminin yüklenmesi için buraya bir far jmp yapar. 1980'lerden bahsettiğimden ve gerçel mod (real mode) adresleme kullandığımdan açıktır ki henüz korumalı modla ilgimiz yok.
MBR'de bulunan kod, hangi disk bölümünün boot etmeye uygun olduğunu saptar, bu bölümün ilk sektörünü alıp belleğe yükler ve oraya dallanır. MBR, disk bölümlerini bir tabloda tutar.
Bu yazıda MBR'yi okumak için Windows'ta HxD adlı editörü kullandım. HxD'yi yönetici olarak çalıştırıp "Open Disk" (Ctrl + Shift + D) dedim ve fiziksel disklerden birini seçtim. "Open as Readonly" olmasını tavsiye ederim.
Linux kullanıcıları daha şanslı çünkü aşağıdaki komut yeterli:
Assembly öğrenmeye çalışırken 3-4 ay uğraşıp MBR'yi görüntüleyebilmek benim için büyük bir başarı gibi gelmişti. Sene bindokuzyüz...
HxD'den aldığım ekran görüntüsü yukarıda. Görüntüyü ben renklendirdim. Kırmızı alan kod, mavi alan disk bölümleme tablosu ve yeşil alan MBR imzası. Sektör doğru olsa bile BIOS 0x55 0xAA'yı görmeden boot etmez. Peki neden 0x55 0xAA? Çünkü (0101 0101 1010 1010)2.
Benzer çıktı linux'ta şöyle:
Hem Windows hem Linux'ta GRUB olduğundan yukarıdaki çıktılar GRUB MBR kodu içeriyor. Kodu incelemeden önce, mavi işaretlediğim bölümleme tablosuna bakalım. CHS ve LBA'ya önceki yazıda değindim. Önceki yazıda debug.exe ile yaptığım örnekte de kod ve imza kolayca görülebiliyor.
Disk Bölümleme Tablosu
Bölümleme tablosu, MBR'nin 01BEh offsetinden başlayan 4x16 byte'lık alandır. Her birincil (primary) disk bölümü 16 byte uzunlukta bir kayıtla ifade edilir. Genişletilmiş (extended) disk bölümlerini şimdilik konu dışında tutarsam, bir önceki ifadeye göre 4'ten fazla (birincil) disk bölümü oluşturulamaz. Aşağıdaki tabloda kayıtların yapısı görülüyor:
Bootable Flag, açılışta o disk bölümünden boot edileceğini gösteriyor. Her MBR'de bir ve yalnız bir tane bulunması gerekir. Bu değer 00h ise bölüm boot edilebilir değildir. 80h, boot edilebilir olduğunu gösterir ancak bazı MBR kodları yalnız yedinci bite bakar. [01h, 7Fh] arası değerler geçersizdir.
CHS adresi kısmını çok kısa atlıyorum.
Bölüm türü alanı, bölümdeki dosya sistemini belirtse de bunun her zaman önemi yoktur. İşletim sistemi ve yükleyiciler bunu çoğunlukla dikkate almaz. Bu değerin bir standardı yoktur. 80'lerde Microsoft ve IBM tarafından kullanılan bazı değerler vardı. minix ve linux yazılırken o zamana kadar kullanılmamış değerler rastgele seçildi ve sonradan de facto standartlaştı. Bununla ilgili ayrıntılı bilgi ve liste Wikipedia'da var: https://en.wikipedia.org/wiki/Partition_type
Başlangıç LBA adresi, başlangıç CHS adresinin LBA'ya çevrilmesiyle elde edilen değerdir. Bölümdeki sektör sayısının görevi adından da anlaşılabilir. Bu değer 512 byte'la çarpılınca disk bölümünün büyüklüğü bulunur ama bu biçimlendirilebilir (formatlanabilir) alan değil ham alandır. İkisinin farkına boot sektörüne geçince değineceğim.
CHS adresleri karışık bir biçimde tutulur. Üç byte'lık alanın ilk byte'ı kafa numarasıdır. İkinci byte'ın düşük anlamlı altı biti sektör numarasını tutar. Üçüncü byte silindir numarasının düşük anlamlı sekiz bitidir. İkinci byte'ın yüksek anlamlı iki biti de silindir numarasının yüksek anlamlı iki bitini içerir. Aşağıda bunu görselleştirmeye çalıştım:
Peki bu tanıdık geliyor mu? Int 13h! 1. Byte DH'ya, 2. Byte CL'ye ve 3. Byte CH'ye. Birbirine mükemmel bir şekilde uyuyor.
Önceki yazıda CHS, 8 GB üstü disklerde yetersiz yazmıştım:
Yaygara yapmadan daha iyimser bir yaklaşımla; MBR kodunun, disk bölümünün bitiş CHS adresiyle ilgilenmediğini, boot sektörünü yüklemek için koda yalnız başlangıç CHS adresinin yeteceğini varsayarak, yalnızca diskin başındaki 8 GB içinde boot edilebilir bölümler oluşturulabilir sonucuna varılır. CHS'yle 8 GB'ın ötesindeki bölümlerden boot edilemez!
Peki 8 GB'ın ötesinde bölüm nasıl oluşturulacak? Her kayıtta 32-bit'lik bir başlangıç LBA adresi var. Eğer bootloader CHS yerine LBA'ya bakarsa; LBA, 232 * 512 byte = 2 TB desteklediğinden; diskin başındaki 2 TB alanda bulunan bölümlerden boot edilebilir. Üstelik sektör sayısı da 32 bit olduğundan 2 TB'lik bir disk bölümü bu sınırın sonuna yerleştirilerek teoride 4 TB'ye kadar olan disklerde MBR kullanılabilir. Teoride diyorum çünkü eski MBR kodlarının bu uç değerlerle sorunsuz çalışacağının garantisi yok.
Önceki yazıda bulunan debug.exe'li ekran görüntüsünü aşağıda tekrar ekledim. Buradaki byte'ları anlamaya çalışalım.
Yukarıda iki disk bölümü var. Birinci bölüm boot edilebilir. Her iki bölüm de FAT16 olarak işaretlenmiş. Birinci bölümün CHS adresi (0, 1, 1) - (255, 15, 63), 63. sektörden başlıyor ve 257 985 sektör uzunlukta. İkinci bölümün CHS adresi (256, 0, 1) - (511, 15, 63), 258 048. sektörden başlıyor ve 258 048 sektör uzunlukta.
Bu tablo neden önemli? Kendi işletim sistemimi yazıyor olsam hiçbir önemi yok. Bunu dikkate almayıp kendim daha iyi bir tablo oluşturacağım diyebilirim ama diğer tüm işletim sistemi üreticileri bu yapı üzerinde anlaştığından kendi tablo yapımı kullanırsam diğer işletim sistemleriyle uyumlu çalışamam.
Bölümleme Tablosuna da LBA'sına da Lanet Olsun...
Evet, hala kod yazmaya geçemedim ama bu bölümde artık örneklere başlayacağım. Önce deneme için iki sanal makina oluşturdum. İlkine önceki yazıdaki örnek için VirtualBox'ta DOS6.22 kurmuştum. Bunun için 32 MB RAM ve 500 MB sabit disk yeterli. Bu makinada bir tane ağ kartı var, bunu host-only yaptım (Settings -> Network -> Enable Network Adapter, Attached to: Host-only Adapter). DOS disket imajları internetten bulunabilir. Bir de Damn Small Linux (DSL) iso'su kullandım. Ubuntu, Knoppix vb. live dağıtımlar 32 MB RAM'le çalışmıyor. DSL 50MB'lık bir iso'ya sahip. Artık geliştirilmediğinden buradan veya şuradan indirilebilir. DSL'in en yakın alternatifi TinyCore Linux, iso olarak 14MB ama en az 64 MB RAM'le çalışıyor.
Makinayı DOS disketiyle açtıktan sonra kurulum, bir disk bölümü oluşturuyor ama ben kurulumdan çıkıp fdisk'le elle bir bölüm oluşturdum. fdisk'te:
Bunu yaptıktan sonra ekrandaki uyarı hiçbir bölümün aktif olmadığını belirtiyor. Yani şu anda hiçbir bölüm kaydının ilk byte'ı 80h değil. 2 - 1 - Esc ile bu uyarı kayboldu. Ardından tekrar bir birincil bölüm oluşturmak istediğimde hata aldım. Maalesef fdisk birden fazla birincil bölüm oluşturamıyor. Genişletilmiş bölüm oluşturulabilir ama buna yazının sonunda değineceğim. Esc'e basıp ana menüden çıktım ve disketi çıkarıp makinayı DSL ile açtım. Bu arada, disk bölümleri oluşturulduktan veya silindikten sonra, DOS yeniden başlatılmazsa yeni disk bölümlerini göremez.
DSL'in terminalinde sudo fdisk -l diyip oluşturduğum bölümü gördüm. Bir disk bölümü daha ekledim:
Bilgisayarı tekrar DOS disketiyle açınca C:'yi ve D:'yi bulup formatladı. Standart bir Microsoft kurulumu, ardarda Enter'a basarak ve arada disketleri değiştirerek tamamlandı. Bu arada, son disketi sürücüde unutup "Non-system disk error" alanlara uyarı: Eskiden MBR/boot sektör virüsü bulaşmış disketlerle bilgisayarı açınca, boot sırasında virüs kendini belleğe yazıp aktifleşir, bu hatayı gösterir ve kullanıcının bir tuşa basmasını beklerdi. Bundan korunmak için bir tuşa basmak yerine bilgisayarı yeniden başlatmak gerekirdi. Virüsü temizlemek için de fdisk /mbr komutuyla sabit diskin MBR kodu yeniden yazılırdı.
DOS kurulduktan sonra debug.exe ile MBR'ye tekrar baktım:
Makinayı bir daha DSL'le açtım. Ekranın sağında makinanın IP'si görünmeli. IP'yi, hosttan, sanal makinaya dosya kopyalarken kullanacağım. Benim hostum da linux olduğundan scp ile dosya kopyalayabiliyorum. Windows kullanıcıları sanal makinada DSL -> System -> Daemons -> ssh -> start ile sshd'yi başlatıp WinSCP kullanmak zorunda (Cygwin de iş görebilir).
Kopyalayacağım dosya Norton Utilities paketindeki disk editor. DISKEDIT.EXE adında iki farklı sürümü var. Biri Norton Utilities v8.0 (1994) paketinden diğeri de Norton Utilities 2000 paketinden. İlk sürüm CHS'yi desteklerken, ikinci sürümün dosyası daha büyük ve LBA'yı destekliyor. Disk editörle çalışmak çok pratik, bu nedenle bu dosyayı internetten bulabilenler kendilerini şanslı saymalı.
Disk editörü kopyalayıp bilgisayarı yeniden başlattım ve DOS'u açtım. Editörü başlatıp Alt+D ile sürücüleri görüntüledim. Tür (type) olarak "Physical Disk" seçip sabit diski açtığımda sektörleri HxD gibi gösterdi. Ardından "View as Partition Table" (F6) seçtiğimde yukarıda elle hesaplamak zorunda kaldığım bütün bilgiler göründü. Disk editör daha sonra boot sektörü ve FAT için de işe yarayacak. Bu yüzden diskte durmasında yarar var.
Norton Utilities'in iso'su olanların, DOS'ta CD sürücüyü tanıtmaları gerekiyor. Okurlardan DOS kullanmamış olanlar, CD sürücü tanıtmanın gerekliliğine hayret edebilir ama o zaman öyleydi. Bu işlemi ayrı bir yazıda anlatıp, buraya bağlantısını vereceğim.
Ekran görüntüsüne göre ikinci disk bölümü 511. silindirin sonunda bitiyor. Alt+I'ye basıp çıkan menüde "Drive Info"yu seçince diskin özelliklerini de gösterdi (yanda).
Drive Number: 80 Hex (Birinci fiziksel disk)
Int 13x: Yes (BIOS, LBA destekliyor)
Sides: 16 (Kafalar)
Tracks: 1015 (Silindirler)
Sectors/track: 63 (Silindir başına sektör sayısı)
Total Sectors: 1 024 000 (LBA adresi)
Bu bilgiler Int 13h/08 alt fonksiyonuyla da alınabilir:
Silindir sayısı 3F6h, sektör sayısı 3Fh, kafa sayısı 0Fh. Yazmaçlardaki değerlerin anlamları Ralf Brown'un belgelerinde var (Int13h/08). Yukarıda DL=02 oldu çünkü test için makinaya bir disk daha takmıştım.
Şimdi, diskin rastgele bir sektörüne "denizyildizi" yazacağım (tamamen rastgele bir kelime). Örn. CHS 600,0,1'e yazayım. Bunun LBA karşılığı 604 800 (CHS'den LBA'ya dönüşüm formülü bir önceki yazıda var). Disk editörü açıp Alt+P'ye bastım ve çıkan diyalogda LBA adresini yazdım. Diske yazabilmek için Tools -> Configuration altında Read-Only'nin yanındaki işareti kaldırıp OK'a bastım. Tab'la sağa geçince heksadesimal yerine metin yazılıyor. Alt+X'e ve sonra değişiklikler diske yazılsın mı diyalogunda "yaz"a bastım.
Aynısını debug.exe'yle yapmak için ufak bir kod yazdım ve Int13h/43h altfonsiyonunu kullandım. 42h altfonksiyonuyla birlikte ikisi Int13h genişlemeleri olarak geçiyor.
Son satır DAP (Disk Address Packet) adlı veri yapısı. Sırasıyla, 10h DAP uzunluğu, 00 ayrılmış, 00 01 okunacak/yazılacak sektör sayısı, (0000:0200)16 kullanılacak buffer. Segmentin 0000 olması yanıltmasın, kod oraya kendi segmentini yazacak. (09 3A 80)16 da LBA adresi (qword). Bunu g komutuyla çalıştırdım ve kod belirttiğim sektöre veriyi yazdı. Yazdığım veriyi yine LBA'yla ama denetleyicinin portlarını kullanarak okuyacağım. Önceki yazıda kullandığım kodu küçük farklarla yeniden yazdım (kolaylık için yine ofsetleri ekledim):
Tekrar d 0200 komutuyla kontrol ettiğimde yazdığım veriyi doğru olarak okudum.
Mantıksal Disk Bölümleri
Bu konuya başlamadan önce VirtualBox'ta 32 MB RAM ve 1GB diskli ikinci makinayı oluşturdum (aynı şekilde host only adapter ile). FreeDOS.org'dan CD iso'sunu indirip makinaya taktım. Legacy ile CD arasında yalnız boot modunda fark var, içerikte bir fark yok. Elle disk bölümleme için "Install to harddisk" dedim, sonra dili seçip "No - Return to DOS"u seçtim ve fdisk'i açtım. FreeDOS'un fdisk'i DOS6.22'den farklı olarak FAT32 desteğiyle geliyor. Fat32, 1996'da ortaya çıktı ve Win95 OSR2 ile kullanıma girdi. Ayrıntısına sonraki yazılarda gireceğim. Bu kısımla ilgili not: fdisk, bölüm oluşturulurken diskin LBA desteğini test eder. LBA desteklemeyen disklerde bölüm türü byte'ı FAT16 ve FAT32 için sırasıyla 06h ve 0Bh olurken, destekleyenlerde 07h ve 0Ch olur.
Yukarıdaki görselde görülen FAT32 desteği açılsın mı sorusu aslında 2GB'den büyük diskler için gerekli, "N" diyip geçtim. Bir tane 340MB birincil bölümünü "1 - 1 - N - 340 - (Enter) - (Esc)" kombinasyonuyla oluşturdum ve ana menüdeki (2) seçeneğiyle, bölümü aktifleştirdim. Öncekinden farklı olarak "1 - 2 - (Enter) - (Esc)" tuş kombinasyonuyla uzatılmış veya mantıksal (extended veya logical) bir bölüm oluşturdum. fdisk, uzatılmış bölümde mantıksal sürücü oluşturmak isteyip istemediğimi soracak. Buna 340 MB verip Enter'a bastım. Geri kalan alanda son bir disk oluşturmak için tekrar Enter'a bastım. Burada bir hatadan ötürü fdisk hala 2MB alan var zannediyor ve Enter'a basılırsa bölümleme tablosu hatalı yazılıyor. Bu nedenle Esc'e bastım.
fdisk'in dördüncü seçeneğine girdiğimde diskler yukarıdaki gibiydi. fdisk'ten çıkıp bilgisayarı yeniden başlattım ve kuruluma devam ettim. "Do you want to format your drive?"a Yes dedim ve "Full installation"ı seçip kurulumu başlattım. Bitince de CD'yi çıkarıp makinayı yeniden başlattım.
Şu anda FreeDOS'ta 3 sabit disk sürücüsü (C:, D: ve E:) olmasına rağmen diskeditörle veya debug.exe'yle MBR'de iki disk bölümü görüyorum. O halde üçüncü nerede? (Diskeditör varsa buna da kopyalayın)
Diskeditör'le baktığımda diskte 520 silindir görünüyordü. (bu bölümde eski sürüm diskeditörü kullandım, bir nedeni yok). İlk bölüm 173. silindirde bitiyor. O halde birincil bölüm doğru. İkinci bölüm EXTEND olarak görünüyor. İkinci bölümün olduğu CHS (173,0,1) adresinde başka bir bölümleme tablosu daha var. EXTEND seçiliyken Enter'a basınca, o sektör bölümleme tablosu biçiminde gösterilecek.
Bu bölümleme tablosu öncekine benziyor ama aynısı değil. Sağ alt köşede (173,0,1) görüyorum yani MBR'da değilim. F2'yle Hex görünümüne geçtiğimde bu sektörde kod yok ve imza var! Bu tablodaki ilk girdi (173,1,1)'den 346. silindire kadar bir bölüm ve ikinci girdi onun bittiği yerde tekrar bir uzatılmış (EXTEND) bölüm. Bu 'Extend'i seçip Enter'a basınca (346,0,1) sektöründe kodu bulunmayan bir bölümleme tablosu daha görünüyor ve tablodaki bölüm, (346,1,1)'den diskin sonuna kadar. Anlaşılacağı üzere uzatılmış bölüm, içindeki bölümleri bağlı listede tutan bir yapı.
Bildiğim kadarıyla, uzatılmış bölümlerin boot edilebilir olmaması için teoride bir engel yok ama MBR'deki kodun, ilk tabloda aktif bir bölüm yoksa uzatılmış bölümler içinde aktif olanı araması gerek. Bu da 512 byte'la sınırlı olması gereken kodun uzaması anlamına geliyor. Standardı belirleyen mi istememiş yoksa başka bir neden mi var, emin değilim. Bu konuda Wikipedia'nın Extended Boot Record maddesinde başka örnekler bulunabilir.
MBR Kodu Nasıl Çalışır?
MBR kodunu incelemek için şimdiye kadar kurduğum iki makinayı da DSL ile açıp aşağıdaki komutla MBR'lerini kaydettim:
Güncel linux dağıtımı olan bir makinada aynı komut;
Sonra linux bir makinada;
Yazıyı uzatmamak için assembly kodunu satır satır incelemek yerine DOS6.22 ve FreeDOS'un çıktılarını açıklama satırlarıyla Google Drive'a yükledim. Genel olarak yapılan ikisinde de aynı: Stack ayarlamasından sonra sektör kendini DOS'ta 0:0600h ve FreeDOS'ta 1FE0h:7C00h adresine kopyalıyor. Çünkü sonradan yüklenecek boot sektör kodunun da 7C00h adresine yerleşmesi gerek. BIOS için boot sektör ve MBR kodlarının farkının olmadığını, BIOS'un görevinin boot edilecek ortamın ilk sektörünü 0:7C00h'a okuyup, sonundaki 55h AAh byte'larını kontrol etmek ve bu adrese dallanmak olduğunu yazmıştım. Eğer boot edilen ortam disketse MBR bulunmadığından 0:7C00h'a boot sektör okunur.
DOS'ta bir ve yalnız bir 80h girdisi olup olmadığı kontrol edilirken, FreeDOS'ta en yüksek değerli biti 1 olan ilk girdiye ait boot sektör okunuyor. Sektör okunamadıysa "read error" veriyor. Bundan başka herhangi bir kontrol yok.
Disk okuma konusunda DOS, bölümleme tablosundan CHS değerlerini aldığı sektörü, DI'de tuttuğu bir sayacı kullanarak beş kere okumaya çalışıyor. Beşinci sefer okunamazsa "Error loading OS" hatasını veriyor. DOS'ta LBA desteği bulunmazken, FreeDOS önce LBA desteğini kontrol ediyor. Destekleniyorsa 7CCDh'da tuttuğu DAP'la sektörü okuyor. Desteklenmiyorsa DOS'taki kodun hemen hemen aynısı çalışıyor. Sektör okunduktan sonra imza kontrolü yapılıyor (FreeDOS'ta bu, fonksiyonun dönüşünde) ve program 0:7C00h adresine atlıyor.
Aslında bu konunun devamında GRUB, GPT ve UEFI'yi ele almak gerekiyor ama UEFI benim de çok ayrıntılı bilmediğim bir teknoloji olduğundan bunları sonraki bir yazıda toparlayacağım. Bu yazıda anlattıklarım her ne kadar 1980'lerin teknolojisi olsa da, UEFI kullanılmadığında bugün de çalıştırılan kod, ufak farklar dışında aynı. Buraya kadar MBR'i bitirmiş olduk. Sonraki yazıda MBR'den sonraki adım olan boot sektörünü ele alacağım.
Master Boot Record (MBR)
MBR, sabit disklerin ilk sektöründe bulunan, disk bölümlerini (partition) tutan ve bir miktar da kod içeren bir yapı. Bilgisayar açılırken BIOS devreye girer ve işi bittiğinde CMOS'taki boot sequence ayarlarına göre depolama cihazlarının hangisi erişilebilirse onun ilk sektörünü belleğe okur. 1980'lerden beri bu süreç pek değişmedi. Boot edilen ortam disket sürücüyse, okunan boot sektör; sabit diskse MBR'ydi. BIOS için boot sektörüyle MBR'nin farkı yoktur. BIOS, boot etmeye uygun ilk sürücünün birinci sektörünü belleğin 0000:7C00 adresine kopyalar ve işletim sisteminin yüklenmesi için buraya bir far jmp yapar. 1980'lerden bahsettiğimden ve gerçel mod (real mode) adresleme kullandığımdan açıktır ki henüz korumalı modla ilgimiz yok.
MBR'de bulunan kod, hangi disk bölümünün boot etmeye uygun olduğunu saptar, bu bölümün ilk sektörünü alıp belleğe yükler ve oraya dallanır. MBR, disk bölümlerini bir tabloda tutar.
Bu yazıda MBR'yi okumak için Windows'ta HxD adlı editörü kullandım. HxD'yi yönetici olarak çalıştırıp "Open Disk" (Ctrl + Shift + D) dedim ve fiziksel disklerden birini seçtim. "Open as Readonly" olmasını tavsiye ederim.
Linux kullanıcıları daha şanslı çünkü aşağıdaki komut yeterli:
sudo dd if=/dev/sda count=1 bs=512 | hexdump -C -v
Assembly öğrenmeye çalışırken 3-4 ay uğraşıp MBR'yi görüntüleyebilmek benim için büyük bir başarı gibi gelmişti. Sene bindokuzyüz...
HxD'den aldığım ekran görüntüsü yukarıda. Görüntüyü ben renklendirdim. Kırmızı alan kod, mavi alan disk bölümleme tablosu ve yeşil alan MBR imzası. Sektör doğru olsa bile BIOS 0x55 0xAA'yı görmeden boot etmez. Peki neden 0x55 0xAA? Çünkü (0101 0101 1010 1010)2.
Benzer çıktı linux'ta şöyle:
Hem Windows hem Linux'ta GRUB olduğundan yukarıdaki çıktılar GRUB MBR kodu içeriyor. Kodu incelemeden önce, mavi işaretlediğim bölümleme tablosuna bakalım. CHS ve LBA'ya önceki yazıda değindim. Önceki yazıda debug.exe ile yaptığım örnekte de kod ve imza kolayca görülebiliyor.
Disk Bölümleme Tablosu
Bölümleme tablosu, MBR'nin 01BEh offsetinden başlayan 4x16 byte'lık alandır. Her birincil (primary) disk bölümü 16 byte uzunlukta bir kayıtla ifade edilir. Genişletilmiş (extended) disk bölümlerini şimdilik konu dışında tutarsam, bir önceki ifadeye göre 4'ten fazla (birincil) disk bölümü oluşturulamaz. Aşağıdaki tabloda kayıtların yapısı görülüyor:
Offset | Büyüklük | Açıklama |
---|---|---|
0x00 | byte | Bootable Flag |
0x01 | 3 byte | Başlangıç CHS adresi |
0x04 | byte | Bölümün türü |
0x05 | 3 byte | Bitiş CHS adresi |
0x08 | dword | Başlangıç LBA adresi |
0x0C | dword | Bölümdeki sektör sayısı |
Bootable Flag, açılışta o disk bölümünden boot edileceğini gösteriyor. Her MBR'de bir ve yalnız bir tane bulunması gerekir. Bu değer 00h ise bölüm boot edilebilir değildir. 80h, boot edilebilir olduğunu gösterir ancak bazı MBR kodları yalnız yedinci bite bakar. [01h, 7Fh] arası değerler geçersizdir.
CHS adresi kısmını çok kısa atlıyorum.
Bölüm türü alanı, bölümdeki dosya sistemini belirtse de bunun her zaman önemi yoktur. İşletim sistemi ve yükleyiciler bunu çoğunlukla dikkate almaz. Bu değerin bir standardı yoktur. 80'lerde Microsoft ve IBM tarafından kullanılan bazı değerler vardı. minix ve linux yazılırken o zamana kadar kullanılmamış değerler rastgele seçildi ve sonradan de facto standartlaştı. Bununla ilgili ayrıntılı bilgi ve liste Wikipedia'da var: https://en.wikipedia.org/wiki/Partition_type
Başlangıç LBA adresi, başlangıç CHS adresinin LBA'ya çevrilmesiyle elde edilen değerdir. Bölümdeki sektör sayısının görevi adından da anlaşılabilir. Bu değer 512 byte'la çarpılınca disk bölümünün büyüklüğü bulunur ama bu biçimlendirilebilir (formatlanabilir) alan değil ham alandır. İkisinin farkına boot sektörüne geçince değineceğim.
CHS adresleri karışık bir biçimde tutulur. Üç byte'lık alanın ilk byte'ı kafa numarasıdır. İkinci byte'ın düşük anlamlı altı biti sektör numarasını tutar. Üçüncü byte silindir numarasının düşük anlamlı sekiz bitidir. İkinci byte'ın yüksek anlamlı iki biti de silindir numarasının yüksek anlamlı iki bitini içerir. Aşağıda bunu görselleştirmeye çalıştım:
1. Byte | 2. Byte | 3. Byte | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
H7 | H6 | H5 | H4 | H3 | H2 | H1 | H0 | C9 | C8 | S5 | S4 | S3 | S2 | S1 | S0 | C7 | C6 | C5 | C4 | C3 | C2 | C1 | C0 |
Peki bu tanıdık geliyor mu? Int 13h! 1. Byte DH'ya, 2. Byte CL'ye ve 3. Byte CH'ye. Birbirine mükemmel bir şekilde uyuyor.
Önceki yazıda CHS, 8 GB üstü disklerde yetersiz yazmıştım:
Yaygara yapmadan daha iyimser bir yaklaşımla; MBR kodunun, disk bölümünün bitiş CHS adresiyle ilgilenmediğini, boot sektörünü yüklemek için koda yalnız başlangıç CHS adresinin yeteceğini varsayarak, yalnızca diskin başındaki 8 GB içinde boot edilebilir bölümler oluşturulabilir sonucuna varılır. CHS'yle 8 GB'ın ötesindeki bölümlerden boot edilemez!
Peki 8 GB'ın ötesinde bölüm nasıl oluşturulacak? Her kayıtta 32-bit'lik bir başlangıç LBA adresi var. Eğer bootloader CHS yerine LBA'ya bakarsa; LBA, 232 * 512 byte = 2 TB desteklediğinden; diskin başındaki 2 TB alanda bulunan bölümlerden boot edilebilir. Üstelik sektör sayısı da 32 bit olduğundan 2 TB'lik bir disk bölümü bu sınırın sonuna yerleştirilerek teoride 4 TB'ye kadar olan disklerde MBR kullanılabilir. Teoride diyorum çünkü eski MBR kodlarının bu uç değerlerle sorunsuz çalışacağının garantisi yok.
Önceki yazıda bulunan debug.exe'li ekran görüntüsünü aşağıda tekrar ekledim. Buradaki byte'ları anlamaya çalışalım.
80 | 01 01 00 | 06 | 0F 3F FF | 00 00 00 C1 | EF 03 00 00
00 | 00 41 00 | 06 | 0F 7F FF | 00 F0 03 00 | 00 F0 03 00
00 | 00 41 00 | 06 | 0F 7F FF | 00 F0 03 00 | 00 F0 03 00
Yukarıda iki disk bölümü var. Birinci bölüm boot edilebilir. Her iki bölüm de FAT16 olarak işaretlenmiş. Birinci bölümün CHS adresi (0, 1, 1) - (255, 15, 63), 63. sektörden başlıyor ve 257 985 sektör uzunlukta. İkinci bölümün CHS adresi (256, 0, 1) - (511, 15, 63), 258 048. sektörden başlıyor ve 258 048 sektör uzunlukta.
Bu tablo neden önemli? Kendi işletim sistemimi yazıyor olsam hiçbir önemi yok. Bunu dikkate almayıp kendim daha iyi bir tablo oluşturacağım diyebilirim ama diğer tüm işletim sistemi üreticileri bu yapı üzerinde anlaştığından kendi tablo yapımı kullanırsam diğer işletim sistemleriyle uyumlu çalışamam.
Bölümleme Tablosuna da LBA'sına da Lanet Olsun...
Evet, hala kod yazmaya geçemedim ama bu bölümde artık örneklere başlayacağım. Önce deneme için iki sanal makina oluşturdum. İlkine önceki yazıdaki örnek için VirtualBox'ta DOS6.22 kurmuştum. Bunun için 32 MB RAM ve 500 MB sabit disk yeterli. Bu makinada bir tane ağ kartı var, bunu host-only yaptım (Settings -> Network -> Enable Network Adapter, Attached to: Host-only Adapter). DOS disket imajları internetten bulunabilir. Bir de Damn Small Linux (DSL) iso'su kullandım. Ubuntu, Knoppix vb. live dağıtımlar 32 MB RAM'le çalışmıyor. DSL 50MB'lık bir iso'ya sahip. Artık geliştirilmediğinden buradan veya şuradan indirilebilir. DSL'in en yakın alternatifi TinyCore Linux, iso olarak 14MB ama en az 64 MB RAM'le çalışıyor.
Makinayı DOS disketiyle açtıktan sonra kurulum, bir disk bölümü oluşturuyor ama ben kurulumdan çıkıp fdisk'le elle bir bölüm oluşturdum. fdisk'te:
1 - 1 - N - 25% - Esc
Bunu yaptıktan sonra ekrandaki uyarı hiçbir bölümün aktif olmadığını belirtiyor. Yani şu anda hiçbir bölüm kaydının ilk byte'ı 80h değil. 2 - 1 - Esc ile bu uyarı kayboldu. Ardından tekrar bir birincil bölüm oluşturmak istediğimde hata aldım. Maalesef fdisk birden fazla birincil bölüm oluşturamıyor. Genişletilmiş bölüm oluşturulabilir ama buna yazının sonunda değineceğim. Esc'e basıp ana menüden çıktım ve disketi çıkarıp makinayı DSL ile açtım. Bu arada, disk bölümleri oluşturulduktan veya silindikten sonra, DOS yeniden başlatılmazsa yeni disk bölümlerini göremez.
DSL'in terminalinde sudo fdisk -l diyip oluşturduğum bölümü gördüm. Bir disk bölümü daha ekledim:
sudo fdisk /dev/hda
n - p - 2 - (Enter) - 512
t - 2 - 6
p
w
n - p - 2 - (Enter) - 512
t - 2 - 6
p
w
Bilgisayarı tekrar DOS disketiyle açınca C:'yi ve D:'yi bulup formatladı. Standart bir Microsoft kurulumu, ardarda Enter'a basarak ve arada disketleri değiştirerek tamamlandı. Bu arada, son disketi sürücüde unutup "Non-system disk error" alanlara uyarı: Eskiden MBR/boot sektör virüsü bulaşmış disketlerle bilgisayarı açınca, boot sırasında virüs kendini belleğe yazıp aktifleşir, bu hatayı gösterir ve kullanıcının bir tuşa basmasını beklerdi. Bundan korunmak için bir tuşa basmak yerine bilgisayarı yeniden başlatmak gerekirdi. Virüsü temizlemek için de fdisk /mbr komutuyla sabit diskin MBR kodu yeniden yazılırdı.
DOS kurulduktan sonra debug.exe ile MBR'ye tekrar baktım:
Makinayı bir daha DSL'le açtım. Ekranın sağında makinanın IP'si görünmeli. IP'yi, hosttan, sanal makinaya dosya kopyalarken kullanacağım. Benim hostum da linux olduğundan scp ile dosya kopyalayabiliyorum. Windows kullanıcıları sanal makinada DSL -> System -> Daemons -> ssh -> start ile sshd'yi başlatıp WinSCP kullanmak zorunda (Cygwin de iş görebilir).
Kopyalayacağım dosya Norton Utilities paketindeki disk editor. DISKEDIT.EXE adında iki farklı sürümü var. Biri Norton Utilities v8.0 (1994) paketinden diğeri de Norton Utilities 2000 paketinden. İlk sürüm CHS'yi desteklerken, ikinci sürümün dosyası daha büyük ve LBA'yı destekliyor. Disk editörle çalışmak çok pratik, bu nedenle bu dosyayı internetten bulabilenler kendilerini şanslı saymalı.
Disk editörü kopyalayıp bilgisayarı yeniden başlattım ve DOS'u açtım. Editörü başlatıp Alt+D ile sürücüleri görüntüledim. Tür (type) olarak "Physical Disk" seçip sabit diski açtığımda sektörleri HxD gibi gösterdi. Ardından "View as Partition Table" (F6) seçtiğimde yukarıda elle hesaplamak zorunda kaldığım bütün bilgiler göründü. Disk editör daha sonra boot sektörü ve FAT için de işe yarayacak. Bu yüzden diskte durmasında yarar var.
Norton Utilities'in iso'su olanların, DOS'ta CD sürücüyü tanıtmaları gerekiyor. Okurlardan DOS kullanmamış olanlar, CD sürücü tanıtmanın gerekliliğine hayret edebilir ama o zaman öyleydi. Bu işlemi ayrı bir yazıda anlatıp, buraya bağlantısını vereceğim.
Ekran görüntüsüne göre ikinci disk bölümü 511. silindirin sonunda bitiyor. Alt+I'ye basıp çıkan menüde "Drive Info"yu seçince diskin özelliklerini de gösterdi (yanda).
Drive Number: 80 Hex (Birinci fiziksel disk)
Int 13x: Yes (BIOS, LBA destekliyor)
Sides: 16 (Kafalar)
Tracks: 1015 (Silindirler)
Sectors/track: 63 (Silindir başına sektör sayısı)
Total Sectors: 1 024 000 (LBA adresi)
Bu bilgiler Int 13h/08 alt fonksiyonuyla da alınabilir:
Silindir sayısı 3F6h, sektör sayısı 3Fh, kafa sayısı 0Fh. Yazmaçlardaki değerlerin anlamları Ralf Brown'un belgelerinde var (Int13h/08). Yukarıda DL=02 oldu çünkü test için makinaya bir disk daha takmıştım.
Şimdi, diskin rastgele bir sektörüne "denizyildizi" yazacağım (tamamen rastgele bir kelime). Örn. CHS 600,0,1'e yazayım. Bunun LBA karşılığı 604 800 (CHS'den LBA'ya dönüşüm formülü bir önceki yazıda var). Disk editörü açıp Alt+P'ye bastım ve çıkan diyalogda LBA adresini yazdım. Diske yazabilmek için Tools -> Configuration altında Read-Only'nin yanındaki işareti kaldırıp OK'a bastım. Tab'la sağa geçince heksadesimal yerine metin yazılıyor. Alt+X'e ve sonra değişiklikler diske yazılsın mı diyalogunda "yaz"a bastım.
Aynısını debug.exe'yle yapmak için ufak bir kod yazdım ve Int13h/43h altfonsiyonunu kullandım. 42h altfonksiyonuyla birlikte ikisi Int13h genişlemeleri olarak geçiyor.
mov cx,000C ; 12 karakter
mov si,0120 ; 0120h'dan
mov di,0200 ; 0200h'ya
repz movsb ; kopyala
xor ax,ax
mov cl,FA ; 0FAh word daha
repz stosw ; kopyala
inc si ; sonraki buffer DAP
push ds
pop ax ; DS'i al DAP'daki alana
mov word ptr [si+06],ax ; yaz
mov ax,4300
mov dl,80
int 13 ; int 13h'u cagir
int 3
db 00
db 'denizyildizi',0
db 10 00 01 00 00 02 00 00 80 3A 09 00 00 00 00 00
mov si,0120 ; 0120h'dan
mov di,0200 ; 0200h'ya
repz movsb ; kopyala
xor ax,ax
mov cl,FA ; 0FAh word daha
repz stosw ; kopyala
inc si ; sonraki buffer DAP
push ds
pop ax ; DS'i al DAP'daki alana
mov word ptr [si+06],ax ; yaz
mov ax,4300
mov dl,80
int 13 ; int 13h'u cagir
int 3
db 00
db 'denizyildizi',0
db 10 00 01 00 00 02 00 00 80 3A 09 00 00 00 00 00
Son satır DAP (Disk Address Packet) adlı veri yapısı. Sırasıyla, 10h DAP uzunluğu, 00 ayrılmış, 00 01 okunacak/yazılacak sektör sayısı, (0000:0200)16 kullanılacak buffer. Segmentin 0000 olması yanıltmasın, kod oraya kendi segmentini yazacak. (09 3A 80)16 da LBA adresi (qword). Bunu g komutuyla çalıştırdım ve kod belirttiğim sektöre veriyi yazdı. Yazdığım veriyi yine LBA'yla ama denetleyicinin portlarını kullanarak okuyacağım. Önceki yazıda kullandığım kodu küçük farklarla yeniden yazdım (kolaylık için yine ofsetleri ekledim):
0100 mov ax,0001
0103 mov dx,01F2
0106 out dx,al ; Sektor sayisi = 1
0107 inc dx ; dx = 01F3
0108 mov al,80
010A out dx,al ; LBA adres1 = 80h
010B inc dx ; dx = 01F4
010C mov al,3A
010E out dx,al ; LBA adres2 = 03A
010F inc dx ; dx = 01F5
0110 mov al,09
0112 out dx,al ; LBA adres3 = 09h
0113 inc dx ; dx = 01F6
0114 mov al,E0 ; LBA modu, master disk
0116 out dx,al ; LBA adres4 = 0h
0117 inc dx ; dx = 1F7
0118 mov al,20
011A out dx,al ; 20h ATA Sektor okuma komutu
011B in al,dx ; Durum yazmacini oku
011C test al,58 ; 0101 1000: Drive ready | Seek complete | Buffer ready
011E jz 011B ; Dataya erisene kadar bekle
0120 mov dx,01F0
0123 mov bx,0200
0126 in ax,dx ; Datayi oku (word)
0127 mov [bx],ax ; Bellege kopyala
0129 inc bx
012A inc bx
012B cmp bx,0400 ; 0200h byte
012F jnz 0126
0131 int 3 ; Breakpoint
0103 mov dx,01F2
0106 out dx,al ; Sektor sayisi = 1
0107 inc dx ; dx = 01F3
0108 mov al,80
010A out dx,al ; LBA adres1 = 80h
010B inc dx ; dx = 01F4
010C mov al,3A
010E out dx,al ; LBA adres2 = 03A
010F inc dx ; dx = 01F5
0110 mov al,09
0112 out dx,al ; LBA adres3 = 09h
0113 inc dx ; dx = 01F6
0114 mov al,E0 ; LBA modu, master disk
0116 out dx,al ; LBA adres4 = 0h
0117 inc dx ; dx = 1F7
0118 mov al,20
011A out dx,al ; 20h ATA Sektor okuma komutu
011B in al,dx ; Durum yazmacini oku
011C test al,58 ; 0101 1000: Drive ready | Seek complete | Buffer ready
011E jz 011B ; Dataya erisene kadar bekle
0120 mov dx,01F0
0123 mov bx,0200
0126 in ax,dx ; Datayi oku (word)
0127 mov [bx],ax ; Bellege kopyala
0129 inc bx
012A inc bx
012B cmp bx,0400 ; 0200h byte
012F jnz 0126
0131 int 3 ; Breakpoint
Tekrar d 0200 komutuyla kontrol ettiğimde yazdığım veriyi doğru olarak okudum.
Mantıksal Disk Bölümleri
Bu konuya başlamadan önce VirtualBox'ta 32 MB RAM ve 1GB diskli ikinci makinayı oluşturdum (aynı şekilde host only adapter ile). FreeDOS.org'dan CD iso'sunu indirip makinaya taktım. Legacy ile CD arasında yalnız boot modunda fark var, içerikte bir fark yok. Elle disk bölümleme için "Install to harddisk" dedim, sonra dili seçip "No - Return to DOS"u seçtim ve fdisk'i açtım. FreeDOS'un fdisk'i DOS6.22'den farklı olarak FAT32 desteğiyle geliyor. Fat32, 1996'da ortaya çıktı ve Win95 OSR2 ile kullanıma girdi. Ayrıntısına sonraki yazılarda gireceğim. Bu kısımla ilgili not: fdisk, bölüm oluşturulurken diskin LBA desteğini test eder. LBA desteklemeyen disklerde bölüm türü byte'ı FAT16 ve FAT32 için sırasıyla 06h ve 0Bh olurken, destekleyenlerde 07h ve 0Ch olur.
Yukarıdaki görselde görülen FAT32 desteği açılsın mı sorusu aslında 2GB'den büyük diskler için gerekli, "N" diyip geçtim. Bir tane 340MB birincil bölümünü "1 - 1 - N - 340 - (Enter) - (Esc)" kombinasyonuyla oluşturdum ve ana menüdeki (2) seçeneğiyle, bölümü aktifleştirdim. Öncekinden farklı olarak "1 - 2 - (Enter) - (Esc)" tuş kombinasyonuyla uzatılmış veya mantıksal (extended veya logical) bir bölüm oluşturdum. fdisk, uzatılmış bölümde mantıksal sürücü oluşturmak isteyip istemediğimi soracak. Buna 340 MB verip Enter'a bastım. Geri kalan alanda son bir disk oluşturmak için tekrar Enter'a bastım. Burada bir hatadan ötürü fdisk hala 2MB alan var zannediyor ve Enter'a basılırsa bölümleme tablosu hatalı yazılıyor. Bu nedenle Esc'e bastım.
fdisk'in dördüncü seçeneğine girdiğimde diskler yukarıdaki gibiydi. fdisk'ten çıkıp bilgisayarı yeniden başlattım ve kuruluma devam ettim. "Do you want to format your drive?"a Yes dedim ve "Full installation"ı seçip kurulumu başlattım. Bitince de CD'yi çıkarıp makinayı yeniden başlattım.
Şu anda FreeDOS'ta 3 sabit disk sürücüsü (C:, D: ve E:) olmasına rağmen diskeditörle veya debug.exe'yle MBR'de iki disk bölümü görüyorum. O halde üçüncü nerede? (Diskeditör varsa buna da kopyalayın)
Diskeditör'le baktığımda diskte 520 silindir görünüyordü. (bu bölümde eski sürüm diskeditörü kullandım, bir nedeni yok). İlk bölüm 173. silindirde bitiyor. O halde birincil bölüm doğru. İkinci bölüm EXTEND olarak görünüyor. İkinci bölümün olduğu CHS (173,0,1) adresinde başka bir bölümleme tablosu daha var. EXTEND seçiliyken Enter'a basınca, o sektör bölümleme tablosu biçiminde gösterilecek.
Bu bölümleme tablosu öncekine benziyor ama aynısı değil. Sağ alt köşede (173,0,1) görüyorum yani MBR'da değilim. F2'yle Hex görünümüne geçtiğimde bu sektörde kod yok ve imza var! Bu tablodaki ilk girdi (173,1,1)'den 346. silindire kadar bir bölüm ve ikinci girdi onun bittiği yerde tekrar bir uzatılmış (EXTEND) bölüm. Bu 'Extend'i seçip Enter'a basınca (346,0,1) sektöründe kodu bulunmayan bir bölümleme tablosu daha görünüyor ve tablodaki bölüm, (346,1,1)'den diskin sonuna kadar. Anlaşılacağı üzere uzatılmış bölüm, içindeki bölümleri bağlı listede tutan bir yapı.
Bildiğim kadarıyla, uzatılmış bölümlerin boot edilebilir olmaması için teoride bir engel yok ama MBR'deki kodun, ilk tabloda aktif bir bölüm yoksa uzatılmış bölümler içinde aktif olanı araması gerek. Bu da 512 byte'la sınırlı olması gereken kodun uzaması anlamına geliyor. Standardı belirleyen mi istememiş yoksa başka bir neden mi var, emin değilim. Bu konuda Wikipedia'nın Extended Boot Record maddesinde başka örnekler bulunabilir.
MBR Kodu Nasıl Çalışır?
MBR kodunu incelemek için şimdiye kadar kurduğum iki makinayı da DSL ile açıp aşağıdaki komutla MBR'lerini kaydettim:
dd if=/dev/hda of=mbr.bin count=1 bs=512
Güncel linux dağıtımı olan bir makinada aynı komut;
dd if=/dev/sda of=mbr.bin count=1 bs=512
Sonra linux bir makinada;
objdump -M intel -D -b binary -m i8086 --adjust-vma=0x7C00 mbr.bin > mbr.asm
komutuyla bu çıktıları disassemble ettim.Yazıyı uzatmamak için assembly kodunu satır satır incelemek yerine DOS6.22 ve FreeDOS'un çıktılarını açıklama satırlarıyla Google Drive'a yükledim. Genel olarak yapılan ikisinde de aynı: Stack ayarlamasından sonra sektör kendini DOS'ta 0:0600h ve FreeDOS'ta 1FE0h:7C00h adresine kopyalıyor. Çünkü sonradan yüklenecek boot sektör kodunun da 7C00h adresine yerleşmesi gerek. BIOS için boot sektör ve MBR kodlarının farkının olmadığını, BIOS'un görevinin boot edilecek ortamın ilk sektörünü 0:7C00h'a okuyup, sonundaki 55h AAh byte'larını kontrol etmek ve bu adrese dallanmak olduğunu yazmıştım. Eğer boot edilen ortam disketse MBR bulunmadığından 0:7C00h'a boot sektör okunur.
DOS'ta bir ve yalnız bir 80h girdisi olup olmadığı kontrol edilirken, FreeDOS'ta en yüksek değerli biti 1 olan ilk girdiye ait boot sektör okunuyor. Sektör okunamadıysa "read error" veriyor. Bundan başka herhangi bir kontrol yok.
Disk okuma konusunda DOS, bölümleme tablosundan CHS değerlerini aldığı sektörü, DI'de tuttuğu bir sayacı kullanarak beş kere okumaya çalışıyor. Beşinci sefer okunamazsa "Error loading OS" hatasını veriyor. DOS'ta LBA desteği bulunmazken, FreeDOS önce LBA desteğini kontrol ediyor. Destekleniyorsa 7CCDh'da tuttuğu DAP'la sektörü okuyor. Desteklenmiyorsa DOS'taki kodun hemen hemen aynısı çalışıyor. Sektör okunduktan sonra imza kontrolü yapılıyor (FreeDOS'ta bu, fonksiyonun dönüşünde) ve program 0:7C00h adresine atlıyor.
Aslında bu konunun devamında GRUB, GPT ve UEFI'yi ele almak gerekiyor ama UEFI benim de çok ayrıntılı bilmediğim bir teknoloji olduğundan bunları sonraki bir yazıda toparlayacağım. Bu yazıda anlattıklarım her ne kadar 1980'lerin teknolojisi olsa da, UEFI kullanılmadığında bugün de çalıştırılan kod, ufak farklar dışında aynı. Buraya kadar MBR'i bitirmiş olduk. Sonraki yazıda MBR'den sonraki adım olan boot sektörünü ele alacağım.