çekirdek kodlarında standart c fonksiyonlarının kullanımı

advertisement
ÇEKİRDEK KODLARINDA STANDART C
FONKSİYONLARININ KULLANIMI
Kaan Aslan
[V: 2]
Özet: Bu makalede işletim sistemi geliştirme projelerinde genel fonksiyon olarak standart
C fonksiyonlarının kullanılması ele alınmaktadır. Ayrıca bölümün sonunda CSD İşletim
Sistemi Geliştirme Projesi’nde çekirdek içerisinde kullanılacak olan standart C
fonksiyonlarının listesi verilmiştir.
1. GİRİŞ
Çekirdek kodlarının yazılması sırasında pek çok genel fonksiyona gereksinim duyulur.
Özellikle blokların ve stringlerin kopyalanması, karşılaştırılması gibi işlemler çekirdeğin pek çok
bölümü geliştirilirken kullanılmaktadır. Çekirdek geliştirilirken genel fonksiyonlar üzerinde
anlaşma sağlamak özellikle grup halinde çalışmalarda önemlidir. Aynı genel fonksiyonların farklı
gruplar tarafından başka bir biçimde yeniden yazılması etkinliği azaltır. Örneğin, bir adresten bir
adrese belirli bir miktarda byte kopyalamak için iki farklı grubun iki farklı fonksiyon yazması ve
bu işlem için kendi fonksiyonlarını kullanması gereksiz bir durumdur. Genel fonksiyonların
kullanımı için iki seçenek söz konusu olabilir:
1. Temel fonksiyonlar konusunda anlaşmak ve tüm grupların onları kullanmasını sağlamak. Bu
yöntem benimsenirse bu fonksiyonların geliştirme süreci başlamadan önce yazılmaları
gerekecektir.
2. Standart C fonksiyonlarını kullanmak.
CSD İşletim Sistemi Geliştirme Projesi’nde ikinci yöntem benimsenmiştir.
2. İŞLETİM SİSTEMİ BAĞIMLI VE İŞLETİM SİSTEMİNDEN BAĞIMSIZ
STANDART C FONKSİYONLARI
Standart C kütüphanesi pek çok genel amaçlı fonksiyona sahiptir. Bu fonksiyonlar çekirdek
kodlamasında doğrudan kullanılabilir. Örneğin prototipleri <string.h> içerisinde bulunan mem
ve str ile başlayan fonksiyonlar doğrudan kullanılabilirler. Bu fonksiyonlar zaten derleyicilerde
bulunduğundan geliştirme sürecinde test denemeleri için ayrıca yazılmaları gerekmez. Tabi
modüllerin birleştirilmesi sırasında bu fonksiyonların iyi yazılmış biçimlerinin çekirdeğe
yerleştirilmesi uygun olur. Bu nedenle standart C fonksiyonlarının etkinliği için derleyiciye
güvenmek yerine bunları çekirdeğe uygun bir biçimde yeniden yazmak tercih edilebilir. Örneğin,
<string.h> içerisindeki pek çok fonksiyon Intel işlemcilerinde string komutları kullanılarak daha
etkin yazılabilir. CSD işletim sistemi geliştirme projesinde LIBC grubu standart C kütüphanesinin
farklı uyarlamaları üzerinde çalışacaktır. Çekirdeğin geliştirilmesi bittiğinde işletim sistemi bu
fonksiyonlarla derlenip bağlanacaktır.
1
C ve Sistem Programcıları Derneği - CSD İşletim Sistemi Geliştirme Projesi
Standart C fonksiyonlarının hepsi çekirdek geliştirmesinde kullanılamaz. Çünkü bazı
fonksiyonların yazılabilmeleri için işletim sisteminin var olması gerekir. Örneğin prototipleri
<stdio.h> içerisinde bulunan fonksiyonlar işletim sisteminin dosya sistemiyle ilgili işlemler
yaparlar. Benzer biçimde <stdlib.h> içerisindeki exit ve abort fonksiyonları da ancak işletim
sisteminin var olduğu durumda anlamlıdırlar. İşletim sistemine bağlı ve işletim sisteminden
bağımsız fonksiyonların belirlenmesi ve çekirdek gruplarının işletim sisteminden bağımsız olan
fonksiyonları kullanması gerekir. CSD İşletim Sistemi Geliştirme Projesi’nde geliştirme
gruplarının kullanacağı işletim sisteminden bağımsız strandart C fonksiyonları son bölümde
belirtilmiştir.
Çekirdeğin bazı bölümlerinde klavyeye ilişkin fonksiyonların kullanılması gerekmektedir.
Klavye fonksiyonları için çekirdek içerisinde Destek Grubu tarafından ayrı bir kütüphane
oluşturulacaktır. Çekirdek geliştiricilerinin gerektiğinde klavye fonksiyonlarını güvenli bir
biçimde _SUSPICIOUS makroları ile kullanması salık verilmektedir.
Standart C kütüphanesinde prototipleri <stdio.h> içerisinde bulunan giriş/çıkış fonksiyonları
işletim sistemi bağımlıdır ve bu fonksiyonlar işletim sisteminin sistem fonksiyonlarını kullanırlar.
Standart kütüphane içerisinde başı f harfi ile başlatılmış fonksiyonlar (fopen, fread, fwrite gibi …)
dosya bilgi göstericisiyle (stream) çalışırlar. Dosya bilgi göstericisi almayan ve başı f ile
başlamayan diğer fonksiyonların çoğu default olarak stdin ya da stdout dosyalarına ilişkindir.
Örneğin, printf ve scanf fonksiyonları dosya sistemiyle bütünleştirilmiştir ve bu fonksiyonlar da
aslında birer dosya fonksiyonlarıdır. CSD İşletim Sistemi Geliştirme Projesi’nde yalnızca dosya
sisteminden soyutlanmış ve daraltılmış bir biçimde printf ve onların kardeşleri olan vprintf,
sprintf, vsprintf fonksiyonları kullanılacaktır.
CSD İşletim Sistemi process başına çoklu heap kullanımını destekleyen bir sistemdir. CSD
sisteminde çekirdeğin de ayrı bir heap alanı olacaktır ve çekirdek için gereken dinamik tahsisatlar
için çekirdeğin heap alanı kullanılacaktır. Çekirdeğin ve process’lerin heap organizasyonu ve
dinamik tahsisat fonksiyonlarının yazımı Tasarım ve İç Çekirdek Grubu ile Destek Grubu
tarafından işbirliği ile yapılacaktır. Ancak çekirdek geliştiricileri heap organizasyonu yapılana
kadar malloc, realloc ve free standart C fonksiyonlarını _SUSPICIOUS makrosuyla
kullanabilirler. Bu fonksiyonlar daha sonra gerçek heap fonksiyonlarıyla değiştirilecektir.
3. DİĞER İŞLETİM SİSTEMLERİNİN GELİŞTİRİLMESİNDE STANDART C
FONKSİYONLARININ KULLANIMI
MINIX ve LINUX sistemlerinde standart C fonksiyonlarının çekirdek içerisinde kullanımları
benzerdir. Her iki sistemde de <string.h> dosyası içerisindeki fonksiyonlar çekirdek
geliştirmesinde yoğun olarak kullanılmıştır. MINIX sistemlerinde bu fonksiyonların hızlı çalışan
uyarlamalarının sembolik makina dilinde yazıldığını görüyoruz (LIB386). Her iki sistemde de
ekrana yazma amacıyla printk fonksiyonu kullanılmıştır. printk, printf fonksiyonunun bu
sistemlere özgü daraltılmış biçimidir. MINIX kaynak kodlarında printk yerine printf
görülmektedir:
#define printf printk
LINUX sistemlerinde çekirdek içerisinde kullanılan standart C fonksiyonlarının printk
dışındakileri linux/lib içerisinde bulunmaktadır. printk fonksiyonu ise linux/kernel dizini içerisine
2
C ve Sistem Programcıları Derneği - CSD İşletim Sistemi Geliştirme Projesi
yerleştirilmiştir.LINUX sistemlerinde çekirdek içerisindeki dinamik bellek tahsisatları kmalloc,
kfree isimli içsel çekirdek fonksiyonlarıyla yapılmaktadır.
XINU sisteminde standart C fonksiyonları kullanılmamıştır ancak bu işlemleri yapan benzer
fonksiyonlar yazılmıştır. MMURTL sisteminde de standart C fonksiyonları yerine çoğu sembolik
makina dilinde yazılmış olan yardımcı fonksiyonlar kullanılmıştır. Internet üzerinde
geliştirilmekte olan bazı sistemlerde genel fonksiyonlar için standart C fonksiyonları, bazılarında
ise benzer işlemleri yapan özel fonksiyonlar tercih edilmiştir.
4. GELİŞTİRME SÜRECİNDE YİNELENEN GENEL FONKSİYONLAR
Şüphesiz çekirdeğin geliştirilmesinde standart C fonksiyonlarının dışında başka genel
fonksiyonlara da gereksinim duyulacaktır. Bu fonkiyonlar geliştirme aşamasında belirlenecek ve
Destek Grubu tarafından ortak ve standart biçimlere dönüştürülecektir. Genel fonksiyonların
belirlenmesi geliştirme süreci içerisinde çeşitli aşamalarda değerlendirilecektir.
5. CSD ÇEKİRDEK GRUPLARINDA KULLANILACAK STANDART C
FONKSİYONLARI
Bu bölümde CSD İşletim Sistemi Geliştirme Projesi’nde Tasarım ve İç Çekirdek Grubu,
Dosya Sistemi Grubu ve Destek Grubu’nun kullanacağı standart C fonksiyonlarının listesi
verilmektedir. (Parantez içerisindeki _SUSPICIOUS fonksiyonun _SUSPICIOUS makrosu altında
güvenle kullanılması gerektiğini belirtmektedir.)
<stdio.h>
printf, sprintf, vprintf, vsprintf
<string.h>
memcmp, memchr, memcpy, memmove, memset, strcpy, strcat, strchr, strcmp, strcspn,
strlen, strncmp, strncat, strncpy, strspn, strpbrk, strrchr, strstr, strtok
<stdlib.h>
atoi, atol, atof, strtol, strtod, srand, rand, qsort, bsearch, abs, labs, malloc (_SUSPICIOUS),
calloc (_SUSPICIOUS), free (_SUSPICIOUS)
<ctype.h>
isascii, isalnum, isalpha, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper,
isxdigit, tolower, toupper
<math.h>
sin, cos, tan, sinh, cosh , tanh , asin , acos, atan , atan2, exp, log, log10, pow, sqrt , ceil, floor,
fabs, ldexp, frexp, modf , fmod
3
C ve Sistem Programcıları Derneği - CSD İşletim Sistemi Geliştirme Projesi
<limits.h>
Buradaki makroların hepsi doğal türlerin sınır değerleri için kullanılabilir.
<stddef.h>
Bu dosyada bulunan standart makroların hepsi kullanılabilir
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. Operating Systems Design and Implementation, Tanenbaum Andrew A, Woodhul Albert
S., Prentice-Hall Inc, 1997
4. Linux Internals, Bar Moshe, McGraw-Hill-2000
5. Mmurtl V1.0 (Writing Your Own 32 bit Operating System), Burgess Richard A., Sensory
Publishing Inc-2002
6. MicroC/OS-II The Real-Time Kernel (Second Edition), Labrosse Jean J., CMP Books2002
7. Operating System Design VOL. 1: The XINU Approach, Fossum Timothy V., Prentice
Hall Inc-1988
4
C ve Sistem Programcıları Derneği - CSD İşletim Sistemi Geliştirme Projesi
Download