易截截图软件、单文件、免安装、纯绿色、仅160KB

Linux驱动之ioctl

在用户空间,使用ioctl系统调用来控制设备,原型如下:
int ioctl(int fd, unsigned long cmd, ...);
第三个参数不表示一个变数目的参数,而是一个类型可选的参数。第三个参数依赖于控制命令。一些命令不用参数,一些用一个整数值,一些使用指针
1、ioctl函数定义命令
在编写ioctl代码之前,首先需要定义命令。为了防止对错误的设备使用正确的命令,命令号应该在系统范围内事唯一的
ioctl命令编码被划分为几个段,include/asm/ioctl.h中定义了这些字段:类型(幻数),基数,传送方向,参数大小等。Documentation/ioctl-number.txt文件中罗列了再内核中已经使用了的幻数。
定义ioctl命令的正确方法是使用4个位段,这个列表中介绍的符号定义在<linux/ioctl.h>中:
Type:
幻数(类型):表明哪个设备的命令,在参考了ioctl-number.txt之后选出,8位宽。
Number:
序号,表明设备命令中的第几个,8位宽
内核提供了下列宏来帮助定义命令号,如下
_IO(type, nr):没有参数的命令
_IOR(type, nr, datatype):从驱动中读数据
_IOW(type, nr, datatype):写数据到驱动
_IOWR(type, nr, datatype):双向传送,type和number作为参数被传递
2、ioctl函数的实现
分三个技术环节:
1、返回值
ioctl函数的实现通常是根据命令执行的一个switch语句。但是当命令不能匹配任何一个设备所支持的命令时,通常返回-EINVAL(“非法参数”)
2、参数使用
如果是一个整数,可以直接使用。如果是指针,我们必须确保这个用户地址是有效的,因此使用前需进行正确的检查
使用int access_ok(int type, const void *addr, unsigned long size)来检查一个指针地址是否可以访问
第一个参数是VERIFY_READ或者是VERIFY_WRITE,用来表明读用户内存还是写用户内存。addr参数时要操作的用户内存地址,size是操作的长度。如果ioctl需要从用户空间读一个整数,那么size = sizeof(int)。如果需要同时读和写,则使用VERIFY_WRITE。
access_ok返回一个布尔值:1是成功(存取没问题)和0是失败(存取有问题),如果该函数返回失败,则ioctl应当返回-EFAULT,如:
if(_IOC_DIR(cmd) & _IOC_READ)// 为什么_IOC_READ对应VERIFY_WRITE???
    err = !access_ok(VERIFY_WRITE, (void  __user *)arg, _IOC_SIZE(cmd));
else if(_IOC_DIR(cmd) & _IOC_WRITE)
       err = ! access_ok(VERI


相关文档:

linux下安装vncserver

1.在线下载:wget http://www.realvnc.com/dist/vnc-4.0-x86_linux.tar.gz
2.解压缩:tar -zxvf vnc-4.0-x86_linux.tar.gz 
可以看README里内容来安装
3。进入vnc目录下安装:./vncinstall /usr/local/bin
4。mkdir -p /usr/local/vnc/classes
   cp java/* /usr/local/vnc/classes
5。启动vncserver ......

深度挖掘Linux操作系统命令“man”

man是manual(手册)的缩写
man可以在不同的版本中使用,主要分为两类。Red Hat和许多其他基于RPM的版本使用传统的man程序,而基于Debian的版本使用一个名为man-db的软件包。
man(1)
在文本窗口中浏览文件的方式在普遍使用HTML和PDF的时代中似乎有些过时了,但在终端窗口中阅读文件仍有其优势。对于那些Linux开发者来 ......

Linux 获取系统时间

1.时间表示
在程序当中,我们经常要输出系统当前的时间,比如我们使用date命令的输出结果。这个时候我们可以使用下面两个函数
time_t time(time_t *tloc);                    //时间精度为秒
char *ctime(const time_ ......

第一个嵌入式Linux的驱动程序

   从这个总结正式开始了我的驱动之旅,心情不免有点激动,尽管现在对驱动的编写还很模糊,但还是有纪念意义的……
 
开发平台:
    虚拟机下RedHat9,内核2.4.20.8
    交叉编译编译器:天嵌公司提供的arm-linux-gcc 4.3.3
    内核树:/h ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号