Энциклопедия разработчика модулей ядра 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
> 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;