欢迎来到天天文库
浏览记录
ID:52223895
大小:35.82 KB
页数:30页
时间:2020-03-25
《Linux操作系统内核和设备文件对话.docx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Linux操作系统内核和设备文件对话设备文件是用来代表物理设备的。多数物理设备是用来进行输出或输入的,所以必须由某种机制使得内核中的设备驱动从进程中得到输出送给设备。这可以通过打开输出设备文件并且写入做到,就想写入一个普通文件。在下面的例子里,这由device_write实现。 这不是总能奏效的。设想你与一个连向modem的串口(技是你有一个内猫,从CPU看来它也是作为一个串口实现,所以你不需要认为这个设想太困难)。最自然要做的事情就是使用设备文件把内容写到modem上(无论用modem命令还是电话线)或者从modem读信息(同样可以从modem命令回答或者通过电话线)。但是这留下的问题
2、是当你需要和串口本身对话的时候需要怎样做?比如发送数据发送和接收的速率。 回答是Unix使用一个叫做ioctl(inputoutputcontrol的简写)的特殊函数。每个设备都有自己的ioctl命令,这个命令可以是ioctl读的,也可以是写的,也可以是两者都是或都不是。Ioctl函数由三个参数调用:适当设备的描述子,ioctl数,和一个长整型参数,可以赋予一个角色用来传递任何东西。 Ioctl数对设备主码、ioctl类型、编码、和参数的类型进行编码。Ioctl数通常在头文件由一个宏调用(_IO,_IOR,_IOW或_IOWR——决定于类型)。这个头文件必须包含在使用ioctl(所以它
3、们可以产生正确的ioctl's)程序和内核模块(所以它可以理解)中。在下面的例子里,这个头文件是chardev.h,使用它的程序是ioctl.c。 如果你希望在你自己的内核模块中使用ioctl's,最好去接受一分正式的ioctl职位,这样你就可以得到别人的ioctl's,或者他们得到你,你就可以知道哪里出了错误。如果想得到更多的信息,到'documentation/ioctl-number.txt'中查看内核源文件树。 exchardev.c/*chardev.c**Createaninput/outputcharacterdevice*//*Copyright(C)1998-99by
4、OriPomerantz*//*Thenecessaryheaderfiles*//*Standardinkernelmodules*/#include/*Weredoingkernelwork*/#include/*Specifically,amodule*//*DealwithCONFIG_MODVERSIONS*/#ifCONFIG_MODVERSIONS==1#defineMODVERSIONS#include#endif/*Forcharacterdevices*//*Thecharacterdevicedefinitionsarehere*/#include/*Awrapper
5、whichdoesnexttonothingat*atpresent,butmayhelpforcompatibility*withfutureversionsofLinux*/#include/*Ourownioctlnumbers*/#include"chardev.h"/*In2.2.3/usr/include/linux/version.hincludesa*macroforthis,but2.0.35doesnt-soIaddit*hereifnecessary.*/#ifndefKERNEL_VERSION#defineKERNEL_VERSION(a,b,c)((a)*655
6、36+(b)*256+(c))#endif#ifLINUX_VERSION_CODE>=KERNEL_VERSION(2,2,0)#include/*forget_userandput_user*/#endif#defineSUCCESS0/*DeviceDeclarations*********************************//*Thenameforourdevice,asitwillappearin*/proc/devices*/#defineDEVICE_NAME"char_dev"/*Themaximumlengthofthemessageforthedevice
7、*/#defineBUF_LEN80/*Isthedeviceopenrightnow?Usedtoprevent*concurentaccessintothesamedevice*/staticintDevice_Open=0;/*Themessagethedevicewillgivewhenasked*/staticcharMessage[BUF_LEN];/*Howfardidtheprocessreadingth
此文档下载收益归作者所有