İŞLETİM SİSTEMİ YAZIMINDA SEMBOLİK MAKİNE DİLİ KULLANIMI ve NASM DERLEYİCİSİ Selim Nasır [V:1] Özet: İşletim sistemlerinin yazımında yüksek seviyeli programlama dilleri ile yap ılamayacak işlemlerde sembolik makine dillerinin kullanımı zorunlu hale gelmektedir. Bu makalede işletim sistemi yazımında sembolik makine dillerinin yeri ve CSD i şletim sisteminin yazımında kullanılan NASM derleyici sisteminin seçilme gerekçesi anlatılmaktadır. 1. GİRİŞ Bir bilgisayar sistemi donanım, sistem programları ve uygulama programlarından oluşmaktadır. Günümüzde artık uygulama programlarının tamamı C, C++ gibi yüksek seviyeli diller ile yazılmaktadır. İşletim sistemi gibi çok aşağı seviyeli işlemler yapan sistem programlar ında ise yine olanaklı oldukça yüksek seviyeli diller kullanılır. Ancak özellikle donanım bağımlı ve yüksek seviyeli diller ile yapılamayacak işlemlerde sembolik makine dillerinin kullan ılması zorunlu hale gelmektedir. Burada dikkat edilmesi gereken nokta özellikle i şletim sistemi yazımı gibi büyük projelerde yalnızca gerekli yerlerde sembolik makine dillerinin kullan ılmasıdır. Çünkü, • • • • Sembolik makine dilleri donan ım bağımlıdır. Yani elde edilen çalışabilir kodlar diğer donanım mimarilerine aktar ılamazlar. Sembolik makine dili programlama hatalar ına oldukça açıktır ve hataların izlenmesi zordur. Yazılan kodun anlaşılması ve değiştirilmesi yüksek seviyeli dillere göre daha zordur. Algoritmik tasarımdaki küçük bir değişiklik varolan tüm sembolik makine dili kodunu geçersiz duruma getirebilir. Bu durumda programcı ya tüm kaynak kodunu yeniden yazmalıdır ya da belli bir algoritmik tasarıma bağımlı kalmalıdır. Yukarıda belirtilen nedenlerden dolayı CSD işletim sisteminde de ağırlıklı olarak C programlama dili kullan ılmış ve yalnızca C programlama dili ile yapılamayacak işlemlerde sembolik makine diline başvurulmuştur. Tipik olarak aşağıdaki işlemlerde sembolik makine diline gereksinim duyulmaktadır: • • • • Doğrudan yazmaçlara ve giriş/çıkış birimlerine erişilmesi Donanım bileşenlerinin programlanması Hız ya da yer optimizasyonu gerektiren kritik kodlar ın yazımı Boot sektöre yerleştirilecek yükleyici programın yazımı CSD işletim sisteminde izlenen genel tasar ım mantığı gerekli fonksiyonların sembolik makine dilinde yazımı ve bu fonksiyonların C modüllerinden çağrılması biçimindedir. 2. TEMEL SEMBOLİK MAKİNE DİLİ DERLEYİCİLERİ Bir mikroişlemciye ilişkin sembolik makine dili o mikroişlemcinin üreticisi tarafından zaten belirlenmiştir. Sembolik makine dili üretici ba ğımlı olduğundan C programlama dili gibi standartlaşmış bir dil değildir ve bu nedenle sembolik makine dili derleyicileri aras ında farklılıklar bulunmaktadır. 80x86 tabanlı mikroişlemciler üzerinde sembolik makine dili ile programlama yapmak üzere kullan ılan derleyicilerde AT&T sözdizimi ya da Intel sözdizimi temel alınmıştır. Her iki sözdizimi arasındaki belirgin farklar şunlardır: 1 C ve Sistem Programcıları Derneği – CSD İşletim Sistemi Geliştirme Projesi • AT&T ve Intel sözdizimlerinde kaynak ve hedef operandlar ters sırada belirtilirler. Örneğin, Intel sözdiziminde add eax, 4 biçimindeki bir komut AT&T sözdiziminde addl $4, %eax • biçiminde belirtilir. AT&T sözdizimindeki ‘kaynak, hedef’ belirtimi önceki Unix sembolik makine dili derleyicileri ile uyumu sağlamak için korunmuştur. AT&T sözdiziminde hazır operandlar $ öneki ile başlatılır. Intel sözdiziminde ise hazır operandlar için önek kullanılmamaktadır. Örneğin, Intel sözdiziminde push 4 biçimindeki bir komut AT&T sözdiziminde pushl $4 • • biçimindedir. AT&T sözdiziminde yazmaç operandlar ı % öneki ile başlatılır. Intel sözdiziminde ise yazmaç operandları için önek kullanılmamaktadır. AT&T sözdiziminde bellek operandlar ının uzunlukları komut isminin son karakterinden belirlenebilir. Komutta kullan ılan ‘b’, ‘w’ ve ‘l’ sonekleri sırasıyla byte (8-bit), word (16-bit) ve long (32-bit) uzunlukta bellek operandlarını belirtirler. Intel sözdiziminde bellek operandlar ının uzunlukları için byte ptr, word ptr ve dword ptr ifadeleri kullan ılmaktadır. 2.1 GAS (GNU Assembler) GNU sembolik makine dili derleyicisidir. GAS 32-bit bir Unix derleyicisini desteklemek için tasarlandığından AT&T sözdizimini kullanmaktad ır. Linux kaynak kodlarında bütünüyle GAS sözdizimi kullanılmaktadır. Unix/Linux sistemlerinde kullanılan temel C/C++ derleyicisi olan GCC (GNU C Compiler) derleyici sisteminde satıriçi (inline) sembolik makin e dili yazımı da GAS sistemi ile yapılmaktadır. Sonuç olarak Linux sistemlerinde doğal sembolik makine dili derleyicisi GAS derleyicisidir. 2.2 NASM (Netwide Assembler) NASM pek çok amaç dosya formatını destekleyen bir 80x86 sembolik makine dili derleyicisidir ve Intel sözdizimini kullanmaktad ır. NASM bazı farklılıkları dışında DOS/Windows sistemlerinde kullanılan MASM/TASM derleyicileri ile benzer özelliklere sahiptir ancak MASM/TASM derleyicilerinden daha esnek özellikleri bulunmaktadır. 3. CSD İşletim Sisteminde Sembolik Makine Dili Kodlarının Yazımı CSD işletim sisteminin ilk sürümü yaln ızca 80x86 tabanlı sistemleri destekleyecek biçimde yazılacaktır. 80x86 tabanlı sistemlere ilişkin kodlamalar /arch/i386 dizinin altında bulunmaktadır. İşletim sisteminin sembolik makine diline ili şkin kodlarının yazımında bir tercih noktasına gelinmiş ve GAS ile NASM derleyicileri arasında bir seçim yapılmıştır. Aşağıdaki nedenler gözönünde bulundurularak sembolik makine dili kodlar ının NASM derleyicisi yazılmasına karar verilmiştir: • • DOS/Windows ortamlarında sembolik makine dili ile programlama yo ğun olarak MASM/TASM derleyicileri ile yapılmaktadır. NASM derleyicisinin MASM/TASM derleyicileri ile benzerliği nedeniyle kullanımı ve kodların sözdizimsel olarak algılanması GAS derleyicisine göre daha kolaydır. NASM derleyicisi hem DOS/Windows hem de Linux sistemlerinde kullanılabileceğinden yazılan kaynak kodların her iki platformda da test işlemlerinin yapılabilmesi olanaklı hale gelmektedir. 2 C ve Sistem Programcıları Derneği – CSD İşletim Sistemi Geliştirme Projesi • NASM derleyicisi pek çok amaç dosya formatını desteklemektedir. Örneğin, NASM derleyicisi çıktı olarak düz çalışabilen dosya (pure binary) üretebilmektedir. Böylece platform ba ğımsız çalışabilen dosya elde edilebilmektedir. Kaynaklar 1. 2. 3. 4. Operating Systems – Design and Implementation (Second Edition), A.S.Tanenbaum, A.S.Woodhull, Prentice Hall Inc, 1997 80x86 Sembolik Makine Dili, Kaan Aslan, C ve Sistem Programcıları Derneği, 2003 www.gnu.org, The GNU Assembler www.cryogen/Nasm, The Netwide Assembler : NASM 3 C ve Sistem Programcıları Derneği – CSD İşletim Sistemi Geliştirme Projesi