Unix/Linux Sistemlerinde Aygıt Dosyaları ve Aygıt Sürücüler
Aygıt sürücüler Win32 ve Unix/Linux sistemlerinde çekirdek modunda çalışan özel
programlardır. Aygıt sürücüler koruma mekanizmasından etkilenmeyecek serbestlikte
çalışırlar. Örneğin haberleşme portlarına istedikleri gibi erişebilirler, bütün öncelikli makine
komutlarını kullanabilirler. Genellikle aygıt sürücüler bir donanım biriminin yazılımcılar
tarafından kullanılmasını sağlamak amacıyla kullanılırlar. Aygıt sürücüler pek çok işletim
sisteminde (Örneğin Win32 ve Unix/Linux sistemlerinde) user mode programlar tarafından
bir dosya gibi kullanılırlar. Yani aygıt sürücüler aslında adeta çekirdeğin bir parçası gibi
çalışırlar ve normal programlara hizmet verirler. Bu sistemlerde user mode programlar aygıt
sürücüleri bir dosya gibi açarlar. Dosyadan okuma yazma yapan fonksiyonları kullanarak veri
transferini gerçekleştirirler. Tabii aygıt sürücüler yalnızca veri transferi için kullanılmazlar.
Örneğin user mode programlar aygıt sürücüleri kullanarak belirli işlemleri aygıt sürücülere
yaptırmak isterler. Genellikle bu işlemler için özel fonksiyonlar kullanılır.
Unix/Linux sistemlerin ioctl fonksiyonu, Win32 sistemlerinde DeviceIOControl
fonksiyonu aygıt sürücülerle iletişim kurarak onların çeşitli işlemleri yapmasını sağlarlar.
Örneğin CD-ROM aygıtını düşünelim. Bu aygıt bir aygıt sürücü tarafından kontrol edilir. Biz
Unix/Linux sistemlerinde CD-ROM üzerinde işlem yapacaksak önce o aygıt sürücüyü dosya
gibi açarak bu işlemden bir betimleyici elde etmeliyiz. Artık read fonksiyonu ile CDROM’daki
bilgileri okuyabiliriz. Ancak CD-ROM yalnızca okunan bir aygıt değildir. Örneğin
biz programımızdan CD-ROM’u eject etmek isteyebiliriz. Bu tür işlemler için ilgili
betimleyici ile ioctl fonksiyonundan faydalanırız. Unix/Linux sistemlerindeki ioctl ya da
Win32 sistemlerindeki DeviceIOControl fonksiyonu sürücü programındaki istenilen
fonksiyonları çalıştırmak için kullanılır. Bu modelde sürücü programını oluşturan
fonksiyonların birer numarası vardır. Programcı bu fonksiyonlarda numarayı belirterek sürücü
fonksiyonunu çağırabilir. Şüphesiz sürücü fonksiyonlarının giriş ve çıkış parametreleri de
olacaktır. ioctl fonksiyonunun prototipi şöyledir.
int ioctl(int d, int request, ...);
Fonksiyonun birinci parametresi aygıt sürücüye ilişkin betimleyici, ikinci parametresi işlem
kodudur. Bu parametre aygıt sürücünün hangi fonksiyonunun çağrılacağını belirtir. ioctl
fonksiyonun geri dönüş değeri başarı durumunda 0, başarısızlık durumunda –1 değeridir.
Standart aygıt sürücülerine ilişkin işlem kodları <sys/ioctl.h> içerisinde sembolik
sabitler biçiminde tanımlanmıştır. ioctl fonksiyonunun diğer parametreleri aygıt sürücüye
bağlı olarak değişebilmektedir. Örneğin CD-ROM sürücüyü eject etmek isteyelim;
int fd;
fd = open(“/dev/hdc”, O_RDONLY);
...
ioctl(fd, CDROMEJECT);
...
close(fd);
Şüphesiz aygıt sürücüler sistem yöneticisinin nezaretinde sisteme install edilmelidir. Bir aygıt
sürücüsünü kullanmak doğrudan ioctl ya da DeviceIOControl fonksiyonlarıyla
yapılmayabilir. Örneğin sürücüyü yazan programcı çeşitli işlemler için user mode kütüphane
de oluşturmuş olabilir. Şüphesiz bu user mode kütüphane, işlemleri yapmak için ioctl ya da
DeviceIOControl gibi ilişki kuran fonksiyonları kullanmaktadır.
Aygıt sürücülerin yazım biçimi işletim sisteminden işletim sistemine değişmektedir. Aygıt
sürücü programlar birden çok uygulama programına hizmet verebilecek biçimde yazılmalıdır.
Aygıt sürücü programlar bu nedenle kuvvetli bir senkronizasyon içerirler. Aygıt sürücü
programları yazarken bu programın çekirdeğin bir parçasıymış gibi yükleneceği
düşünülmelidir. Yani bu programlar yalnızca çekirdek fonksiyonlarını kullanmalıdır. Örneğin,
Linux çekirdeği içerisinde ekrana bir şeyler yazmak için kprintf isimli printf benzeri bir
fonksiyon vardır. Ya da çekirdek alanından dinamik tahsisat yapmak için malloc fonksiyonu
gibi bir kmalloc fonksiyonu vardır.
Aygıt sürücüler /dev dizininin altında dosyalar biçiminde bulunurlar. Aygıt sürücüler
tamamen bir dosya gibi açılmaktadır. Her aygıtın bir numarası vardır. Aygıt numarası büyük
ve küçük olmak üzere ikiye ayrılır. Büyük numara kategori belirtirken küçük numara tür
belirtmektedir. Örneğin floppy sürücüsünün büyük aygıt numarası 2’dir. A sürücüsünün
küçük aygıt numarası 0, B sürücüsünün ise 1’dir. Örneğin IDE sürücülerinin büyük aygıt
numarası 3’tür. Birinci hard diskin tamamı /dev/hda ile temsil edilir. Bu aygıtın büyük
numarası 3, küçük numarası 0’dır. Birinci hard diskteki partition’lar /dev/hda1, /dev/hda2 gibi
giderler. Bunların küçük numaraları 1, 2 biçiminde gitmektedir. İkinci IDE hard diskin büyük
numarası yine 3’tür ama küçük numarası 64’tür.
Terminaller ve seri portların büyük aygıt numaraları 4’tür. Birinci sanal terminalin küçük
aygıt numarası 1, ikincisinin 2’dir ve böyle gider. Bunlara ilişkin aygıt dosyaları /dev/tty1,
/dev/tty2 biçiminde gider. Bu dosyalar kullanılarak doğrudan klavyeden okuma ve ekrana
yazma yapılabilir.
Şüphesiz aygıt dosyalarının açılarak kullanılabilmesi için root önceliğine sahip olunması
gerekir. Bu dosyaların erişim hakları daha sonra değiştirilebilir.
COM portların büyük numarası 4’tür, küçük numaraları 64, 65 biçiminde gider. Sırasıyla
/dev/st0, /dev/st1 gibi isimlerle kullanılırlar.
Paralel portlara /dev/lp0 veya /dev/par0 biçiminde erişilebilir. Paralel portların büyük aygıt
numaraları 6’dır. LPT1 için küçük aygıt numarası 0, LPT2 için 1’dir.
Aygıtların numarası stat fonksiyonuyla alınabilir.