RopenYuan 2007-12-10
目录
一、概述... 3
二、用户空间ioctl控制函数调用形式... 3
三、内核主要函数调用框架... 3
四、IOCTL框架源代码分析... 4
4.1、入口函数:sys_ioctl4
4.2、入口函数跳转... 5
4.3、sock_ioctl函数... 6
4.4、二次跳转... 6
4.5、struct proto_ops结构实例... 9
4.6、inet_ioctl函数... 10
4.7、网络主要结构相关字段相互引用图... 13
五、调用实践... 15
1.编写运行于用户空间的控制程序... 15
2.内核功能支持... 16
2.1、修改内核相关代码:16
2.2、编译内核... 16
3.运行控制程序... 17
4.查看结果... 17
六、结束语... 17
七、参考资料... 17
一、概述
从ioctl 这个名称上看,它是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等, 但实际上ioctl所处理的对象并不限制是真正的I/O设备,还可以是其它任何一个内核设备.ioctl以系统调用的形式提供了一条用户与内核交互的便捷途径。当前一些宽带计费网关、防火墙系统均利用Ioctl与内核良好的通信互动特点支持用户对基于内核模块的软件系统的控制.本文针对i386平台下的 ioctl内核网络源代码控制框架进行剖析解释,在文章最后列举一个实例,通过编程实践展示如何通过ioctl控制函数实现自定义的功能的控制,使读者可以对ioctl实现原理有一个全面的认识,本文只对ioctl实现流程框架做一定的叙述,并不会深入到具体的控制函数。为了更好的阅读本文,要求读者对 Linux 下的网络编程有一定的了解。
本文约定:
1、以下内容如果没有特殊说明,均参照linux内核2.4.0版本
2、“->”箭头符表示函数调用关系,如sys_socket->sock_map_fd表示sys_socket函数调用的sock_map_fd函数。
3、第五节的实践是在RedHat9上实现,基于2.4.20内核,但本文所述在2.4内核下都适用。
二、用户空间ioctl控制函数调用形式
通过man 2 ioctl命令查看ioctl函数的调用形式类似如下:
#include <sys/ioctl.h>
int ioctl(int d, int request, ...);
其中d就是用户程序打开设备时使用open函数返回的文件描述符,request就是用户程序对设备的控制命令,至于后面的省略号,则是一些补充参数,一般最多一个,有或没有是和request的意义相关的,详情请参考man 2 ioctl_list以了解更多。ioctl函数是文件结构中的一个属性分量,就是说如果驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数控制设备的I/O通道或其它一些自己想要控制且设备支持的功能。
三、内核主要函数调用框架
内核实现ioctl()函数的是sys_ioctl(),在内核中主要调用框架图如下,它清晰地给我们展示ioctl的控制传递框架,我们接下来的内容将根据此图向大家做详细的解释: