İşletim Sistemi Tasarımında Yeni Bir Stratejiye Doğru

 [image of a Hurd Metafont Logo] (jpeg 10k) (jpeg 20k) patent sorunlarından dolayı gif kullanmıyoruz

[ English | Hebrew | Türkçe ]

Bu makale, Özgür Yazılım Vakfı'nın (Free Software Foundation), GNU sisteminin bir ürünü olan yeni işletim sistemi Hurd'u neden geliştirdiğini anlatır. Hurd, Carnegie Mellon Üniversitesi'nin geliştirdiği Mach 3.0 çekirdeği üzerine kuruludur ve Mach çekirdeğinin sanal bellek yönetimi ve mesaj iletim araçlarını kullanır. GNU C Kütüphanesi, Unix sistem çağrıları arabirimini sunar ve bu kütüphane tarafından sağlanamayan hizmetler için de Hurd'e başvurur. Hurd işletim sisteminin tasarımı ve uygulanması, Michael Bushnell'in önderliğinde; Richard Stallman, Roland McGrath, Jan Brittenson ve diğer geliştiricilerden oluşan bir ekip tarafından gerçekleştirilmektedir.

1. Bölüm: İşletim Sistemi Tasarımına Daha Uygulanabilir Bir Yaklaşım

İşletim sisteminin temel amacı, tek bir bilgisayarın kaynaklarını, çeşitli programlar arasında etkin ve üretken bir şekilde paylaştırmaktır. Bu paylaştırma işlemi; bellek koruması, öncelik tashihli zaman paylaşımı, G/Ç çevresel birimlerine erişim eşgüdümü ve diğer hizmetleri kapsamalıdır. Ayrıca, işletim sistemi çok sayıda kullanıcının bir bilgisayarı paylaşabilmesine olanak tanımalıdır. Birden fazla kullanıcının bir sistemi paylaşması durumunda, kullanıcıların birbirlerine zarar vermeden çalışabilmeleri için çeşitli hizmetler sağlanmalıdır. Ayrıca, herhangi bir önişleme gerek duyulmaksızın kaynakların paylaşılması sağlanmalı ve fiziksel birimlere erişimi sağlayan araçlar sunulmalıdır.

Mevcut bilgisayar sistemlerinde; bu olanakları sunmak için çekirdek adı verilen büyük bir program kullanılır. Çekirdek, tüm kullanıcı programları tarafından erişilebilir olmalıdır, bu nedenle; sisteme işlevsellik katmanın yolu çekirdeği geliştirmekten geçer. İşlemlerin etkileşimi için tek yol, çekirdek tarafından sunulan özelleşmiş bireysel hizmetlerdir, bu nedenle yeni işlevlerin eklenmesi için başka bir yer düşünülemez. Zaman içinde, bir çok özellik çekirdeğe eklenir ve bu eklemeler sürer gider.

Geleneksel bir sistem, kullanıcılara eğer çekirdekten anlıyorlarsa ve yetkileri varsa; çekirdeğe çeşitli bileşenler eklemelerine izin verir. Çekirdeğe eklenen yeni bileşenlerin denenmesi süreci, yani; düzenle-derle-hata ayıkla döngüsü, diğer programların denenmesinden daha ızdırap vericidir. Üstelik bu işlem, sisteme bağlı başka kullanıcılar varken yapılamaz, zira; çekirdeğe bileşen ekleme işlemi, -eğer bir hata oluşursa- genellikle sistemin çökmesi ile sonuçlanır ve diğer kullanıcıların sistemi kullanması mümkün olamaz. Çekirdek genelde sayfalanamaz. (Sayfalanır çekirdek kullanan sistemler vardır fakat hangi kesimin sayfalanacağına karar vermek güçtür ve sayfalanır çekirdek yapısı hatalara açıktır. Genelde kullanılan mekanizmalar oldukça karmaşıktır, ve bu karmaşık yapı en basit eklentileri eklerken bile güçlükler çıkarır.)

Kısıtlamalar nedeniyle, geleneksel çekirdeğin duvarı ardında olması gereken işlevsellik, kesin bir zorunluluk olmadığı sürece sistemlere dahil edilmemiştir. Aç/oku/yaz arabirimi ile en iyi şekilde uygulanabilecek pek çok iyi fikir, geleneksel sistemlerdeki monolitik çekirdeğin doğasından kaynaklanan sorunlar yüzünden uygulanamamıştır. Yeni fikirleri uygulama yetkisine sahip olanlar sadece kendi sistemlerinin yöneticisi olan ayrıcalıklı kullanıcılar olmuşlardır. Yazılım telif haklarının, çekirdek kaynak kodunun okunmasına bile engel olması zaten bulanık olan durumu daha da karartmaktadır.

