SANAL DOSYA SİSTEMİ. Fatih YILDIRIM

Benzer belgeler
CSD İŞLETİM SİSTEMİNİN SANAL DOSYA SİSTEMİNE İLİŞKİN TEMEL VERİ YAPILARI

Dosya, disk üzerinde depolanmış verilerin bütününe verilen isimdir. İşletim sistemi genel olarak iki çeşit dosya içerir.

DOSYA NEDİR? Verilerin HDD de saklanması. Verilerin HDD de saklanması DOSYA SİSTEMİ NEDİR?

Linux işletim sistemlerinde dosya hiyerarşisinde en üstte bulunan dizindir. Diğer bütün dizinler kök dizinin altında bulunur.

Master boot record (MBR)

HEAP SİSTEMİ. Oğuz Karan

ALGORİTMA VE PROGRAMLAMA II

İşletim Sistemi. BTEP205 - İşletim Sistemleri

ELN1002 BİLGİSAYAR PROGRAMLAMA 2

Dosyaların Özellikleri (Attribute) Dosya İşlemleri. İki Seviyeli Katalog Sistemleri. Tek Seviyeli Katalog Sistemleri. Hiyerarşik Katalog Sistemleri

Temel Bilgisayar Programlama

BTP 205 İŞLETİM SİSTEMLERİ

DİSK DEPOLAMA ALANLARI

UFS SNAPSHOT. Hazırlayan: Asiye Yigit Agustos

İşletim Sistemlerine Giriş

Algoritma Geliştirme ve Veri Yapıları 3 Veri Yapıları. Mustafa Kemal Üniversitesi

BİLGİ İŞLEM DERS 1. Yrd Doç Dr. Ferhat ÖZOK MSGSU FİZİK BÖLÜMÜ MSGSU FİZİK BÖLÜMÜ

Dosya sistemi (File system), dosyaların hard disk üzerinde nasıl yerleşeceğini ayarlayan bir sistemdir. Diğer bir tanıma göre dosya sistemi, bir

ELN1002 BİLGİSAYAR PROGRAMLAMA 2

LİNUX. Dosyalar ve dizinler

Yrd. Doç. Dr. Caner ÖZCAN

Algoritma Geliştirme ve Veri Yapıları 9 Ağaç Veri Modeli ve Uygulaması. Mustafa Kemal Üniversitesi

FreeBSD Erişim Kontrol Listeleri

enum bolumler{elektronik, insaat, bilgisayar, makine, gida};

B-Tree Dosya Sistemi (BTRFS)

Eln 1002 Bilgisayar Programlama II

Linux Dosya ve Dizin Yapısı

Temel Dosya İşlemleri. Kütük Organizasyonu 1

Linux taki Temel Dosya Sistemleri: ext2,ext3,ext4,jfs & xfs

İşletim Sistemleri ve FreeBSD. 22 Nisan 2005 Halil DEMİREZEN EnderUNIX Geliştirici Takım Üyesi

Programlama Dilleri. C Dili. Programlama Dilleri-ders08/ 1

man komut man ls (ls komutu hakkında bilgi verir.) man pwd (pwd komutu hakkında bilgi verir.)

YAPILAR BİRLİKLER SAYMA SABİTLERİ/KÜMELERİ. 3. Hafta


Yrd. Doç. Dr. Caner ÖZCAN

İşletim Sistemleri. Hazırlayan: M. Ali Akcayol Gazi Üniversitesi Bilgisayar Mühendisliği Bölümü

Bilgilerin Uzun Vadeli Saklanması

Teknikleri. Önsöz. iskender atasoy

Sistem Programlama. (*)Dersimizin amaçları Kullanılan programlama dili: C. Giriş/Cıkış( I/O) Sürücülerinin programlaması

DOSYA İŞLEMLERİ Programlama dilleri hafta -

İşletim Sistemleri. Discovering Computers Living in a Digital World

YRD. DOÇ. DR. AGÂH TUĞRUL KORUCU Kernel çeşitleri

Algoritma Geliştirme ve Veri Yapıları 2 Veri Modelleri. Mustafa Kemal Üniversitesi

Göstericiler (Pointers)

File System Object. Elbistan Meslek Yüksek Okulu Güz Yarıyılı. Öğr. Gör. Murat KEÇECĠOĞLU

Özyineleme (Recursion)

Struct VE GÖSTERİCİLER FONKSİYONLARDA STRUCT KULLANIMI Programlama dilleri hafta -

Linux 2.6 Çekirdeği Stoned Beaver. Murat Koç Manager & IT Consultant murat.koc@frontsite.com.tr

ALGORİTMA VE PROGRAMLAMA II

VERİ YAPILARI LİSTELER. Yrd. Doç. Dr. Murat GÖK Bilgisayar Mühendisliği Bölümü YALOVA ÜNİVERSİTESİ

