CSD İşletim Sistemi Projesinde, C İçerisinde Sembolik

advertisement
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
Download