next up previous contents
Next: Otwieranie urządzenia znakowego Up: Otwieranie urządzeń Previous: Wywołanie sys_open   Spis tresci

Subsections

Funkcja init_special_inode

void init_special_inode(struct inode *inode, umode_t mode, int rdev)
{
  inode->i_mode = mode;
  if (S_ISCHR(mode)) {                        // urządzenie znakowe
     inode->i_fop = &def_chr_fops;
     inode->i_rdev = to_kdev_t(rdev);
     inode->i_cdev = cdget(rdev);
  } else if (S_ISBLK(mode)) {                 // urządzenie blokowe
     inode->i_fop = &def_blk_fops;
     inode->i_rdev = to_kdev_t(rdev);
     inode->i_bdev = bdget(rdev);
  } else if (S_ISFIFO(mode))                  // kolejka fifo
     inode->i_fop = &def_fifo_fops;
  else if (S_ISSOCK(mode))                    // socket
     inode->i_fop = &bad_sock_fops;
  else
     printk(KERN_DEBUG "init_special_inode: bogus imode (%o)\n", mode);
}

Zadaniem funkcji jest inicjalizacja części pól w strukturze inode odpowiedzialnych za późniejszą obsługę pliku, czyli:

Działanie dla urządzenia znakowego

Dla urządzeń znakowych pole i_fop przyjmuje wartość def_chr_fops, gdzie zdefiniowany jest tylko wskaźnik do funkcji open. Domyślną funkcją do otwierania urządzenia znakowego jest chrdev_open.

Działanie dla urządzenia blokowego

Dla urządzenia blokowego pole i_fop przyjmuje wartość def_blk_fops, gdzie zdefiniowane są następujące wskażniki:

Algorytmy cdget i bdget

struct block_device *bdget(dev_t dev)
struct char_device *cdget(dev_t dev)

Algorytmy cdgetbdget mają za zadanie odszukanie struktury opisującej urządzenie na podstawie jego numeru głównego i podrzędnego (zapisanych w dev_t dev). Do tego celu używają tablic hashujących bdev_hashtable
[4]i cdev_hashtable. Jeśli w pamięci nie ma jeszcze struktury dla odpowiedniego urządzenia, jest ona tworzona i inicjalizowana domyślymi wartościami. Numer hashowania obliczany jest na podstawie numeru głównego i podrzędnego urządzenia.


next up previous contents
Next: Otwieranie urządzenia znakowego Up: Otwieranie urządzeń Previous: Wywołanie sys_open   Spis tresci
2001-12-18