设为首页】 【加入收藏】 【网站地图】 【商品折扣
娱乐一生 娱乐明星
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
首页  |  Linux  |  Windows xp  |  windows2003  |  Windows Vista  |  资讯动态  |  UNIX  |  Windows9x  |  Windows2000  |  Mac Os  |  FreeBSD  |  Solaris  |  Vista系统
当前位置:首页 >> Linux >> Linux操作系统内核和设备文件对话 [Linux教程]

Linux操作系统内核和设备文件对话 [Linux教程] -

设备文件是用来代表物理设备的。多数物理设备是用来进行输出或输入的,所以必须由某种机制使得内核中的设备驱动从进程中得到输出送给设备。这可以通过打开输出设备文件并且写入做到,就想写入一个普通文件。在下面的例子里,这由device_write实现。

  这不是总能奏效的。设想你与一个连向modem的串口(技是你有一个内猫,从CPU看来它也是作为一个串口实现,所以你不需要认为这个设想太困难)。最自然要做的事情就是使用设备文件把内容写到modem上(无论用modem命令还是电话线)或者从modem读信息(同样可以从modem命令回答或者通过电话线)。但是这留下的问题是当你需要和串口本身对话的时候需要怎样做?比如发送数据发送和接收的速率。

  回答是Unix使用一个叫做ioctl(i ut output control的简写)的特殊函数。每个设备都有自己的ioctl命令,这个命令可以是ioctl读的,也可以是写的,也可以是两者都是或都不是。 Ioctl函数由三个参数调用:适当设备的描述子,ioctl数,和一个长整型参数,可以赋予一个角色用来传递任何东西。

  Ioctl数对设备主码、ioctl类型、编码、和参数的类型进行编码。Ioctl数通常在头文件由一个宏调用(_IO, _IOR,_IOW或_IOWR——决定于类型)。这个头文件必须包含在使用ioctl(所以它们可以产生正确的ioctl's)程序和内核模块(所以它可以理解)中。在下面的例子里,这个头文件是chardev.h,使用它的程序是ioctl.c。

  如果你希望在你自己的内核模块中使用ioctl's,最好去接受一分正式的ioctl职位,这样你就可以得到别人的 ioctl's,或者他们得到你,你就可以知道哪里出了错误。如果想得到更多的信息,到'documentation/ioctl- number.txt'中查看内核源文件树。

  

ex chardev.c  

/* chardev.c  
*  
* Create an i ut/output character device  
*/  


/* Copyright (C) 1998-99 by Ori Pomerantz */  



/* The nece ary header files */  

/* Standard in kernel modules */  
#include /* Were doing kernel work */  
#include /*  ecifically, a module */  

/* Deal with CONFIG_MODVERSIO  */  
#if CONFIG_MODVERSIO ==1  
#define MODVERSIO   
#include  
#endif  

/* For character devices */  

/* The character device definitio  are here */  
#include  

/* A wra er which does next to nothing at  
* at present, but may help for compatibility  
* with future versio  of Linux */  
#include  


/* Our own ioctl numbers */  
#include "chardev.h"  


/* In 2.2.3 /usr/include/linux/version.h includes a  
* macro for this, but 2.0.35 doe t - so I add it  
* here if nece ary. */  
#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 SUCCE  0  


/* Device Declaratio  ******************************** */  


/* The name for our device, as it will a ear in  
* /proc/devices */  
#define DEVICE_NAME "char_dev"  


/* The maximum length of the me age for the device */  
#define BUF_LEN 80  

/* Is the device open right now? Used to prevent  
* concurent acce  into the same device */  
static int Device_Open = 0;  

/* The me age the device will give when asked */  
static char Me age[BUF_LEN];  

/* How far did the proce  reading the me age get?  
* Useful if the me age is larger than the size of the  
* buffer we get to fill in device_read. */  
static char *Me age_Ptr;  


/* This function is called whenever a proce  attempts  
* 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 proce es at the  
* same time */  
if (Device_Open)  
return -EBUSY;  

/* If this was a proce , we would have had to be  
* more careful here, because one proce  might have  
* checked Device_Open right before the other one  
* tried to increment it. However, were in the  
* kernel, so were protected agai t context switches.  
*  
* This is NOT the right attitude to take, because we  
* might be ru ing on an SMP box, but well deal with  
* SMP in a later chapter.  
*/  

Device_Open++;  

/* Initialize the me age */  
Me age_Ptr = Me age;  

MOD_INC_USE_COUNT;  

return SUCCE   
}  


/* This function is called when a proce  closes the  
* device file. It doe t have a return value because  
* it ca ot fail. Regardle  of what else ha e , you  
* should always be able to close a device (in 2.0, a 2.2  
* device file could be impo ible 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 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  
}

  

 [2] [3] 下一页



 

娱乐图摘

更多 >>

靓丽清纯美女meimei

美女私房全裸照
导演劝女演员脱衣服(视频)

大胆火辣人体艺术写真(图)

黑丝妹妹热辣诱惑-丝袜美女妹妹

PLMM 漂亮妹妹图集-妹妹图库

全球美女图库-美女集中营

52MM 我爱漂亮妹妹-制服妹妹诱惑

图王图库-世界美女明星图片资料库
美女写真集锦

激情两性-解密性生活
浴室MM湿身内衣诱惑
邻家小妹洗澡被偷拍(视频)

热点文章

更多

· 如何制作Linux系统的安装光盘?
· 在硬盘中安装Linux操作系统最简单方法
· liunx安装问答
· 用WinGrub 引导Linux 简述
· Linux操作系统安装VMware过程详细解析
· 安装完linux后应该做的事(1)
· sis650显卡驱动自定义安装终极指南(RH80)
· Mount命令:Linux外置存储介质挂载方法
· Linux内核编译全过程详解(kernel2.6.7)
· router os端口映射方法

热点文章

更多