linux操作系统内核和设备文件对话

上传人:xzh****18 文档编号:34632427 上传时间:2018-02-26 格式:DOCX 页数:27 大小:35.82KB
返回 下载 相关 举报
linux操作系统内核和设备文件对话_第1页
第1页 / 共27页
linux操作系统内核和设备文件对话_第2页
第2页 / 共27页
linux操作系统内核和设备文件对话_第3页
第3页 / 共27页
linux操作系统内核和设备文件对话_第4页
第4页 / 共27页
linux操作系统内核和设备文件对话_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《linux操作系统内核和设备文件对话》由会员分享,可在线阅读,更多相关《linux操作系统内核和设备文件对话(27页珍藏版)》请在金锄头文库上搜索。

1、Linux 操作系统内核和设备文件对话设备文件是用来代表物理设备的。多数物理设备是用来进行输出或输入的,所以必须由某种机制使得内核中的设备驱动从进程中得到输出送给设备。这可以通过打开输出设备文件并且写入做到,就想写入一个普通文件。在下面的例子里,这由 device_write 实现。 这不是总能奏效的。设想你与一个连向 modem 的串口(技是你有一个内猫,从 CPU 看来它也是作为一个串口实现,所以你不需要认为这个设想太困难)。最自然要做的事情就是使用设备文件把内容写到 modem 上(无论用modem 命令还是电话线)或者从 modem 读信息(同样可以从 modem 命令回答或者通过电话

2、线)。但是这留下的问题是当你需要和串口本身对话的时候需要怎样做?比如发送数据发送和接收的速率。 回答是 Unix 使用一个叫做 ioctl(input output control 的简写)的特殊函数。每个设备都有自己的 ioctl 命令,这个命令可以是 ioctl 读的,也可以是写的,也可以是两者都是或都不是。Ioctl 函数由三个参数调用:适当设备的描述子,ioctl 数,和一个长整型参数,可以赋予一个角色用来传递任何东西。 Ioctl 数对设备主码、ioctl 类型、编码、和参数的类型进行编码。 Ioctl 数通常在头文件由一个宏调用(_IO,_IOR,_IOW 或_IOWR决定于类型)

3、。这个头文件必须包含在使用 ioctl(所以它们可以产生正确的 ioctls)程序和内核模块(所以它可以理解)中。在下面的例子里,这个头文件是 chardev.h,使用它的程序是 ioctl.c。 如果你希望在你自己的内核模块中使用 ioctls,最好去接受一分正式的ioctl 职位,这样你就可以得到别人的 ioctls,或者他们得到你,你就可以知道哪里出了错误。如果想得到更多的信息,到documentation/ioctl-number.txt中查看内核源文件树。 ex chardev.c /* chardev.c * * Create an input/output character d

4、evice */ /* Copyright (C) 1998-99 by Ori Pomerantz */ /* The necessary header files */ /* Standard in kernel modules */ #include /* Were doing kernel work */ #include /* Specifically, a module */ /* Deal with CONFIG_MODVERSIONS */ #if CONFIG_MODVERSIONS=1 #define MODVERSIONS #include #endif /* For c

5、haracter devices */ /* The character device definitions are here */ #include /* A wrapper which does next to nothing at * at present, but may help for compatibility * with future versions of Linux */ #include /* Our own ioctl numbers */ #include chardev.h /* In 2.2.3 /usr/include/linux/version.h inc

6、ludes a * macro for this, but 2.0.35 doesnt - so I add it * here if necessary. */ #ifndef KERNEL_VERSION #define KERNEL_VERSION(a,b,c) (a)*65536+(b)*256+(c) #endif #if LINUX_VERSION_CODE = KERNEL_VERSION(2,2,0) #include /* for get_user and put_user */ #endif #define SUCCESS 0 /* Device Declarations

7、* */ /* The name for our device, as it will appear in * /proc/devices */ #define DEVICE_NAME char_dev /* The maximum length of the message for the device */ #define BUF_LEN 80 /* Is the device open right now? Used to prevent * concurent access into the same device */ static int Device_Open = 0; /* T

8、he message the device will give when asked */ static char MessageBUF_LEN; /* How far did the process reading the message get? * Useful if the message is larger than the size of the * buffer we get to fill in device_read. */ static char *Message_Ptr; /* This function is called whenever a process atte

9、mpts * to open the device file */ static int device_open(struct inode *inode, struct file *file) #ifdef DEBUG printk (device_open(%p)n, file); #endif /* We dont want to talk to two processes at the * same time */ if (Device_Open) return -EBUSY; /* If this was a process, we would have had to be * mor

10、e careful here, because one process might have * checked Device_Open right before the other one * tried to increment it. However, were in the * kernel, so were protected against context switches. * * This is NOT the right attitude to take, because we * might be running on an SMP box, but well deal w

11、ith * SMP in a later chapter. */ Device_Open+; /* Initialize the message */ Message_Ptr = Message; MOD_INC_USE_COUNT; return SUCCESS; /* This function is called when a process closes the * device file. It doesnt have a return value because * it cannot fail. Regardless of what else happens, you * sho

12、uld always be able to close a device (in 2.0, a 2.2 * device file could be impossible to close). */ #if LINUX_VERSION_CODE = KERNEL_VERSION(2,2,0) static int device_release(struct inode *inode, struct file *file) #else static void device_release(struct inode *inode, struct file *file) #endif #ifdef

13、DEBUG printk (device_release(%p,%p)n, inode, file); #endif /* Were now ready for our next caller */ Device_Open -; MOD_DEC_USE_COUNT; #if LINUX_VERSION_CODE = KERNEL_VERSION(2,2,0) return 0; #endif /* This function is called whenever a process which * has already opened the device file attempts to *

14、 read from it. */ #if LINUX_VERSION_CODE = KERNEL_VERSION(2,2,0) static ssize_t device_read( struct file *file, char *buffer, /* The buffer to fill with the data */ size_t length, /* The length of the buffer */ loff_t *offset) /* offset to the file */ #else static int device_read( struct inode *inod

15、e, struct file *file, char *buffer, /* The buffer to fill with the data */ int length) /* The length of the buffer * (mustnt write beyond that!) */ #endif /* Number of bytes actually written to the buffer */ int bytes_read = 0; #ifdef DEBUG printk(device_read(%p,%p,%d)n, file, buffer, length); #endif /* If were at the end of the message, return 0 * (which signifies end of file) */ if (*Message_Ptr = 0) return 0; /* Actually put the data into the buffer */ while (length & *Message_Ptr) /* Because the buffer is in the user data segment, * not th

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号