ELN1002 BİLGİSAYAR PROGRAMLAMA 2

mod ile açılacak olan dosyanın ne amaçla açılacağı belirlenir. Bunlar:

Dizgiler. C dilinde karakter m şeklinde tek tırnak içerisinde yazılan ifadelerdir. Bu karakterlerin her biri aslında bir tamsayı ile ifade edilir.

Bilgisayar Mühendisliğine Giriş. Yrd.Doç.Dr.Hacer KARACAN

Bilgi ve İletişim Teknolojileri (JFM 102) Ders 7. LINUX OS (Sistem Yapısı) BİLGİ & İLETİŞİM TEKNOLOJİLERİ. LINUX Yapısı

Widows un çalışmasında birinci sırada önem taşıyan dosyalardan biriside Registry olarak bilinen kayıt veri tabanıdır.

Fstab Rehberi. Ceren Çalıcı. Nisan, 2012

Veri Yapıları. Amaçlar: Temel Veri Yapılarını Tanımlamalı Veri Yapılarını Veri Modeli ve Türlerini Öğreneceksiniz. İçindekiler:

EYLÜL 2012 İŞLETİM SİSTEMLERİ. Enformatik Bölümü

Yaptığımız web sitelerinin daha kullanışlı olması için veritabanı sistemleri ile bağlantı kurup ihtiyaca göre verileri okuyup yazmasını isteriz.

Önyükleyiciler. Ercan Ersoy

BİT in Temel Bileşenleri (Yazılım-1)

BLM 112- Programlama Dilleri II. Hafta 5 İşaretçiler (Pointers)

Değişkenler tanımlanırken onlara ne tür veriler atanabileceği de belirtilir. Temel veri türleri oldukça azdır:

Internet Programming II. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı

LOGO DESTEK DOKÜMANI

Dosya Sistemi Nesnesi File System Object

Bilgisayarlarda Kullanılan Dosya Sistemleri

Temel Linux Eğitimi 1., 2. ve 3. Bölümler

Disklerin Organizasyonu...

Linux ta komutlar hakkında yardım almak için aşağıdaki komutlar kullanılır : - man - info - whatis - apropos

Yazılım Mühendisliğine Giriş 2018 GÜZ

C++ Giriş Ders 1 MSGSU Fizik Bölümü Ferhat ÖZOK Kullanılacak kaynak: Published by Juan Soulié

void main() { int a[] = {1, 2, 3, 4, 5, 6}; int *p=&a[2]; int **pp=&p; printf("%d", **pp+2); }

Linux Dosya Yapısı. Eren BAŞTÜRK.

Özgür Yazılım Nedir?GPL, GNU...

Jval tipi. Genel veri yapılarını kullanacağımız zaman Jval den faydalanırız.önemli olanlar aşağıda mevcuttur:

Veri Tabanı-I 5.Hafta

Windows XP: Simple Sharing, Security ve ForceGuest Perşembe, 07 Eylül :02 - Son Güncelleme Cumartesi, 12 Eylül :36

BLG 312 Bilgisayar İşletim Sistemleri 2006 BLG 312. Bilgilerin Uzun Vadeli Saklanması. Dosya Sistemi Görevleri. Dosya Sistemi Özellikleri

İŞLETİM SİSTEMLERİ. İŞLETİM SİSTEMİ Kavramı. Klasör ve Dosya Mantığı. Klasör ve Dosya Mantığı

Windows Eski Sürümleri Bellek Yapısı

şeklinde tanımlanmıştır. O halde, dosyaları daha önceki bilgilerimizi kullanarak FILE *Dosya1, *Dosya2;

BLM-112 PROGRAMLAMA DİLLERİ II. Ders-3 İşaretçiler (Pointer) (Kısım-2)

Yrd. Doç. Dr. A. Burak İNNER

Sun Solaris Jumpstart Sistemi

YAZILIM İŞLETİM SİSTEMLERİ

Linux altında komut satırında...

Değişkenler. Geçerli değişken isimleri : baslamazamani, ad_soyad, x5 Geçersiz değişken isimleri : 3x, while

İŞLETİM SİSTEMİ KATMANLARI (Çekirdek, kabuk ve diğer temel kavramlar) Bir işletim sisteminin yazılım tasarımında ele alınması gereken iki önemli konu

PROGRAMLAMAYA GİRİŞ DERS 2

Sanal Ortamda Nesnelerin Haptic Kol ile Manipülasyonu. Sevcan AYTEKİN Alpaslan DUYSAK

Oluşturmak istediğimiz OU ye bir isim veriyoruz. Name kısmına ISTANBUL yazıyoruz,

YZM 2116 Veri Yapıları

Bilgi güvenliği konusunda farkındalık yaratmak. Mobil cihazlardaki riskleri anlatmak. Mobil uygulamaların bilgi güvenliği açısından incelemek 2

