Ç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