Smalltalk-80 ve Lisp Machine gibi bazı sistemler bu problemi aşmak için yöntemler sunmuşlardır; sistem kodu ile kullanıcı kodunun ayırt edilmemesi, yani; kullanıcının tüm sisteme erişmesi ve gereksinimine göre değiştirebilmesi. Her iki sistem de kolayca yenileme ve ekleme imkanları sunan programlama dilleri üzerine kuruluydular ve bir ölçüde başarılı oldular. Fakat, bir işletim sistemi tasarımının temel hedeflerinden biri olan kullanıcı programlarını birbirlerinden izole etme işleminde başarılı olamadılar.

Mach 3.0 çekirdeğini kullanan projelerin çoğu, işletim sistemi tasarımının değişmesi güç geleneklerine bağlı kaldılar. İç yapı farklı olsa da, kullanıcı ve sistem arasındaki büyük engel bâki kaldı. Tekli sunucular, inşa edilmeleri kolay olsa da, monolitik çekirdeklerin tüm kusurlarını taşımaya devam ettiler.

Bir çoklu sunucu, çekirdeğin işlevselliğini iyi tanımlanmış arabirimlerle mantıksal kısımlara böler. Bu bölme işlemi iyi yapıldığında, değişiklik yapmak ve işlev eklemek daha kolaydır. Öyle ki; çoklu sunucu projelerinin çoğu daha iyi sonuçlar vermiştir. Sistemin daha büyük bir kısmının sayfalanabilir olması sağlanmıştır. Sistemde hata ayıklama işlemi kolaylaşmıştır. Sisteme yeni eklenen bileşenlerin, diğer kullanıcıları engellemeden denenmesi imkanı doğmuştur. Tabii, sistem ve kullanıcı arasındaki duvar bâki kalmıştır, ayrıcalıklı yetkilere sahip kullanıcılar dışında kimsenin bu duvarı geçmesi mümkün değildir.

GNU Hurd, diğerlerinin aksine, sistem koduna ait alanın mümkün olduğunca kısıtlandığı bir yapıda tasarlanmıştır. Programlar, çekirdeğin sadece birkaç elzem kısmı ile iletişim kurma gereği duyarlar; sistemin geri kalan kısmı dinamik olarak değiştirilebilir şekilde tasarlanmıştır. Kullanıcılar, sistemin geri kalanı kısmında, neye ihtiyaçları varsa kullanabilirler. Sisteme kendilerinin ve başkalarının faydalanabileceği yeni bileşenler ekleyebilirler. Kullanıcıların, başkalarına ait hizmetleri kullanmak için karşılıklı güven sözleşmesine ihtiyacı yoktur, ayrıca herhangi bir kullanıcıya ait hizmetleri kullanmak sistemi tehlikeye atmaz.

Bu güvenlik, kullanıcıların hangi sistem bileşenlerini kullanarak birbirleri ile iletişim kuracaklarının önceden belirlenmesi ile sağlanmıştır. Bu bileşenlerden biri olan authentication server (doğrulama sunucusu) kullanıcıların kimliklerini doğrular. Programlar birbirlerinin kimliklerini doğrulamak için güvendikleri bir doğrulama sunucusuna başvurmak zorundadırlar. Process server (işlem sunucusu) adında diğer bir bileşen de yetkili kullanıcının sistem bileşenleri üzerindeki denetimini sağlar.

Tüm kullanıcı programları işlem sunucusu ile iletişimde olmak zorunda değildir; bu hizmet sadece ihtiyaç duyan programlara sağlanır. Benzer şekilde, doğrulama sunucusu da, birbirlerini doğrulama gereği duyan programların başvurduğu bir sunucudur. Network uygulaması, dosya sistemleri, program çalıştırma mekanizması (setuid dahil) ve diğer sunucular da özel bir statüde değildirler.

Çevirmen Mekanizması (The Translator Mechanism)

Hurd, Mach çekirdeğinin portlarını öncelikle kullanıcılar ve sunucular arası iletişim için kullanır. (Bir Mach portu, Mach görevleri üzerindeki özel bir iletişim noktasıdır. Bu noktadan mesajlar gönderilir ve alınır.) Her bir port temsil ettiği objenin üstlendiği özel bir protokol kümesini uygular. Genel giriş/çıkış işlemleri için kullanılan G/Ç protokolü, ağ işlemleri için kullanılan soket protokolü, işlemler ve diğerlerini kontrol eden işlem protokolü Hurd tarafından tanımlanan protokollerden birkaçıdır.