Algoritma Geliştirme ve Veri Yapıları 7 Liste ve Bağlantılı Liste. Mustafa Kemal Üniversitesi

İşletim Sistemleri; İÇERİK. Yazılım BİLGİ TEKNOLOJİLERİ VE UYGULAMALARI Yazılım Türleri

Adli Analiz İşlemlerine Başlamak

JAVA DA GİRİŞ/ÇIKIŞ İŞLEMLERİ. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 9 1

Değerlerinizi Koruyun!

Transkript:

SANAL DOSYA SİSTEMİ Fatih YILDIRIM [V : 1] Özet: Bu makalede Sanal Dosya Sistemi nin genel mimarisi incelenmektedir. Sanal Dosya Sistemi nin genel fikirleri verildikten sonra Linux taki mimarisi kullanılan yapılar üzerinde açıklamalar yapılarak anatılmaktadır. Son bölümde ise CSD İşletim Sistemi Geliştirme Projesi kapsamında tasarlanan Sanal Dosya Sistemi mimarisi anlatılmaktadır. 1. GİRİŞ İşletim sistemlerinin en temel ve önemli konularından bir tanesi de dosya sistemidir. Dosyaların nasıl bir yapı içerisinde yer alacağı, nasıl isimlendirileceği, nasıl korunacağı ve dosyalara nasıl erişileceği gibi konular dosya sisteminin içeriğini oluşturmaktadır. Geçmiş dönemlerde ve günümüzde kullanılan bazı dosya sistemlerine ve bunları kullanan işletim sistemlerine aşağıdaki örnekler verilebilir. MFS (Macintosh File System) & HFS (Hierarchial File System): Apple Macintosh sistemlerinde kullanılan temel dosya sistemleridir. NTFS: MS Windows NT işletim sisteminin temel dosya sistemidir. MS Windows 2000/XP sistemlerinde de kullanılmaktadır. FAT32: MS Windows 95 OSR2/98/ME işletim sistemlerinin temel dosya sistemidir. VFAT: MS Windows 95 işletim sisteminin temel dosya sistemidir. FAT (File Allocation Table): MS-DOS işletim sisteminin temel dosya sistemidir. UFS (Unix File System): Unix işletim sisteminin ana dosya sistemidir. Pekçok Unix benzeri işletim sistemi tarafından (Digital UNIX, FreeBSD, HP-UX, Solaris, Sun-OS gibi) desteklenmektedir. Extfs, Ext2fs, Ext3fs (Extended File System): Linux sistemlerinde kullanılan dosya sistemleridir. NFS (Network File System): AIX, AmigaOS, BeOS, BSDi, Digital UNIX, FreeBSD, HP-UX, IRIX, Linux gibi pek çok Unix benzeri işletim sistemi tarafından desteklenen bir dosya sistemidir. HPFS (High Performance File System): IBM in geliştirdiği OS/2 işletim sisteminin temel dosya sistemidir. FFS (Fast File System): AmigaOS işletim sisteminin temel dosya sistemidir. (Berkeley sistemlerinde de FFS isimli bir dosya sistemi vardır. İki dosya sistemi biribirinden farklıdır.) EFS & XFS: SGI firmasının geliştirdiği IRIX işletim sisteminin temel dosya sistemleridir.

JFS (Journaled File System): AIX işletim sisteminin temel dosya sistemidir. BeFS: BeOS işletim sisteminin 64 bitlik temel dosya sistemidir. 2. SANAL DOSYA SİSTEMİ Yukarıdaki örneklerde de görüldüğü gibi hemen hemen her işletim sistemi kendine özgü ayrı bir dosya sistemi içermektedir. Peki birçok dosya sistemini destekleyebilecek bir dosya sistemi oluşturulabilir mi? İşte Sanal Dosya Sistemi bu ihtiyacı karşılamak amacıyla düşünülmüş bir sistemdir. Sanal Dosya Sistemi nin özünde nesne yönelimli teknik yer almaktadır. Yani Sanal Dosya Sistemi nesneler üzerinde işlemlerini nesnelerin sahip olduğu fonksiyonları kullanarak yapar. Örneğin, Sanal Dosya Sistemi ne FAT dosya sistemini eklemek isteyelim. Bu durumda yapılması gereken gerekli nesnelerin ve bu nesneler üzerinde işlem yapacak fonksiyonların belirlenmesi ve hepsinin birlikte Sanal Dosya Sistemine eklenmesidir. Aslında burada sözü edilen nesne kavramının C dilindeki karşılığı yapıdır ve bu yapı yine kendisi üzerinde işlemler yapan fonksiyon göstericilerini barındıran bir yapı daha içermektedir. Örneğin, bir dosyayı temsil eden yapı file yapısı olsun. file yapısını kullanarak işlemler yapan fonksiyonlar da file_operations yapısında yer alsın. FAT dosya sistemini Sanal Dosya Sistemi ne dahil etmek için file ve file_operations yapılarının da aralarında bulunduğu bazı yapıların FAT dosya sistemine özgü olacak şekilde oluşturulması ve hepsinin birlikte dahil edilmesi gerekir. Özetle Sanal Dosya Sistemi, desteklenecek her dosya sistemi için nesnelerin ve bu nesneler kullanılarak işlemler yapan fonksiyonların bulunduğu nesne yönelimli bir sistemdir. Linux ve CSDOS işletim sistemlerindeki Sanal Dosya Sistemi mimarisinin inceleneceği sonraki bölümlerde konu daha pratik bir biçimde ele alınacaktır. 3. LINUX SANAL DOSYA SİSTEMİ MİMARİSİ Linux Sanal Dosya Sistemi nde kullanılan yapılar şunlardır: struct file_system_type struct vfsmount struct super_block struct super_operations struct file struct file_operations struct dentry struct dentry_operations struct inode struct inode_operations

