3 Kasım 2009 Salı

Günlükten Çıkanlar - 2

2005 Yılının ajandasınıda buldum , sadece 8 sayfa not karalamışım ve birbirinden kopuk bilgilerden oluşuyor lakin meraklıları için güzel nimet :

- Device Driver'lar SYSTEM olark anılan özel bir context'te çalışırlar. Bunu taskmanager'da görünen SYSTEM kullanıcısı olarakta görebiliriz.

- Her Aygıt sürücüsü (Device Driver) bir Device Name tag'ı ile tanımlanır. Her sürücü kullanacağı aygıt için bir isim oluşturmalıdır.

- Sürücüler DriverEntry rutininde aygıt için DeviceObject adı verilen aygıtı tanımlayısı sistem taraflı bir nesne ve SymbolicLink adı da verilen ve aygıt adının usermode tarafında da görülebilmesini sağlyan ortak nesne yaratır. Ayrıca bazı driver'a ve aygıta özel başlangıç işlemleride yapar.

- Driver'lar fiziksel bir aygıtı kontrol etmek zorunda değildirler. Bunun yerine sadece sürücü kodu içerisinde verilen görevleride yapabilirler. Ancak unutulmaması gereken en önemli husus bu kodların ring0 denilen en imtiyazlı seviyede çalıştıklarıdır.

- Driver'lara yapılan tüm istekler birer I/O Request Packet (IRP) biçiminde yollanır. Driver, tüm sürücü istekleri için önceden DriverEntry rutininde tanımlanmış olan fonskiyon pointer'larını SYSTEM context'inde bekler.

- Tüm işlemlerin virtual address (sanal adresleri) aynı olabilir ancak fiziksel sayfaları farklı adresleri işaret eder.

- Farklı process'lerin her iki modda aynı hafıza alanını kullanabilmesi için named memory mapped file oluşturması gerekmektedir.

- ObReferenceObjectByHandle komutu belirtilen handle'in istenen erişim izinlerine uygun olup olmadığına bakar. Eğer handle'a istenilen kriterlerde erişim izni verilirse programcıya STATUS__SUCCESS durumu döner.

- 32bit işlemciler bir hafıza adresine erişirken 16bit'lik bir Segment Selector ve 32bit'lik segmentle birlikte kullanılacak offset değeri kullanır.

- Segmentlere erişim ile alakalı gerekli blgiler işlemciye segment table yoluyla aktarılır.Segment Selector, segment table içindeki bir index'tir.

- Herhangi bir anda yalnızca 2 adet segment tablosu aktif olabilir. Bunlar GDT v LDT'dir.

- Segment Selector'de ki bir bit kullanılarak CPU hangi Segment tablosunu kullanacağına karar verir.

- Segment Descriptor'lar, hafızanın bir bölgesini işaret eden bilgiyi ve o bölgeye erişebilmek için gereken erişim haklarına ait bilgiyi tutar. Segment Descriptorlar , Segment Tablosunun içerisinde array şeklinde yer alırlar. Bir Segment Descriptor kısaca bir segmentin başlangıç adresi ile boyutunu tutar ve imtiyaz seviyesini belirten DPL olarakta bilinen 2 bit'i kullanır.

- İşlemci bir segment'e erişim izni vermeden önce DPL ve RPL'i karşılaştırır. RPL selector'de yer alan 2 bitlik bir imtiyaz belirteçidir.

- Address Translation işlemindeki ilk adım, segmetin taban adresi ile offset'in toplanmasıdır. Bu işlemin sonucunda eğer paging mekanizması aktif değil ise doğrudan çıkan sonuç fiziksel adresi gösterir. Paging aktif ise bu adrese logical veya lineer adres adı verilir ve fiziksel adresi bulabilmek için eldeki veri tekrar Paging Address Translation adı verilen bir başka mekanizmaya devr edilir.

- Memory Management şeması Paging olarak anılır. Çünkü Hafıza, Pages olarak bilinen sabit boyutlu birimler halinde tanımlanır. Intel işlemciler üzerinde bir sayfa 4kb olarak varsayılır.

- 32bit Adresleme ile fiziksel hafıza ancak 4GB adreslenebilir. Bunun anlamı 1 milyon sayfayı adresleyebilirsiniz demektir.

- Bir PageDirectoryEntry'si eğer LSB(Least Significant bit) bit'i 1 ise geçerli olarak değerlendirilir.

- WindowsNT her process için ayrı bir PageTable tutar ve bunun sanal adres aralığıda 0xC0000000 dan 0xC03fffff'dir.

- Page Table Directory (1024)1K adet Page Table'in adresini tutar. PDT Lineer adresin son 10bit'inde (22-32 bitleri) yer alır ve bu tabloda ki bir girişe işaret eder.

- Page Table , adresleri PDT'de bulunan ve kendi tablolarında 1024 adet PageTableEntry(PTE) tutan PageTableFrame(PTF)'ye işaret eden tablolardır. Lineer adresin 12 ve 22 bit'leri arasında yer alır.