Sunucuların çoğuna dosya açarak erişilir. Normalde, bir dosya açtığınızda, o dosya ile ilgili bir port yaratmış olursunuz. Bu port dosyanın bulunduğu dizinin sahibi olan sunucuya ait olur. Örneğin; disk temelli bir dosya sistemi, normal olarak, çok sayıda port sunar; bunların her biri açık bir dosyayı yada dizini ifade eder. Bir dosya açıldığında, sunucu yeni bir port yaratır, bu portu dosya ile ilişiklendirir ve portu dosyayı açan programa bildirir.

Ayrıca, bir dosyaya iliştirilmiş bir çevirmen de olabilir. Bu durumda, sunucu, dosyaya işaret eden portu bildirmek yerine o dosya ile ilişkili bir çevirmen programı çalıştırır. Dosyaya ilişkin port bu çevirmene verilir, dosya açma işleminin sona ermesi için çevirmenden bir port bildirmesi istenir.

Bu mekanizma mount (bağlama) için kullanılır; her bir bağlama noktası için bir çevirmen vardır. Bir program, bir bağlama noktasını açtığında ilgili çevirmen çalıştırılır; bu örnekte çevirmen, bağlanmış dosya sistemini anlayabilen bir programdır ve sonuçta çevirmen dosyayı açmak isteyen programa bir port bildirir. Çevirmen çalışmaya başladıktan sonra, kapatılıncaya kadar işlevini sürdürür; ana dosya sistemi, çevirmen ile bağlantısını bir port ile gerçekleştitir.

Bir dosyanın sahibi, özel bir izne gerek duymadan, bu dosyayı bir çevirmen ile ilişkilendirebilir. Bunun anlamı herhangi bir programın çevirmen olarak tanımlanabileceğidir. Tabi, çevirmen dosya protokolüne uymuyorsa sistem beklenildiği gibi çalışmayacaktır. Fakat, Hurd'un yapısı sayesinde, karşılaşabileceğiniz en kötü sonuç kesme ile önüne geçebileceğiniz geçici bir takılmadır.

Çevirmenlerin bir kullanım alanı da hiyerarşik yapılandırılmış verilere dosya protokolünü kullanarak erişim sağlamaktır. Örneğin ftp programı kullanıcı arabiriminin tüm karmaşası ortadan kaldırılmıştır; artık kullanıcıların FTP'yi temsil eden dizini bilmeleri yeterlidir, yeni komutlar öğrenmek yerine kendi sistemlerine ait komutlarla (örneğin; ls veya cp) FTP üzerinde dosya erişimi yapabilirler. Benzer şekilde çevirmenlerle tar veya gzip gibi programlar daha kolay kullanılabilir. (Böylesine soyutlanmış bir erişim bazı yükler getirse de kullanımı çok rahattır.)

Genel Hizmetler

Çevirmenlerin kullanımı ile dosya sisteminin, dosyaya benzemeyen arabirimleri de barındırması sağlanabilir. İletişim için Mach mesajlarını kullanan ve bu yolla X protokolünün bir sürümünü uygulayan bir hizmeti ele alalım; her bir X ekranı için, uygun bir programın çevirmenliği ile bir dosya oluşturulabilir. X istemcileri de bu dosyayı açarak erişim sağlayacaklardır. Bu erişim dosya işlemleri ile gerçekleşektir, tabii oku, yaz gibi işlemler değil; XCreateWindow veya XDrawText gibi yeni işlemler kullanılacaktır. Bu örnekte, dosya sistemi protololü, sadece buluşma için kullanılan düğümün özelliklerini değiştirmek için kullanılır. Bu düğüm, genel G/Ç işlemlerini desteklemek zorunda değildir ama message_not_understood (ileti anlaşılmadı) gibi iletilere geri bildirim yapabilmelidir.

Hiyerarşik dosya sistemleri gibi yapılandırılmış olanlar dışında, Hurd hizmetlerinin çoğuna çevirmen mekanizması ile erişilir. Örneğin; parola sunucusu'na (password server) ve ağ protokolüne böyle erişilir. Çevirmenlerin bu şekilde kullanılması Roland McGrath'in fikriydi.

Akıllı Dosya Sistemi Örnekleri

Hurd işletim sisteminde çevirmenler, başka bir dosya sisteminden bir kesiti temsil edebilirler, tabi semantiği biraz değişik olarak. Örneğin; çevirmenlerle, bağlı dosya sisteminin, aslı değiştirilmeden, ama değişitirilen dosyaları başka bir yerde tutarak, tek bir okunur/yazılır dosya sistemi gibi davranması sağlanabilir. (Bu kaynak kodların idaresinde faydalı olabilir.)