3.1 Mount İşlemi Yukarıda belirtilen yapıların incelenmesine geçmeden önce kısaca mount işlemi hakkında bilgi verilmesi faydalı olacaktır. Linux ta Sanal Dosya Sistemi nin desteklediği bir dosya sistemini kullanabilmek için mount işleminin yapılması gerekir. Mount işlemi ilgili dosya sisteminin boş bir dizin altına yerleştirilmesi işlemidir. Örneğin bir sabit diskin FAT32 dosya sistemine sahip bir bölmesini (partition) Linux altında kullanabilmek için bu bölmeyi boş bir dizin altına mount işlemi ile yerleştirmek gerekir. Mount işleminden sonra artık ilgili dizine geçmek artık FAT32 dosya sistemine sahip bölmeye geçmek anlamındadır. 3.2 struct file_system_type Sanal Dosya Sistemi nin desteklediği her dosya sistemi file_system_type isimli o dosya sistemine özgü bilgileri içeren bir yapı ile temsil edilmektedir. Desteklenen dosya sistemleri bir bağlı liste şeklinde saklanmaktadır. Örneğin yeni bir dosya sistemini Sanal Dosya Sistemi ne eklemek için yapılması gereken ilk işlem ilgili dosya sistemine ilişkin file_system_type yapısının oluşturulması ve bu yapının ilgili bağlı listeye eklenmesidir struct file_system_type { const char *name; struct super_block *(*read_super)(struct super_block *, void *, int); struct file_system_type *next; file_system_type yapısının name elemanı ilgili dosya sisteminin ismini belirtmektedir. Her dosya sisteminin ismi farklı olmalıdır. Yapının read_super isimli elemanı mount işlemi sırasında super_block türünden bir yapının içerisini dolduracak olan fonksiyonun adresini tutmaktadır. Yapının next elemanı ise Sanal Dosya Sistemi nin desteklediği dosya sistemlerine ilişkin bağlı listedeki bir sonraki elemanı göstermektedir. 3.3 struct vfsmount Mount işlemi ile Linux sistemine bağlanan her dosya sisteminin mount işlemi ile ilgili bilgileri vfsmount isimli yapıda tutulmaktadır. vfsmount yapıları da file_system_type yapılarında olduğu gibi bağlı liste biçiminde saklanmaktadır. struct vfsmount { char *mnt_dirname; struct super_block *mnt_sb; struct vfsmount *mnt_next;

vfsmount yapısının mnt_dirname elemanı ilgili dosya sisteminin mount işlemi sonucunda hangi dizine bağlandığı bilgisini, mnt_sb elemanı mount işlemi sonucunda ilgili dosya sistemi için oluşturulan super_block türünden bir yapının adresini tumaktadır. Yapının mnt_next elemanı ise bağlı listedeki bir sonraki elemanı göstermektedir. 3.4 struct super_block ve struct super_operations Mount işlemi sırasında dosya sistemi için super_block isimli bir yapı oluşturulur ve yapının elemanları ilgili dosya sistemine ilişkin bilgiler ile doldurulur. Bu işlemi file_system_type yapısının read_super elemanının gösterdiği fonksiyon yapmaktadır. super_block yapısının başındaki elemanlar Sanal Dosya Sistemi nin desteklediği dosya sistemleri için ortak olan bilgileri tutan elemanlardır. Dosya sistemlerinin kendilerine özgü bilgileri ise ayrı yapılarda tutulmaktadır. Bu yapılar super_block yapısının içerisinde bulunan bir birlik (union) içerisinde bulunurlar. Dolayısıyla mount işlemi sırasında oluşturulacak olan super_block yapısının bu birlik elemanı aslında ilgili dosya sistemine özgü bilgileri içeren yapıyı temsil edecektir. struct super_block { struct file_system_type *s_type; struct super_operations *s_op; union { struct minix_sb_info minix_sb; struct ext2_sb_info ext2_sb; struct ext3_sb_info ext3_sb; struct msdos_sb_info msdos_sb; struct sysv_sb_info sysv_sb; struct ufs_sb_info ufs_sb; void *generic_sbp; } u; super_block yapısının s_type elemanı ilgili dosya sistemine ilişkin file_system_type yapısının adresini tutmaktadır. s_op elemanı super-block işlemleri olarak da isimlendirilen super_operations türünden bir yapının adresini tutmaktadır. Görüldüğü gibi yapının u elemanı bir birliktir ve farklı türden yapıları içermektedir. İşte bu yapılar dosya sistemine özgü bilgileri tutarlar. Örneğin msdos_sb_info yapısı MS-DOS işletim sisteminin dosya sistemine (FAT) özgü bilgileri tutmaktadır. Bu bilgiler FAT dosya sisteminin BPB (BIOS Parameter Block) yapısından elde edilerek yapının elemanlarında tutulmaktadırlar. Super block işlemlerini temsil eden super_operations yapısı super_block yapısını kullanarak işlemler yapan fonksiyonların adreslerini içeren bir yapıdır. struct super_operations { void (*read_inode) (struct inode *); void (*write_inode) (struct inode *);

void (*delete_inode) (struct inode *); void (*write_super) (struct super_block *); super_operations yapısının read_inode, write_inode ve delete_inode elemanları sonraki bölümlerde incelenecek olan inode elemanları üzerinde okuma, yazma ve silme işlemleri yapan fonksiyonların adreslerini tutan elemanlardır. Yapının write_super elemanı ise super_block yapısının diske yazılması gereken durumlarda kullanılan fonksiyonun adresini tutar. 3.5 struct file ve struct file_operations Sanal Dosya Sistemi nde açılan her dosya struct file yapısıyla temsil edilmektedir. Örneğin dosya üzerinde okuma, yazma gibi işlemleri yapabilmek için bu yapıya ihtiyaç duyulur. struct file { struct dentry *f_dentry; struct vfsmount *f_vfsmount; struct file_operations *f_op; mode_t f_mode; loff_t f_pos; struct file yapısının f_dentry elemanı bir sonraki konuda ele alınacak olan struct dentry yapısı türünden bir göstericidir ve bu türden bir yapıyı göstermktedir. f_vfsmount elemanı ilgili dosya sisteminin mount işlemi ile ilgili bilgilerini tutan struct vfsmount yapısının adresini tutar. f_op elemanı dosya işlemleri olarak da isimlendirilen struct file_operations yapısının adresini tutmaktadır. Yapının f_mode (file pointer) elmanı ilgili dosyanın açılış modunu, f_pos elemanı ise dosya pozisyon göstericisini temsil etmektedir. struct file_operations { loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char *, size_t, loff_t *); ssize_t (*write) (struct file *, const char *, size_t, loff_t *); struct file_operations yapısı dosya üzerinde işlemler yapan fonksiyonların adreslerini tutan yapıdır. llseek elemanı dosyanın dosya pozisyon göstericisini konumlandıran fonksiyonun adresini tutmaktadır. Yapının read ve write elemanları ise sırasıyla dosyadan okuma yapan ve dosyaya yazma yapan fonksiyonların adreslerini tutmaktadır.

3.6 struct dentry ve struct dentry_operations Sanal Dosya Sistemi nde dizin girişleri kullanılmadan önce dcache olarak isimlendirilen bir önbelleğe alınırlar ve buradan kullanılırlar. Bu önbellekte herbir dizin girişi struct dentry yapısıyla temsil edilmektedir. Veri yapısı olarak hash tablosu kullanılmaktadır. struct dentry { struct inode *d_inode; struct dentry *d_parent; struct qstr d_name; struct dentry_operations *d_op; struct super_block *d_sb; Yapının d_inode elemanı ilgili dizin girişinin ilişkin olduğu inode elemanının adresini, d_parent elemanı üst dizin girişine ilişkin dentry yapısının adresini, d_op elemanı dentry yapısıyla ilgili işlemler yapan fonksiyonların adreslerini tutan dentry_operations yapısının adresini ve d_sb elemanı ilgili dosya sisteminin super_block yapısının adresini tutar. Yapının d_name elemanı ise dizin girişinin ismi ve hash değeri gibi bilgileri tutan qstr isimli bir yapı türündendir. qstr yapısı aşağıdaki gibidir. struct qstr { const unsigned char * name; unsigned int len; unsigned int hash; struct dentry_operations { int (*d_compare) (struct dentry *, struct qstr *, struct qstr *); void (*d_delete)(struct dentry *); dentry_operations yapısı dentry yapısıyla ilgili işlemler yapan fonksiyonların adreslerini tutan elemanlar içerir. Örneğin, d_compare elemanı iki qstr yapısını karşılaştıran fonksiyonun adresini tutmaktadır. d_delete elemanı ise dentry yapısının referans sayısı 0 olduğu zaman çağrılan fonksiyonun adresini tutmaktadır. 3.7 struct inode ve struct inode_operations Sanal Dosya Sistem inde mount işlemi ile bağlanan dosya sistemlerindeki herbir dizin ve dosya için bir inode yapısı bulunmaktadır. inode yapısında dizin veya dosyanın bilgileri tutulur. Örneğin inode numarası, zaman bilgileri, uzunluğu, dosyanın diskteki fiziksel konumu gibi. Yapının başındaki elemanlar super_block yapısında olduğu gibi dosya

sistemleri için ortak olan bilgileri tutarlar. Dosya sistemlerinin kendilerine özgü bilgileri ise ayrı yapılarda tutulmaktadır. Yine bu yapılar inode yapısının içerisinde bulunan bir birlik içerisinde bulunurlar. dcache olarak isimlendirilen dentry önbelleği gibi inode yapıları için de bir önbellek kullanılmaktadır. Kullanılmak istenen dosyaya ilişkin inode önce bu önbellekte aranır. Eğer bulunursa kullanılır, bulunamazsa önbellekte yeni bir inode yapısı oluşturulur ve ilgili dosyanın bilgileriyle doldurulur. dentry önbelleğindeki her dentry yapısının bir elemanı ilgili dosyanın inode yapısını göstermektedir. Dolayısıyla inode yapılarına erişmek için iki yöntem vardır. Birinci yöntem dentry yapısındaki inode yapısını gösteren gösterici ile erişmektir. İkinci yöntem ise inode hash tablosunu kullanarak erişmektir. struct inode { unsigned long i_ino; struct inode_operations *i_op; struct file_operations *i_fop struct super_block *i_sb; union { struct ext2_inode_info ext2_i; struct msdos_inode_info msdos_i; } u; Yapının i_ino elemanı inode numarasını tutmaktadır ve bu değer mount işlemi sonucunda bağlanan dosya sistemi genelinde tektir, yani aynı inode numarasaın sahip birden fazla inode olamaz. Yapının i_op, i_fop ve i_sb elemanları sırasıyla inode_operations, file_operations ve super_block yapılarının adreslerini tutmaktadır. u isimli birlikte ise ilgili dosya sistemine özgü bilgiler tutulmaktadır. struct inode_operations { int (*mkdir) (struct inode *,struct dentry *,int); int (*rmdir) (struct inode *,struct dentry *); inode_operations yapısı inode elemanlarıyla ilgili işlemler yapan fonksiyonların adreslerini tutan elemanlar içermektedir. Örneğin mkdir ve rmdir elemanlarının gösterdiği fonksiyonlar sırasıyla dizin oluşturur ve dizin siler. 3.8 İşlemlerin Yapılış Sırası Bir dosya sisteminin Sanal Dosya Sistemi nde kullanılabilmesi için öncelikle dosya sisteminin file_system_type yapısı oluşturulur ve register_filesystem fonksiyonuyla file_system_type yapılarından oluşan bağlı listeye eklenir.

int register_filesystem(struct file_system_type *fs); Daha sonra mount işlemi sırasında struct vfsmount yapısı oluşturulur. file_system_type yapısının read_super elemanının gösterdiği fonksiyon kullanılarak ilgili dosya sisteminin super_block yapısı oluşturulur. mount işlemi sonucunda dosya sisteminin bağlandığı dizin artık ilgili dosya sisteminin kök dizini olarak kabul edilebilir. Bundan sonra dosya sistemindeki dizinler ve dosyalar üzerindeki işlemler inode, dentry ve file yapıları kullanılarak yapılacaktır. Dosya sisteminin file_system_type yapılarından oluşan bağlı listeden silinmesi için unregister_filesystem fonksiyonu kullanılır. int unregister_filesystem(struct file_system_type * fs); Bir process in, dosya sistemiyle etkileşimi şekildeki gibidir.

4. CSDOS İÇİN SANAL DOSYA SİSTEMİ NİN KURULMASI CSDOS işletim sistemi de Sanal Dosya Sistemi kullanacaktır. Dolayısıyla birçok işletim sisteminde kullanılan yapılara benzer CSDOS için tasarlanmış dosya sistemi yapıları kullanılacaktır. Buradaki yapılar yalnızca birer iskelet olarak verilmektedir. Geliştirme sırasında yapılar üzerinde değişiklikler yapılabilir. Yapılarda belirtilen türler proje genelinde kullanılacak olan general.h ve fs.h başlık dosyalarında bildirilmiştir. 4.1 FILE_SYSTEM_TYPE Sanal dosya sisteminin desteklediği dosya sistemlerinin her biri dosya sisteminin tipini tutan FILE_SYSTEM_TYPE yapısı ile temsil edilmektedir. Bu yapı Linux işletim sistemindeki file_system_type yapısıyla eşdeğerdir. typedef struct tagfile_system_type { SLIST_NODE slink; PCSTR szname; DWORD dwflags; PSUPER_BLOCK (*ReadSuperBlock) (PSUPER_BLOCK, PVOID, DWORD); } FILE_SYSTEM_TYPE, *PFILE_SYSTEM_TYPE; Sanal Dosya Sistemi nin desteklediği dosya sistemleri bağlı liste olarak tutulmaktadır. Yapının slink elemanı yapıyı bu bağlı listeye eklemek için kullanılmaktadır. szname elemanı dosya sisteminin ismini tutar. Yapının ReadSuperBlock isimli elemanı ise mount işlemi sırasında ilgili dosya sisteminin SUPER_BLOCK yapısını dolduracak olan fonksiyonun adresini tutar. Mount işlemi ile bağlanan dosya sistemlerinin her biri MOUNTED_FILE_SYSTEMS yapısıyla temsil edilmektedir. typedef struct tagmounted_file_systems { SLIST_NODE slink; DEV dev; PSTR szdevname; PSTR szmountpoint; PSUPER_BLOCK psuperblock; } MOUNTED_FILE_SYSTEMS, *PMOUNTED_FILE_SYSTEMS; Mount işlemi ile bağlanan dosya sistemleri de bir bağlı listede tutulmaktadır. Yapının slink elemanı yapıyı bu bağlı listeye eklemek için kullanılmaktadır. Yapının dev ve szdevname elemanları sırasıyla aygıt numarasını ve aygıt ismini tutmaktadır. psuperblock ise SUPER_BLOCK yapısının adresini tutmaktadır.

4.2 SUPER_BLOCK & SUPER_BLOCK_OPERATIONS Mount işlemi ile bağlanan her dosya sistemi için bir SUPER_BLOCK yapısı oluşturulmaktadır. Bu yapı FILE_SYSTEM_TYPE yapısının ReadSuperBlock elemanı kullanılarak doldurulmaktadır. SUPER_BLOCK yapısının başındaki elemanalar dosya sistemlerinde ortak olarak bulunan bilgileri tutmaktadır. Dosya sistemlerinin kendilerine özgü bilgileri ise ayrı yapılarda tutlmaktadır. SUPER_BLOCK yapısının u elemanı bu yapılarıdan oluşan bir birliktir. Dolayısıyla bu birlikte ilgili dosya sistemine özgü bilgileri içeren yapı bulunmaktadır. typedef struct tagsuper_block { DLIST_NODE dlink; DEV dev; DWORD dwblocksize; BYTE nblocksizebit; struct FILE_SYSTEMYPE *psystype; SUPER_BLOCK_OPERATIONS *poperations; DWORD dwsignature; union FILE_SYSTEM_SPECIFICS { MSDOS_SUPER_BLOCK sbmsdos; } u; } SUPER_BLOCK, *PSUPER_BLOCK; SUPER_BLOCK yapısı FILE_SYSTEM_TYPE yapısının adresini tutan ve BLOCK_OPERATIONS yapısının adresini tutan psystype ve poperations elemanlarına sahiptir. SUPER_BLOCK_OPERATIONS yapısı SUPER_BLOCK yapısını kullanarak işlemler yapan fonksiyonların adreslerini içeren bir yapıdır typedef struct tagsuper_block_operations { } SUPER_BLOCK_OPERATIONS, *PSUPER_BLOCK_OPERATIONS; 4.3 FILEOBJ ve FILE_OPERATIONS CSDOS Sanal Dosya Sistemi nde açılan her dosya FILEOBJ yapısıyla temsil edilmektedir. Bu yapı kullanılarak işlem yapan fonksiyonların adresleri ise FILE_OPERATIONS yapısında tutulmaktadır. typedef struct tagfileobj { DLIST_NODE dlink; DWORD dwcount; PDIR_ENTRY pdirentry; PFILE_OPERATIONS poperations; MODE mode; DWORD dwpos; DWORD dwopenflags; } FILEOBJ, *PFILEOBJ;

Yapının pdirentry ve poperations elemanları sırasıyla DIR_ENTRY ve FILE_OPERATIONS yapılarının adreslerini tutmaktadır. typedef struct tagfile_operations { } FILE_OPERATIONS, *PFILE_OPERATIONS; 4.4 DIR_ENTRY ve DIR_ENTRY_OPERATIONS CSDOS Sanal Dosya Sistemi nde de dizin girişleri için bir önbellek kullanılmaktadır. Önbellekteki dizin girişleri bir hash tablosu kullanılarak saklanırlar ve herbir dizin girişi bir DIR_ENTRY yapısıyla ifade edilmektedir. typedef struct tagdir_entry { DWORD dwcount; PINODE pinode; struct tagdir_entry *pparentdir; struct tagdir_entry *pmountdir; PDIR_ENTRY_OPERATIONS poperations; DLIST_NODE nextsibling; DLIST_HEADER subdir; } DIR_ENTRY, *PDIR_ENTRY; DIR_ENTRY yapısında ilgili dizin girişinin inode elemanını gösteren pinode isimli bir eleman vardır. Yapının pparendir elemanı üst dizin girişinin adresini tutan bir göstericidir. Yapının nextsibling elemanı ilgili dizinle aynı seviyedeki bir sonraki dizin girişinin adresini tutmaktadır. subdir elemanı ise ilgili dizinin varsa altdizinlerinden oluşan bağlı listenin başlangıcını tutmaktadır. typedef struct tagdir_entry_operatoins { } DIR_ENTRY_OPERATIONS, *PDIR_ENTRY_OPERATIONS; DIR_ENTRY_OPERATIONS yapısı DIR_ENTRY yapısıyla ilgili işlemler yapan fonksiyonların adreslerini tutan elemanlar içerir. 4.5 INODE ve INODE_OPERATIONS CSDOS Sanal Dosya Sistem inde mount işlemi ile bağlanan dosya sistemlerindeki dizin ve dosyalar için birer INODE yapısı bulunmaktadır. INODE yapısında dizin veya dosyanın bilgileri tutulmaktadır. Yapının başındaki elemanlar dosya sistemleri için ortak olan bilgileri tutarlar. Dosya sistemlerinin kendilerine özgü bilgileri ise ayrı yapılarda tutulmaktadır. Bu yapılar INODE yapısının içerisinde bulunan bir birlik içerisinde bulunurlar. INODE yapıları için de bir önbellek kullanılmaktadır. Önbellekte INODE elemanları bir hash tablosu biçiminde saklanmaktadır. Kullanılmak istenen dosyaya ilişkin INODE yapısı önce bu önbellekte aranır. Eğer bulunursa kullanılır, bulunamazsa önbellekte yeni bir INODE yapısı oluşturulur ve ilgili dosyanın bilgileriyle doldurulur.

typedef struct taginode { DWORD dwcount; struct tagdir_entry *pdirentry; PINODE_OPERATIONS poperations; DWORD ino; DEV dev; UID uid; GID gid; union INODE_SPECIFICS { MSDOS_INODE inomsdos; } u; } INODE, *PINODE; Yapının ino elemanı INODE numarasını tutar ve bu değer dosya sistemi genelinde tektir. Yapının pdirentry ve poperations elemanları sırasıyla DIR_ENTRY ve INODE_OPERATIONS yapılarının adreslerini tutmaktadır. u isimli birlikte ise ilgili dosya sistemine özgü bilgiler tutulmaktadır. typedef struct taginode_operations { } INODE_OPERATIONS, *PINODE_OPERATIONS; INODE_OPERATIONS yapısı ise INODE elemanlarıyla ilgili işlemler yapan fonksiyonların adreslerini tutan bir yapıdır. 4.6 İşlemlerin Yapılış Sırası Bir dosya sisteminin CSDOS Sanal Dosya Sistemi nde kullanılabilmesi için öncelikle dosya sisteminin FILE_SYSTEM yapısı oluşturulur ve RegisterFileSystem fonksiyonuyla FILE_SYSTEM_TYPE yapılarından oluşan bağlı listeye eklenir. BOOL RegisterFileSystem(PFILE_SYSTEM_TYPE pfstype); Daha sonra mount işlemi sırasında MOUNTED_FILE_SYSTEMS yapısı oluşturulur. FILE_SYSTEM_TYPE yapısının ReadSuperBlock fonksiyonu kullanılarak ilgili dosya sisteminin SUPER_BLOCK yapısı oluşturulur. Bundan sonra dosya sistemindeki dizinler ve dosyalar üzerindeki işlemler INODE, DIR_ENTRY ve FILEOBJ yapıları kullanılarak yapılacaktır. Dosya sisteminin FILE_SYSTEM_TYPE yapılarından oluşan bağlı listeden silinmesi için UnregisterFileSystem fonksiyonu kullanılır. BOOL UnregisterFileSystem(PFILE_SYSTEM_TYPE pfstype);

Kaynaklar 1. Understanding the Linux Kernel, Bovet Daniel P., Cesati Marco, O Reilly, 2001 2. Linux Kernel Internals (Second Edition), Beck Michael, Böhme Harald, Dziadzka Mirko, Knuitz Ulrich, Magnus Robert, Verworner Dirk-Addison Wesley-1998 3. The Linux Kernel v0.8-3, Rusling David A., 1999 4. Linux Kernel 2.4 Internals, Aivazian Tigran, 2001 5. The Linux Virtual File System Layer v1.6, Brown Neil, 1999 6. The Virtual File System in Linux, Rubini Alessandro, 1997