CSD İŞLETİM SİSTEMİ PROJESİNDE C İÇERİSİNDE SEMBOLİK

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