Hurd'de çevirmenler ile bir kaç dizinin içeriği çakışma çözümlemesi de yapılarak, kavramsal olarak tek bir dizine bağlanabilir. Bu yöntem ile kullanıcılara çalıştırmak isteyebilecekleri tüm programlar tek bir dizin altında sunulabilir. Çevirmenlerin başka faydalı uygulama alanları da vardır.

Kullanıcı Neler Yapabilir?

Dosya sistemine bağlanan hiçbir çevirmen fazladan yetki kazanmaz. Çevirmenler, çevirdikleri dosyanın sahibinin hakları ile sınırlandırılarak çalıştırılırlar. G/Ç ve dosya sistemi protokolleri, sunucu ve istemcilerin karşılıklı anlaşması esasına göre dikkatle tasarlanmışlardır. Özünde, çevirmenler sıradan programlardır. GNU C kütüphanesi, çevirmenlerin yazılmasında pek çok kolaylık sunar.

Parola sunucusu (password server) veya setuid işlemlerini yapan çevirmenler gibi bazı çevirmenler özel haklara gereksinim duyarlar. Bu çevirmenleri tüm kullanıcılar çalıştırabilir fakat sadece sistem yöneticisine (root) ait bir düğüm üzerinden çalıştırılırlarsa işlevlerini yerine getirebilirler. Benzer şekilde, reboot sistem çağrısı sadece root tarafından çağrılırsa dikkate alınır.

Neden Bu Kadar Farklı?

Bu tasarım, Unix dünyasına yeni kavramlar getirmiştir. Bugüne dek; işletim sistemleri, işlevselliklerini sistem kodunun içinde sakladılar. Bu durum, çok gerekmedikçe, geliştirmeyi ve eklentiler yapmayı engelledi. Kullanıcılar, sisteme, işlerini kolaylaştıracak eklentileri yapamadılar ve sistem yöneticileri çekirdeklerine küçük ayarlar yapmada isteksiz davrandılar.

Hurd ile kullanıcılar, geleneksel sistemlerin aksine, kendileri için sistemde değişiklik yapma hakkına sahiptirler. Mach çekirdeğinin, işlem adres alanları ve özellikleri üzerindeki muazzam kontrolü sayesinde, ilk kez, kullanıcılar başkalarına rahatsızlık vermeden sistemde istemedikleri parçaları çıkarma ve yeni parçalar ekleme hakkına sahip oldular.

Mach temelli işletim sistemlerinin çoğu, yeni bir ortamda dahi olsa, eski Unix semantiğini büyük ölçüde uygulamıştır. Bunun aksine, GNU, bu semantiği kullanıcıların geliştirebileceği hatta değiştirebileceği bir yapı sunmaktadır.

2. Bölüm: Hurd'ün Canavarlarına Bir Bakış

Doğrulama Sunucusu (The Authentication Server)

Hurd işletim sisteminin merkezi sunucularından biri doğrulama sunucusudur. Bu sunucudaki her bir port bir kullanıcı kimliğini temsil eder ve bir id block (kimlik bloğu) ile ilişkilendirilir. Her bir kimlik bloğu kullanıcı ve grup kimliklerini içerir. Bu sunucu, yukarıda bahsedilen parola sunucusundan (password server) farklı bir sunucudur.

Doğrulama sunucusu üç ayrı hizmet sunar. Birincisi, doğrulama portları üzerinde basit boolean işlemler yapar: iki doğrulama portu verildiinde, bu sunucu iki porttaki uid ve gid'lerin bileşkesini temsil eden üçüncü bir port oluşturur. İkinci hizmeti, uid'si sıfır olan kullanıcıya doğrulama portu açmaktır. Son olarak; UYÇ (Uzak yordam çağrıları, [RPC; Remote Procedure Calls]) sağlar. Bu çağrılar genelde farklı makineler üzerinde çalışan farklı programlar arasında gerçekleşir. Henüz karşılıklı güven tesis edilmediği durumlarda istemci ve sunucular arası kimlik ve önbilgi aktarımı böyle sağlanır. Dosya sisteminin ve G/Ç protokollerinin güvenliği için bu önemli bir hizmettir.

Herhangi bir kullanıcı, sistem güvenliğini tehlikeye atmadan, doğrulama protokolünü uygulayan bir program yazabilir. Bir hizmet bir kullanıcıyı doğrulamak istediğinde, hizmet tarafından güvenli bulunan doğrulama sunucusu ile iletişime geçer. Eğer bir kullanıcı farklı bir doğrulama sunucusu kullanıyorsa, işlem başarısız olur ve sunucu iletişimi kapatabilir. Bu nedenle, sistemdeki tüm programların tek bir doğrulama sunucusu kullanmaları gerekir, doğrulama sunucusunun arabirimini güvenli işleyecek ve fazladan işlemleri kapsamayacak şekilde tasarladık. (Bu nedenle ayrı bir parola sunucusu var.)