- Address space olarak bilinen kavram PageDirectory'den başka bişi değildir. Page Directory'nin gösterdiği table'lar üst yarısı bütün process'ler için aynıdır.

- MMCreateProcessAddressSpace fonksiyonu hafızanın 3 aşağıdaki işler için ayırır:
Birinci sayfayı PageDirectory için, ikinci sayfayı HyperSpace Page table girişlerini tutmak için ve 3.Sayfayıda Process ilk defa oluşturulduğunda working set olarak anılan , processin .code , .data , stack gibi nesnelerini tutmaya yarayan hafıza öbeğinin adresini tutar.

- Memory-Mapped, dosyaları, NT section nesneleri ile çalışabilmek için kullanır.

- Bir Process'in çalışma anında fiziksel hafızaya alınamayan kısımları işaretlenir. Process ne zaman hafızada bulunmayan bir datasına ulaşmaya çalışırsa , önceden işaretlenmiş alanlar ikincil depolama aygıtından (senaryomuzda bu hdd'dir) ana hafızaya getirilir.

- Eğer İşletim sistemi fiziksel hafızayı(RAM) tüketirse kendine yer açailmek için bazı dataları atmak durumunda kalır. Ancak bu boşaltım işlemi geri dönüşümsüz bir silinme şeklinde değil swapping yapılarak tekrar hdd'ye atılır ve dilendiği zaman oradan geri alınabilir. Bu dataların atılma işlemine karar verme mekanizması "Replacement Policy" olarak bilinir. Bu mekaizmada WindowsNT FIFO(İlk giren ilk çıkar) yönetimini kullanarak yerine getirir. Bu policy'ye göre bir yer sıkıntısı olduğunda bellekte ki en eski veri atılmış olacaktır.

- Eğer bir Page fiziksel Ram'in üzerinde map edilmemişse WindowsNT bu sayfayı "invalid" olarak işaretler. Bu sayfaya herhangi bir erişim gerçekleşirse bir "page fault" gerçekleşir ve bu hatayı yakalayan "page fault handler" hdd'den ilgili datayı az önce yukarıdaki bahsettiğimiz şekilde getirir.

- Eğer Page bir dll veya executable code içeriyor ise saygfa da o ilgili dll veya exe dosyadan alınır. Şayet sayfa bir data içeriyor ise sayfayı swap dosyasından alacaktır. Yani kod içeren bölgeler datalardan önceliklidir. Eğer sayfa Memory-Mapped paylaşımlı dosya alanından alınacak ise sayfa uygun dosyadan alınır.

- Windows NT fiziksel hafızadaki boş alanı sürekli tahrip eder, böylece bir page fault meydana geldiğinde hdd'den çıkarılacak sayfa için yer ayırabilecektir. Bu takip bilgileri, Page Frame Database (PFD) olarak anılan Kernel data yapısında tutulur.

- PFD hafızadaki sayfaları FIFO tabanlı bir listede tutar ve yer sıkıntısı olduğu durumlarda atılacak sayfaya karar verir. Ancak bir sayfayı atmadan önce WindowsNT bu sayfanın "dirty" kirli olmadığından emin olmalıdır. Dirty biti sayfanın yazılmış olduğunu ve hafızadan atılmak icap eden durumlarda bu sayfanın ilgili swapping işlemine uygun olduğunu gösterir. Ayrıca PFD paylaşılan sayfalar içine bir referans sayacı tutar ve yalnız bu sayaç ilgili sayfa için sıfır olduğunda atılır. Genelde PFD her fiziksel sayfanın durumuna bakar. PFD her fiziksel sayfa için 24byte 'lık bir array'dir. PFD arrayinin boyutu bir kernel değişkeninde depolanan fiziksel sayfanın sayısına eşittir. Bu değeri tutan değişken "MmNumberOfPhysicalPages"'dir. PFD'nin adresini yine bir kernel değişkeni olan MmPfnDatabase tutar. Bir fiziksel sayfa farklı durumlarda olabilir. Örneğin in-use, free ,free ama dirty gibi. PFD girişi bir doubly linkd list'e ve fiziksel sayfanın durumuna bağlıdır. Örneğin boş sayfaları tanımlayacak PFD girişleri free page listesine bağlıdır.

- Virtual Address Descriptor: Windows NT her boş fiziksel sayfanın listesi ile birlikte ayrıca her Process için ayrılmış olan virtual address boşluğunuda izlemeye ihtiyaç duyar. Bir Process ,bir hafıza bloğu ayırmak istediği zaman ki bu işlem örneğin bir dll i hafızaya almakta olabilir bu esnada WindowsNT Virtual Address boşluğundaki boş bloklar için bir kontrol yapar ve ondan sonra gereken yeri ayırır, ve Virtual Address map'i bu doğrultuda günceller ve hali ile bu işlem bilgilerini alabileceği en doğru yer Page Table'dir.

- IO Manager , gerekli şartlar oluşup bir IRP oluşturulduğunda IRP yapısının AssociatedIRP.SystemBuffer alanına usermode'da yer alan buffer'indaki bilgiyi geçer.

Hiç yorum yok:

Yorum Gönder