next up previous contents
Next: Inicjalizowanie tablic rozdzielczych Up: Obsługa tablic rozdzielczych Previous: Korzystanie z tablic rozdzielczych   Spis rzeczy

Dwa rodzaje tablic rozdzielczych

Ponieważ w systemie wystepują dwa rodzaje urządzeń (znakowe i blokowe), mamy więc w systemie dwa rodzaje tablic: Stałe MAX_CHRDEVMAX_BLKDEV zadeklarowane są w pliku include/linux/major.h:
#define MAX_CHRDEV 255
#define MAX_BLKDEV 255

Jak widać, dla każdego urządzenia tablice wyglądają trochę inaczej. Jest to różnica z poprzednią wersją, w której to obie tablice zawierały wskaźnik na te same operacje struct file_operations * fops. W tej nastapiło rozróżnienie.
Z pliku include/linux/fs.h:

struct file_operations {
	struct module *owner;
	loff_t (*llseek) (struct file *, loff_t, int);
	ssize_t (*read) (struct file *, char *, size_t, loff_t *);
	ssize_t (*write) (struct file *, const char *, size_t, loff_t *);
	int (*readdir) (struct file *, void *, filldir_t);
	unsigned int (*poll) (struct file *, struct poll_table_struct *);
	int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
	int (*mmap) (struct file *, struct vm_area_struct *);
	int (*open) (struct inode *, struct file *);
	int (*flush) (struct file *);
	int (*release) (struct inode *, struct file *);
	int (*fsync) (struct file *, struct dentry *, int datasync);
	int (*fasync) (int, struct file *, int);
	int (*lock) (struct file *, int, struct file_lock *);
	ssize_t (*readv) (struct file *, const struct iovec *, 
					unsigned long, loff_t *);
	ssize_t (*writev) (struct file *, const struct iovec *, 
					unsigned long, loff_t *);
	ssize_t (*sendpage) (struct file *, struct page *, 
				     int, size_t, loff_t *, int);
	unsigned long (*get_unmapped_area)(struct file *, unsigned long, 
			    unsigned long, unsigned long, unsigned long);
};

struct block_device_operations {
	int (*open) (struct inode *, struct file *);
	int (*release) (struct inode *, struct file *);
	int (*ioctl) (struct inode *, struct file *, unsigned, unsigned long);
	int (*check_media_change) (kdev_t);
	int (*revalidate) (kdev_t);
};

Korzystając z systemowej obsługi zapisu i odczytu z urządzeń blokowych, potrzebna jest dodatkowa funkcja realizująca kolejkowanie operacji I/O. Ustala się ją w oddzielnej tablicy zadeklarowanej include/linux/blkdev.h:

struct blk_dev_struct {
	request_queue_t		request_queue;
	queue_proc		*queue;
	void			*data;
};

Uwaga: Szczegółowo będzie to omawiane w następnych rozdziałach ,,Podsystemu WEJŚCIA/WYJŚCIA''


2001-12-19