/* 
  Bu belgenin telif hakları Necati Ersen ŞİŞECİ'ye aittir. 
  Kök: http://acikkod.org 
  İlk baskı: 2004-02-25
  Son değişiklik: 2004-02-25
  Bu döküman Açıkkod.ORG Belge Yazım ve Dağıtım Lisansı ile dağıtılmaktadır. 
*/





Linux Aygıt Sürücüleri - Bölüm 2 -


Linux'de aygıtlara erişmek, aynen bir dosyaya erişmek gibidir.
Sistemin aygıtlara erişirken kullandığı özel dosyalar /dev dizini altında
bulunurlar.

Linux'de iki çeşit aygıt bulunmaktadır. Karakter aygıtlar, klavye, mouse gibi,
ve blok aygıtlar, hard disk, tape gibi.
Karakter aygıtlar 'c' ile, blok device'lar de 'b' ile belirtilmistir.

siseci:~# ls -al /dev/psaux
crw-rw-rw-   1 root     sys       10,   1 Jan  1 01:05 /dev/psaux

siseci:~# ls -al /dev/hda1
brw-r-----   1 root     disk       3,   1 Apr 28  1995 /dev/hda1

/dev dizinine baktığımız zaman 's' ve 'p' ile belirtilmiş özel dosyalar olduğunu
görmekteyiz.

srw-rw-rw-   1 root     root            0 Jan  1 00:01 log=
prw-------   1 root     root            0 Jan  1 00:24 gpmdata|

Burada 's' ile belirtilen 'log=' dosyası, bu dosyanın bir soket olduğunu, 'p'
ile belirtilen 'gpmdata|' ise bu dosyanın bir pipe dosyası olduğunu gösterir.
Bu konu ile ilgili açıklamaları man sayfalarında bulabilirsiniz.


Major ve Minor Numaralari

Bu yazımızda karakter aygıtları üzerinde çalışacağız. Ancak soylenenlerin
bir çoğu blok aygıtlar için de geçerli olacaktır.

crw-rw-rw-   1 root     sys        1,   3 Jul 18  1994 /dev/null
crw-rw-rw-   1 root     sys        1,   5 Jul 18  1994 /dev/zero

Burada null ve zero aygıtlarının ikisininde karakter aygıtı olduğu satırın ilk
karakteri olan 'c' den anlaşılmaktadır. Ancak burda göze çarpan iki numara
bulunmaktadır.
null için 1 ve 3, zero için 1 ve 5.

Burada 1, her iki aygıt içinde major numarası, 3 ve 5 de aygıtların minor
numaralarıdır.

Peki nedir bu major ve minor numaraları?

Major numarası aygıtın sürücüsünü gostermek için kullanılmaktadır. Her sürücü,
ilk yüklendiğinde (insmod), aygıtın major numarasını kullanarak bu aygıtla
ilgli işlemlerin kendi üzerinden yapılacağını göstermek için aygıtı kayıt
(register) eder. Driver bellekten atılırken ( rmmod ), bu aygıtı unregister
eder ve artık aygıt a ulaşmak istediğimiz zaman bu sürücüyü kullanamayız ve
major numarası boşa çıkmış olur. Modül bellekten atılırken aygıtın unregister
edilmesi gerektiği unutulmamalıdır.

Minor numarasını ise, sadece aygıtın sürücüsü (driver) kullanır, kernel'in
başka parçaları minor numarasını kullanmazlar ve sadece bu sürücü üzerinden
ulaşılır. Minor numarası, aynı tip aygıtların birbirlerinden ayrılmasını
sağlamakta kullanılır. Yukarıdaki örnekte null ve zero aygıtları aynı sürücü
tarafından yönetilir. Aynı harddiskin farklı bolumleri de farklı minör
numaraları için güzel bir örnektir. hda1, hda2 vs.