İşlem Sunucusu (The Process Server)

İşlem sunucusu tıpkı bir bilgi sınıflandırma deposu gibi davranır. Bu sunucu tarafından sağlanan dört hizmet vardır. Birincisi; Mach çekirdeğinin kontrolünde olmayan, bilgisayar adı (hostname), bilgisayar kimliği (hostid) ve sistem sürümü gibi genel bilgileri takip etmektir. İkincisi, Posix uyumluluğunu sağlamaktır, Posix özellikleri kullanmak isteyen programlara yardımcı olur.

Üçüncü hizmeti, Mach görevleri ve Hurd işlemleri arasında bire bir bağlantının sürdürülmesidir. Her göreve bir pid (işlem kimliği) verilir. İşlemler bu sunucu ile bir ileti portu oluşturabilirler, bu port istemde bulunan diğer programlara verilir. Bu sunucu ileti portlarının güvenliği ile ilgilenmez, kullanıcı programları, eğer gerekiyorsa, ihtiyaç duydukları ölçüde güvenliği sağlamalıdırlar. (GNU C Kütüphanesi bu güvenlik işlemleri için güvenilir işlevler sunmaktadır.) İşlemler, işlem sunucusuna `argv' ve `envp' değerlerini bildirebilirler, bu değerleri taleb eden diğer programlara bu sunucu aracılığıyla bilgi verilir. Bu özellik ps benzeri programları yazarken kolaylık sağlar ve bu tip bilgilerin saklanması ve gerektiğinde değiştirilmesini kolaylaştırır. Tabi bu özelliklerin kullanımı zorunlu değildir. Programlar, işlem sunucusuna başvurmadan da bir pid (işlem kimliği) alıp çalışabilirler.

Son olarak, işlem sunucusu, mevcut işlem ileti portlarını topladığı işlem kolleksiyonları yapar. Ayrıca, pid'ler arası çevrim, işlem sunucusu portları ve Mach görev portları gibi hizmetler sunar, ilgili olduğu portların güvenliğini sağlar.

İşlem sunucusu kullanımının isteğe bağlı olduğunun vurgulanması önemlidir. Mach çekirdeğindeki kısıtlamalardan dolayı, sistemdeki tüm görevleri tanımlamak isteyen bir program ancak yönetici yetkileri ile çalıştırılabilir. Fakat, aynı anda birden fazla işlem sunucusu çalışabilir, her birinin kendilerine bağlı istemcileri olabilir. Sistem yönetici yetkilerine gerek duymayan işlem sunucusu hizmetleri kullanıcı sunucuları tarafından da üstlenilebilir. Kullanıcıların elleri bağlı değildir.

Transparan FTP

Transparan FTP oldukça ilginç bir fikirdir ve artık uygulama zamanı gelmiştir. Oldukça popüler olan ange-ftp paketi ile GNU Emacs'ın FTP dosyalarına transparan olarak erişmesi ve tüm dosya işlemlerini gerçekleştirmesi sağlayanabilir. Transparan FTP'nin yaptığı iş de budur; tabii tüm sistem genelinde geçerlidir. Bu sunucu henüz yazılmamıştır, ayrıntıları henüz belli değildir ve deneyim ile değişikliğe uğrayacakdır.

Bir BSD çekirdeğinde transparan FTP dosya sistem yazmak, Hurd'de yazmaktan daha zor olmayacaktır. Fakat bu konudan, bir BSD çekirdek hacker'ına bahsedildiğnde, "böyle birşey çekirdeğe ait değildir" şeklinde bir cevap verecektir. Bir bakıma bu doğrudur. Bu tip sistemlerde, böyle uygulamaları çekirdeğe yerleştirmek tüm katmanlama prensiplerini ihlal etmektir. Bunun yan etkisi, sistem tasarımcılarının daha iyi işler çıkarmasına engel olan, kullanıcıların sevmedikleri şeyleri değiştirmesine engelleyen tasarım metodolojisidir. (Yeni BSD çekirdekleri ile transparan FTP sağlayan kullanıcı programları yazmak mümkün olmuştur. alex bunlara örnek gösterilebilir, fakat o da ancak yönetici hakları ile çalıştırılabilir.)

