Энциклопедия разработчика модулей ядра Linux | страница 10



>  * copies data from the kernel data segment to the

>  * user data segment. */

>  put_user(*(Message_Ptr++), buffer++);

>  length--;

>  bytes_read++;

> }

>#ifdef DEBUG

> printk("Read %d bytes, %d left\n", bytes_read, length);

>#endif

> /* Read functions are supposed to return the number of bytes actually inserted into the buffer */

> return bytes_read;

>}


>/* This function is called when somebody tries to write

>* into our device file - unsupported in this example. */

>#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

>static ssize_t device_write(struct file *file,

> const char *buffer, /* The buffer */

> size_t length, /* The length of the buffer */

> loff_t *offset) /* Our offset in the file */

>#else

>static int device_write(struct inode *inode, struct file *file, const char *buffer, int length)

>#endif

>{

> return -EINVAL;

>}


>/* Module Declarations ***************************** */

>/* The major device number for the device. This is

>* global (well, static, which in this context is global

>* within this file) because it has to be accessible * both for registration and for release. */

>static int Major;


>/* This structure will hold the functions to be

>* called when a process does something to the device

>* we created. Since a pointer to this structure is

>* kept in the devices table, it can't be local to

>* init_module. NULL is for unimplemented functions. */

>struct file_operations Fops = {

> NULL, /* seek */

> device_read, device_write,

> NULL, /* readdir */

> NULL, /* select */

> NULL, /* ioctl */

> NULL, /* mmap */

> device_open,

>#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

> NULL, /* flush */

>#endif

> device_release /* a.k.a. close */

>};


>/* Initialize the module - Register the character device */

>int init_module() {

> /* Register the character device (atleast try) */

> Major = module_register_chrdev(0, DEVICE_NAME, &Fops);

> /* Negative values signify an error */

> if (Major < 0) {

>  printk("%s device failed with %d\n", "Sorry, registering the character", Major);

>  return Major;

> }

> printk("%s The major device number is %d.\n", "Registeration is a success.", Major);

> printk("If you want to talk to the device driver,\n");

> printk("you'll have to create a device file. \n");

> printk("We suggest you use:\n");

> printk("mknod c %d \n", Major);

> printk("You can try different minor numbers %s", "and see what happens.\n");

> return 0;

>}


>/* Cleanup - unregister the appropriate file from /proc */

>void cleanup_module() {

> int ret;