CSD İşletim Sistemi Projesinde, C İçerisinde Sembolik Makina Dillerininin Doğrudan Kullanımı Kaan Aslan 7 Nisan 2003 1. Giriş İş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. Sistemin başlatılması. 2. Yardımcı işlemcilerin programlanması. 3. Proseslerarası geçiş işlemleri. 4. Sayfalama işlemleri. 5. Çekirdek erişiminin düzenlenmesi için gereken kilitleme işlemleri. 6. Etkinliğin artırılmasına gereksinim duyulan diğer durumlar. İşletim sistemleri için etkinlik ve hızlı çalışma önemli olsa da 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 donanıma ilişkin her kodun başka işlemciler ve donanımlar için yeniden yazılacağı gözönünde bulundurulmalıdır. 2. Doğrudan Sembolik Makine Dili Kullanımına Olan Gereksinim Sembolik makina dillerinin işletim sistemi geliştirme sürecinde kullanılması iki biçimde olabilir. Birinci biçimde kod doğrudan 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. 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ı standard bir özellik değildir. Derleyiciler bunu bir eklenti olarak sağlarlar. 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 1 Kaan Aslan Makale Arşivi – www.kaanaslan.net 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çinmde sembolik makina dilinde yazılması uygun olmaz. Örneğin Intel işlemcilerinde haberleşme portlarından okuma yapmak için tek bir OUT makina komutu gerekirken biz bunu 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 sembolik makina dili yazımında C’deki nesneleri doğrudan kullanabiliriz. Örneğin: void Func(int *pVal) { ... _asm mov eax, pVal _asm mov [eax], pVal ... } Burada pVal göstericisi 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 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. 3. CSD Projesinde Sembolik Makine Dilinin Doğrudan Kullanılma Biçimi CSD projesinde sembolik makina dilinin doğrudan kullanımı makrolar yoluyla yapılmaktadır. Böylece derleyici ya da işlemci değişikiliklerinde 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: 2 Kaan Aslan Makale Arşivi – www.kaanaslan.net kbase.inl Dosyası #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. 3 Kaan Aslan Makale Arşivi – www.kaanaslan.net