Kernel 2.0, 128 tane farklı aygıt destekelmektedir. Bu sayı 2.2 ve 2.4 serisi
kernel ile 256 ya çıkar. Bunun anlamı 2.2 yada 2.4 serisi kernel ile farklı
256 tane major numarası kullanabileceğimizdir, ancak 0 ve 255 gelecekte
kullanılmak üzere (for future use) ayrılmıştır.

Minor numaraları da, 0-255 arasında değişmektedir.

Bir sürücü, belleğe yüklenip çalıştırıldığında register etmesi gereken aygıtın
sadece major numarasını sisteme bildirir. Minor numarasını ise kendisi
kullanır.

Daha önce de belirttiğimiz gibi, Linux'te bir aygıta erişmek için /dev dizini
altında o aygıtı simgeleyen blok yada karakter tipinde, özel bir dosya
oluşturulmalıdır. Bu dosyaları oluşturmak için mknod u kullanırız.

mknod, 4 farklı parametre alır.
Birinci parametre oluşturulacak dosyanın ismidir, null, hda1, psaux gibi.
Ikincisi, oluşturulacak dosyanın simgelediği aygıtın karakter(c) mi yoksa
blok(b) mu olduğudur. Üçüncü ve dördüncü parametreler ise aygıtın major ve
minor numaralarıdır.

mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mknod /dev/bdevice c 201 0
mknod /dev/hda1 b 3 1

Burada, null (c,1,3) , zero (c,1,5) , hda1 (b,3,1) ve bdevice (c,201,0)
şeklinde 4 tane farklı aygıtı simgeleyen dosyalar oluşturuluyor.

Sistemde sürücüsü yüklenmiş aygıtları görmek için /proc/devices dosyasına göz
atabilirsiniz.

Character devices:
  1 mem
  2 pty
  3 ttyp
  ...
Block devices:
  1 ramdisk
  2 fd
  3 ide0
  ...

Major numaralarını verirken dikkat edilmesi gereken bir nokta, verilecek
major numarasının kullanılmıyor olmasıdır. Kernel tarafından kullanılan ve
sabit olan major numaraları /usr/src/linux/Documentation/devices.txt dosyasında
belirtilmiştir. Ancak yerel kullanımlar için 60-63, 120-127, 240-254 arası boş
bırakılmıştır.

Sürücüler

Sürücüler, sisteme bağlı bir aygıtın, işletim sistemi ile konuşabilmesini
sağlarlar. İşletim sisteminin isteklerini ve cevaplarını aygıta, aygıtın istek
ve cevaplarını da işletim sistemine bildirirler. Bir nevi tercümanlık yaparlar.

İşletim sistemi, aygıttan okuma-yazma(read-write) yapmak, aygıtı açıp-kapatmak
(open-close) gibi işlemler için sürücüleri kullanır. Her sürücüde, işletim
sistemi tarafından gönderilen istekleri yerine getirip, aygıttan dönen
sonucları işletim sistemine gönderecek fonksiyonlar bulunmaktadır.

Ses kartınızı düşünün. Eğer sisteme tanıtılmamışsa hiç bir şekilde
kullanamayız. Ama sürücüsünü yüklediğimiz zaman, kullanıma hazır hale
gelmiştir.

Yazımınızın ikinci bölümünde, null aygıtının sürücüsünü ve örnek sanal bir
aygıt oluşturup, bu aygıtın sürücüsünü yazacağız.

Not: Yazının 1nci bölümünde olan bilgiler 2.4.22 kernel ile test edilmiştir.

Kaynaklar:

1. Linux Kernel Kaynak kodları (v2.2)
2. Linux Device Drivers, 2nd Edition  ( Alessandro Rubini & Jonathan Corbet )
3. Understanding the Linux Kernel (Daniel P. Bovet & Marco Cesati )
4. Standalone Device Drivers in Linux ( Theodore Ts'o )
5. Kernel Projects For Linux (Gary Nutt)


Necati Ersen SISECI

25 Şubat 2004