CSD İŞLETİM SİSTEMİ PROJESİNDE C İÇERİSİNDE SEMBOLİK MAKİNA DİLLERİNİN DOĞRUDAN KULLANIMI Kaan Aslan 18/08/2004 [V: 1] Özet: Bu makalede CSD İşletim Sistemi Geliştirme Projesinde C içerisinde sembolik makina dillerinin kullanımı üzerinde durulmaktadır. Makale içerisinde doğrudan sembolik makina dilinin kullanım gerekçeleri ve buna ilişkin kodlama biçimleri ele alınmaktadır. 1. GİRİŞ İşletim sistemlerinin yazımı sırasında kodlamanın çok büyük bölümü taşınabilir bir biçimde C ile yapılabilse de küçük bir bölümünde sembolik makina dillerinin kullanılması kaçınılmazdır. İşletim sistemi geliştirme faaliyeti sırasında sembolik makina dillerinin kullanımlarını gerektiren tipik durumlar şunlardır: 1. 2. 3. 4. 5. 6. Sistemin başlatılması Yardımcı işlemcilerin programlanması Processlerarası geçiş işlemleri Sayfalama işlemleri Çekirdek erişiminin düzenlenmesi için gereken kilitleme işlemleri Etkinliğin artırılmasına gereksinim duyulan diğer durumlar İşletim sistemleri için etkinlik ve hızlı çalışma önemlidir. Fakat bu durum geliştiriciler tarafından obsesif bir biçimde abartılmamalıdır. C derleyicilerinin optimizasyon seçenekleri yükseltilerek zaten belirli bir etkinlik düzeyine ulaşılmaktadır. Kodlamada ne kadar fazla C kullanılırsa anlaşılabilirlik, genellik ve okunabilirlik o derece artırılmış olacaktır. Geliştiricilerin sembolik makina dillerine yönelmelerinde kabul edilebilir gerekçeleri olmalıdır. Ayrıca, CSD İşletim Sistemi çeşitli donanımlara uygulanabilecek biçimde tasarlanmaktadır. İşlemciye ve genel olarak donanıma ilişkin her kodun başka işlemciler ve donanımlar için yeniden yazılması gerektiği gözönünde bulundurulmalıdır. 2. DOĞRUDAN SEMBOLİK MAKİNA DİLİ KULLANIMINA OLAN GEREKSİNİM Sembolik makina dillerinin işletim sistemi geliştirme sürecinde kullanılması iki biçimde olabilir. Birinci biçimde kod doğrudan C’den çağrılabilecek bir fonksiyon olarak sembolik makina dilinde yazılır ve sembolik makina dili derleyicilerinde derlenerek bağlama işlemine sokulur. CSD Projesinde bu biçimde kullanımla karşılaşılmaktadır. İkinci biçimde ise sembolik makina dili C içerisinde, gömülü olarak (inline) doğrudan kullanılır. 1 C ve Sistem Programcıları Derneği - CSD İşletim Sistemi Geliştirme Projesi Bir sembolik makina dili kodunu fonksiyonel yazmakla C içerisinde doğrudan yazmak arasında önemli farklılıklar vardır: 1. C’de doğrudan sembolik makina dili kullanımı standart bir özellik değildir. Derleyiciler bunu bir eklenti olarak sağlarlar (C++’da asm bildirimine yer verilmiştir (ISO/IEC 14882 2003(E)- 7.4). Ancak semantik açıklama yapılmamış, bildirimin ifade ettiği anlam derleyicileri yazanlara bırakılmıştır.) Bu nedenle sembolik makina dilinin doğrudan kullanımı derleyiciden derleyiciye değişen bir biçimde yapılmaktadır. Örneğin GNU/gcc derleyicilerinde doğrudan kullanım biçimi ile Microsoft C derleyicilerindeki biçim tamamen farklıdır. Yani doğrudan sembolik makina dilinin kullanılması yalnızca başka donanımlara geçildiğinde değil, başka derleyicilere geçildiğinde de yeniden düzenleme gerektirecek işlemlerdir. 2. Birkaç satırlık kısa kodların fonksiyon biçiminde sembolik makina dilinde yazılması uygun olmaz. Örneğin Intel işlemcilerinde haberleşme portlarından okuma yapmak için tek bir IN makina komutu gerekirken biz bunu fonksiyonel biçiminde yazarsak en azından CALL ve RET makina komutlarını da kullanmak zorunda kalırız. Üstelik parametre aktarımı söz kolduğunda ek komutlara da gereksinim duyulacaktır. 3. Doğrudan yazımında belirli ölçülerde C’deki değişkenleri kullanabiliriz. Örneğin: void Func(int *pVal) { ... _asm mov eax, pVal _asm mov[eax], pVal ... } Burada pVal göstericisini ile hem doğrudan hem de sembolik makina dili içerisinde kullanabiliriz. Linux çekirdeği tamamen GNU/gcc derleyicisi ile derlenmek üzere düzenlenmiştir. Kaynak kodlar içerisinde bu derleyiciye özgü pek çok eklentilerin kullanıldığı görülmektedir. Çekirdek kodlarında doğrudan sembolik makina dili kullanımı da bu derleyicilerin öngördüğü biçimde yapılmıştır. Oysa CSD işletim sisteminin – şimdilik nihai derleme ortamı GNU/gcc derleyicisi olsa da- küçük değişikliklerle başka derleyicilerde de derlenmesi öngörülmektedir. Çalışmalarda ağırlıklı olarak bu derleyici kullanılsa da hedef başka derleyicilere geçildiğinde kod düzenlemesinin hızlı bir biçimde yapılmasıdır. Bu nedenle tasarımda GNU/gcc özelliklerinin mümkün olduğunca az kullanılması yoluna gidilmektedir. 2 C ve Sistem Programcıları Derneği - CSD İşletim Sistemi Geliştirme Projesi 3. CSD PROJESİNDE SEMBOLİK MAKİNA DİLİNİN DOĞRUDAN KULLANILMA BİÇİMİ CSD projesinde sembolik makina dilinin doğrudan kullanımı makrolar yoluyla yapılmaktadır. Böylece derleyici ya da işlemci değişikliklerinde değiştirilmesi gereken kod parçalarının belirlenmesinin kolaylaştırılacağı düşünülmüştür. Doğrudan sembolik makina kodu içeren makolar _INL soneki ile isimlendirilerek .inl uzantılı dosyalara yerleştirilir. Örneğin Microsoft C derleyicileri için oluşturulmuş bir .inl dosyası şöyle olabilir: kbase.inl DOSYASI #ifndef _KBASE_INL_ #define _KBASE_INL_ ... #define EnableLocalIRQ_INL() _asm sti \ \ #define DisableLocalIRQ_INL() _asm cli ... #endif \ \ Bu dosya hangi derleyici ve işlemci ailesinde çalışılıyorsa o derleyicinin ve işlemcinin öngördüğü biçimde yeniden oluşturulmalıdır. Programcı _INL makrolarını doğrudan ya da sarma inline fonksiyonlar içerisinde kullanabilir. Aşağıdaki gibi örnek bir kullanım verebiliriz: PUBLIC INLINE void GetSpinLockIRQ(PSPIN_LOCK pSpinLock) { DisableLocalIRQ_INL(); GetSpinLock_INL(pSpinLock); } 3 C ve Sistem Programcıları Derneği - CSD İşletim Sistemi Geliştirme Projesi