Hurd işletim sisteminde transparan FTP için hiç bir engel yoktur. /ftp düğümüne bir çevirmen atanmıştır. /ftp dizini doğrudan listelenemese de, altındaki dizinleri listelemek mümkün olacaktır. Çeşitli kullanım biçimleri olacaktır, örneğin; uunet üzerindeki dosyalara erişmek için cd /ftp/ftp.uu.net:anonymous:mib@gnu şeklinde bir komut, ya da bir FTP hesabına erişmek için cd /ftp/gnu.org:mib:passwd gibi bir komut kullanılabilir. Böyle bir komutta belirtilmeyen, kullanıcı adı, şifre gibi bilgiler varsa, kullanıcıya ait .netrc dosyasındaki veriler kullanılır. Örneğin, ikinci örnekteki komut, eğer kullanıcının .netrc dosyasında gerekli bilgiler varsa cd /ftp/gnu.org şeklinde verilebilir.

Transparan FTP ile erişim için önce cd komutu kullanmamıza da gerek yoktur. Örnegin; RFC 1097 (the Telnet Subliminal Message Option) belgesine ulaşmak için sadece more /ftp/ftp.uu.net/inet/rfc/rfc1097 yazmak yeterli olacaktır. Eğer bu belgeyi sık sık okuyacaksak kopyala (cp) komutu ile yerel diske kopyalamamız mümkündür.

Dosya Sistemleri

Hurd işletim sisteminde normal dosya sistemleri de uygulanıyor. Hurd'un ilk sürümünde BSD 4.4 Fast File System uyumlu bir dosya sistemi yer alacak. Sıradan semantiğe ilave olarak, kayıt çevirmenleri, 32-bit kullanıcı kimlikleri ve grup kimlikleri, ayrıca her dosyaya yazarı tarafından belirlenen author (yazar) başlığıyla yeni bir kimlik verisi gibi özellikler sağlanacak. Hurd'de, kullanıcıların birden fazla kimliği olabileceği gibi kimliksiz kullanıcılar da olabilir. bilinmeyen kullanıcı (uid'si yok) ile kimliği bilinen diğer kullanıcıların bir dosyaya erişimini kontrol etmek için ilave izin biti eklenmiştir.

Başlangıç olarak, 4.4 BSD kullanılarak Ağ Dosya Sistemi protokolü geliştirilecektir. Muhtemelen aynı biçimde olmayan ama Spite'daki fikirlerin aynısını kullanan bir kayıt-yapılı dosya sistemi de geliştirilecektir. Zaman içerisinde GNU ağ dosya protokolü de tasarlanabilir, ya da NFS eksikleri giderilerek kullanılabilir. Ayrıca, insanların GNU ve diğer işletim sistemleri arasında dosya taşıyabilmeleri için MS-DOS dosya sistemi gibi çok sayıda "küçük" dosya sistemi de Hurd'de yer alacaktır.

Terminaller

Bir G/Ç sunucusu Posix terminal semantiklerini sağlayacaktır. GNU C Kütüphanesinde, terminalin takibi ve doğru iş kontrol sinyallerinin doğru zamanlarda gönderilmesi ayrıca klavye ve kesme sinyallerine itaati sağlamak için gerekli özellikler vardır.

Programların iletişim kanallarına bir terminal sürücüsü eklemeleri için bir çok yol sağlanacaktır. rlogind gibi sunucular kendi ağ iletişim portlarına terminal protokolünü ekleyebilecekler. Pseudo-terminallere ihtiyaç duyulmayacak, ancak geçmişe uyum için pseudo-terminaller de sağlanacak. GNU üzerindeki hiç bir program onlara ihtiyaç duymayacak.

Terminal sürücüsü konusunda kullanıcılara uygulanan bir zorlama yoktur. Bir terminal sürücüsü, altındaki iletişim kanalının kullanımını sağlar, gerektiğinde devreden çıkabilir veya terminal sürücüsü görevi yapan başka bir programa görevini devredebilir.

Bu esneklik nedeniyle, orijinal terminal sürücüsü karmaşık satır düzenleme özellikleri barındırmayacak, sadece Posix ve BSD uyumu gösterecektir. Zaman içinde, karmaşık satır düzenleme özellikleri taleb eden kullanıcıların ihtiyaçlarına göre satır okuma temelli bir terminal sürücüsü sağlanabilir.

Terminal sürücüsü büyük olasılıkla UUCP ve SLIP tarafından gereksinim duyulan yüksek miktarlı hızlı veri iletimi için yeterli destek sağlamayacaktır. Ne var ki; bu programların terminal sürücüsünün bu özelliklerine ihtiyaçları olmayacaktır, zira; bunun yerine Mach çekirdeğinin sunduğu terminaller için aygıt portlarını kullanabilecekler. Bu portlarla büyük miktarda veri etkin olarak taşınabilir.

Program Çalıştırma

execve sistem çağrısının uygulanması üç ayrı programa dağıtılmıştır. Kütüphane, argümanı ve ortam vektörlerini karşılar ve alır. Daha sonra, çalıştırılacak dosyayı tutan dosya sunucusuna bir mesaj gönderir. Dosya sunucusu çalıştırma iznini kontrol eder gerekirse çalıştırma talebinde değişiklikler yapar. Örneğin; dosyada kullanıcı değiştirme işareti (setuid) varsa ve dosya sunucusu bu talebi karşılayabiliyorsa, kullanıcı kimliğini değiştirir. Aynı zamanda, dosya sunucusu, önceki görevlere erişimi olan programların yeni açılan görevlere de erişip erişemeyeceğine karar verir. Dosya sistemi erişim haklarını değerlendiriken veya okunamaz bir imajı çalıştırırken, exec, güvenliği sağlamak için bir Mach görevi olarak çalışıyor olmalıdır.

Dosya sistemi, imajın erişim haklarını değerlendirdikten sonra görevi yüklemek için exec (çalıştırma) sunucusunu çağırır. Bu sunucu, İDT (İkili Dosya Tanımlayıcısı: BFD; Binary File Descriptor) kütüphanesini kullanarak imajı yükler. İDT çok sayıda nesne dosya formatını tanır, ve desteklenen neredeyse tüm formatlar çalıştıralabilir olacaktır. Bu sunucu aynı zamanda #! ile başlayan betikleri tanır ve ilgili program ile çalıştırır.

Standart exec sunucusu çalıştırılacak olan imajın ortam değişkenlerini de kontrol eder; eğer EXECSERVERS değişkeni sistemin öntanımlı sunucusundan başka bir sunucuyu gösteriyorsa, programı bu değişkenin belirttiği sunucu ile çalıştır. (Tabi bu işlemde dosya sunucusunun talep ettiği güvenlik kriterlerine uyulur.)

GNU C Kütüphanesi, çalıştırılacak imajın, argümanlarını, ortamını, umask değerini ve çalıştırıldığı dizini exec sunucusuna gönderir. Bu ilave durumlar dosyaya ya da exec sunucularına özgü değildir; programlar dilerlerse, GNU C kütüphanesinde belirlenilenden farklı davranabilirler.

Yeni İşlemler

fork sistem çağrısı neredeyse tamamen GNU C Kütüphanesi ile uygulanır. Yeni görev, Mach çekirdek çağrıları ile yaratılır. C kütüphanesi, imaj bilgilerinin doğru şekilde aktarılmasını sağlar. Yeni görev, işlem sunucusu ile kayda alınır (Bu zorunlu bir basamak değildir). C Kütüphanesi, yeni işlemlerin bir çatallanma ile (fork) çalıştırılması sırasında kullanılacak fonksiyon vektörlerini verir: vektörlerden biri çatallanmadan önce, biri atada (parent), biri de çocuk işlemde (child) çağrılmalıdır. (Bu özellikler normal çatallanma işleminin yerine tasarlanmamıştır; çatallanma gerçekleşmeden önce portları kapatmak ya da sıfırlamak isteyebilcek kütüphaneler için geliştirilmiştir.) C Kütüphanesi Posix.4a ile tanımlanan her iki çatallanma çağrılarısını da destekleyecektir.

Yeni görevlerin oluşturulmasında, kullanıcıların bu yöntemi kullanması zorunlu değildir. Bir programın, normal çatallanma fonksiyonunu çağırırken, ilave bir kaç yeni özelliği de kullanması mümkündür. C Kütüphanesi gerektiğinde kancalar (hook) sağlayabilir hatta fonksiyon tamamen değiştirilebilir. Geleneksel Unix sistemlerinde bunların hiçbiri mümkün değildir.

Asenkron iletiler

Daha önce bahsedildiği üzere, işlem sunucusu, kayıt altında tuttuğu herbir görev için bir ileti portu sağlar. Bu portlar genel kullanıma açıktır ve görevlere asenkron ileti gönderiminde kullanılır. Örnegin; sinyaller bu portlara gönderilir. Sinyal iletisinin de bir portu vardır ve gönderisicine ait tanımlamaları taşır, sinyali alan program bu porta göre göndericinin güvenilirliğini kontrol eder, GNU C Kütüphanesi bir tablo içinde bir çok port sunar, bu portlardan her biri bir dizi sinyal barındırır ve bu portu açmış olan programlara bu sinyaller gönderilebilir. Örneğin; eğer bir kullanıcı, bir görevin çekirdek portuna sahipse tüm sinyalleri gönderme hakkına da sahiptir. Eğer kullanıcı özel bir terminal kimliği portuna sahipse, klavye sinyalleri gönderebilir. Kullanıcılar, C Kütüphanesinin sinyal izin tablosuna istedikleri eklemeleri yapabilirler.

Bir işlemin, grubu değiştirildiğinde, işlem sunucusu bu işleme yeni işlem grubunu işaret eden bir sinyal gönderir. Böyle bir durumda, işlem sunucusu, görevin çekirdek portunu vererek yetkisini ispatlar.

C Kütüphanesi, ayrıca, halen işlemler tarafından kullanılmakta olan kullanıcı kimliklerinin (uid) silinmesi ve eklenmesi için iletiler sağlar. Eğer bir programa yeni kullanıcı kimlikleri gönderilirse, kütüphane bunları mevcut küme içine ekler, ardından tüm G/Ç sunucuları ile iletişim kurarak yeni erişim haklarını bildirir. Benzer şekilde, bir ileti ile kullanıcı kimlikleri silinebilir. Bu durumda, çağıran, işlemin görev portunu bildirmek zorundadır. (Bir işleme fazladan yetki vererek zarar veremezsiniz, ancak yetkilerini kısıtlayarak zarar verebilirsiniz.) Hurd'de kullanıcı programlarının, işlemlere bu iletileri göndermesi mümkün olacaktır. Örneğin, su komutu, bir altkabuk çalıştırmak yerine, oturum sırasında açtığınız tüm programların yeni bir kimlik (bu durumda yönetici kimliği) kazanmasını sağlayacaktır.

C Kütüphanesi, programların diledikleri yeni asenkron iletileri eklemesine ve standart iletileri gözardı edebilmesine olanak verecektir.

Unix Gibi Görünmesini Sağlamak

C Kütüphanesi tüm BSD ve Posix çağrılarını, ilave özellikler de katarak destekleyecektir. Böylelikle, Unix çağrılarının, oldukları gibi, değiştirilmeden kullanılmaları gereken durumlarda, kullanıcıların bunları değiştirme ya da tamamen atlama şansları olacaktır.

Bazı ortamlarda binary uyumu da desteklenecektir. Bu uyum, ilgili kütüphanenin, işleme ait adres alanına yüklenmesi ile sağlanacaktır. (Örneğin VAX'te stack üstünde bir bölgeye yerleştirilecektir.) Mach'ın bir özelliği olan sistem çağrısı yönlendirilmesi ile Unix sistem çağrıları yakalanır ve bu özel kütüphaneneye yönlendirilir. (Tüm makinelerde bu yönlendirmenin maliyeti çok düşüktür; Mach çekirdeği bu konuda oldukça optimizedir. Bir 386'da bu yönlendirme yaklaşık iki düzine komut ile sağlanır. Sıradan bir prosedür çağrısı ile kıyaslandığında biraz daha yavaştır.)

Sinyal maskeleme ve vektörler gibi pek çok Unix özelliği kütüphane tarafından sağlanır. Böylelikle bu özellikler, Unix'tekilere göre belirgin şekilde kolaylaşmıştır. Artık, kritik bölgeleri korumak için daha iyi bir yöntem aramak yerine sigblock çağrısını yaygın olarak kullanmak makuldur.

Ağ Protokolleri

Hurd ile sağlanan bir kütüphane ile 4.4 BSD protokol yığınlarını (protocol stack) Hurd'de çalışır hale getirmek çok kolay olacaktır. Böylece, BSD tarafından desteklenen tüm protokollerin çalışması mümkün olacaktır. Halen bu protokoller; CCITT, TCP/IP, Xerox NS ve ISO protokolleridir.

Hurd'ün çok yüksek hızlı G/Ç sağlayacak özellikleri için biraz daha çalışma gereklidir. Protokollerin çoğunun tamamlanması için biraz zaman gerekse de bu iş çok uzun sürmeyecektir. Hurd TCP/IP protokollerini mümkün olduğunca etkin bir şekilde çalıştıracaktır.

Hurd'un esnek tasarımına ilginç bir örnek de, BSD'de performansı arttırmak için yoğun olarak kullanılan IP ard bilgileridir. Hurd, ard bilgileri göndermeye ve almaya hazırken, oldukça küçük bir avantaj sağlayacaktır, zira verinin kopyalanmasına ihtiyaç duyulmaz ve sayfa-hizalı verinin kopyalarından kaçınmak gereksizdir.


[ English | Hebrew | Türkçe ]
Return to GNU's home page.

FSF & GNU inquiries & questions to gnu@gnu.org. Other ways to contact the FSF.

Comments on these web pages to webmasters@www.gnu.org, send other questions to gnu@gnu.org.

Copyright (C) 1996 Trent Fisher
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

Updated: 19 Dec 1998 jonas

Türkçe çeviri: Oktay Poçan oktaypocan@accodeum.com